@flamingo-stack/openframe-frontend-core 0.0.210-snapshot.20260528032637 → 0.0.210

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 (72) hide show
  1. package/dist/{chunk-P5EE2VJX.cjs → chunk-6RZYJICV.cjs} +1 -1
  2. package/dist/chunk-6RZYJICV.cjs.map +1 -0
  3. package/dist/{chunk-ZG2YY5E7.js → chunk-7L4DWM7P.js} +1 -1
  4. package/dist/chunk-7L4DWM7P.js.map +1 -0
  5. package/dist/{chunk-QKFBZLIR.js → chunk-ATEUJQKU.js} +2 -2
  6. package/dist/{chunk-VTUIMMHO.cjs → chunk-MDTIOPVS.cjs} +24 -24
  7. package/dist/{chunk-VTUIMMHO.cjs.map → chunk-MDTIOPVS.cjs.map} +1 -1
  8. package/dist/{chunk-3E5ANY55.js → chunk-R5RNRH62.js} +5 -14
  9. package/dist/chunk-R5RNRH62.js.map +1 -0
  10. package/dist/{chunk-WI76ZUBE.cjs → chunk-TWKPYZNQ.cjs} +17 -26
  11. package/dist/chunk-TWKPYZNQ.cjs.map +1 -0
  12. package/dist/{chunk-ZFBLC5GV.cjs → chunk-VBFOCTMD.cjs} +17 -17
  13. package/dist/{chunk-ZFBLC5GV.cjs.map → chunk-VBFOCTMD.cjs.map} +1 -1
  14. package/dist/{chunk-5BNWGK6D.js → chunk-WJBPLMBX.js} +2 -2
  15. package/dist/components/chat/hooks/use-chat-identity.d.ts +3 -3
  16. package/dist/components/chat/hooks/use-chat-identity.d.ts.map +1 -1
  17. package/dist/components/chat/index.cjs +3 -3
  18. package/dist/components/chat/index.js +2 -2
  19. package/dist/components/contact/index.cjs +4 -4
  20. package/dist/components/contact/index.js +3 -3
  21. package/dist/components/features/index.cjs +3 -3
  22. package/dist/components/features/index.js +2 -2
  23. package/dist/components/footer-waitlist-button.d.ts +2 -21
  24. package/dist/components/footer-waitlist-button.d.ts.map +1 -1
  25. package/dist/components/index.cjs +91 -87
  26. package/dist/components/index.cjs.map +1 -1
  27. package/dist/components/index.js +16 -12
  28. package/dist/components/index.js.map +1 -1
  29. package/dist/components/navigation/index.cjs +3 -3
  30. package/dist/components/navigation/index.js +2 -2
  31. package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
  32. package/dist/components/tickets/help-center-card.d.ts.map +1 -1
  33. package/dist/components/tickets/index.cjs +98 -139
  34. package/dist/components/tickets/index.cjs.map +1 -1
  35. package/dist/components/tickets/index.js +54 -95
  36. package/dist/components/tickets/index.js.map +1 -1
  37. package/dist/components/tickets/ticket-row.d.ts.map +1 -1
  38. package/dist/components/ui/index.cjs +3 -3
  39. package/dist/components/ui/index.js +2 -2
  40. package/dist/contexts/chat-runtime-context.d.ts +3 -6
  41. package/dist/contexts/chat-runtime-context.d.ts.map +1 -1
  42. package/dist/contexts/index.cjs +2 -2
  43. package/dist/contexts/index.js +1 -1
  44. package/dist/index.cjs +3 -5
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.js +2 -4
  47. package/dist/utils/index.cjs +0 -10
  48. package/dist/utils/index.cjs.map +1 -1
  49. package/dist/utils/index.d.ts +0 -1
  50. package/dist/utils/index.d.ts.map +1 -1
  51. package/dist/utils/index.js +1 -10
  52. package/dist/utils/index.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/components/chat/hooks/use-chat-identity.ts +7 -8
  55. package/src/components/footer-waitlist-button.tsx +16 -33
  56. package/src/components/navigation/sticky-section-nav.tsx +4 -6
  57. package/src/components/tickets/help-center-card.tsx +1 -55
  58. package/src/components/tickets/help-center-list.tsx +1 -9
  59. package/src/components/tickets/ticket-detail-drawer.tsx +4 -19
  60. package/src/components/tickets/ticket-row.tsx +19 -30
  61. package/src/contexts/chat-runtime-context.tsx +3 -6
  62. package/src/stories/EmbeddableChat.stories.tsx +1 -1
  63. package/src/utils/index.ts +0 -12
  64. package/dist/chunk-3E5ANY55.js.map +0 -1
  65. package/dist/chunk-P5EE2VJX.cjs.map +0 -1
  66. package/dist/chunk-WI76ZUBE.cjs.map +0 -1
  67. package/dist/chunk-ZG2YY5E7.js.map +0 -1
  68. package/dist/utils/scroll-into-view.d.ts +0 -63
  69. package/dist/utils/scroll-into-view.d.ts.map +0 -1
  70. package/src/utils/scroll-into-view.ts +0 -74
  71. /package/dist/{chunk-QKFBZLIR.js.map → chunk-ATEUJQKU.js.map} +0 -0
  72. /package/dist/{chunk-5BNWGK6D.js.map → chunk-WJBPLMBX.js.map} +0 -0
@@ -9,11 +9,11 @@ import {
9
9
  EmptyState,
10
10
  UnifiedPagination,
11
11
  init_unified_pagination
12
- } from "../../chunk-QKFBZLIR.js";
12
+ } from "../../chunk-ATEUJQKU.js";
13
13
  import "../../chunk-4XLJWX2N.js";
14
14
  import {
15
15
  ContactForm
16
- } from "../../chunk-5BNWGK6D.js";
16
+ } from "../../chunk-WJBPLMBX.js";
17
17
  import {
18
18
  AlertDialog,
19
19
  AlertDialogAction,
@@ -33,17 +33,16 @@ import {
33
33
  embedAuthedFetch,
34
34
  formatRelativeTime,
35
35
  getStatusColorScheme,
36
- scrollElementIntoView,
37
36
  useChatAttachments,
38
37
  useChatIdentity
39
- } from "../../chunk-3E5ANY55.js";
38
+ } from "../../chunk-R5RNRH62.js";
40
39
  import {
41
40
  toast
42
41
  } from "../../chunk-UYQOPC57.js";
43
42
  import "../../chunk-CIPO6DXK.js";
44
43
  import "../../chunk-EDW2NVRV.js";
45
44
  import "../../chunk-W72U7OU7.js";
46
- import "../../chunk-ZG2YY5E7.js";
45
+ import "../../chunk-7L4DWM7P.js";
47
46
  import "../../chunk-MJNXIEV2.js";
48
47
  import "../../chunk-EL5YVPD5.js";
49
48
  import {
@@ -64,7 +63,7 @@ import "../../chunk-OHPI2HRK.js";
64
63
  import "../../chunk-GGWZFCYS.js";
65
64
 
66
65
  // src/components/tickets/ticket-center.tsx
67
- import { useCallback as useCallback3, useState as useState4 } from "react";
66
+ import { useCallback as useCallback2, useState as useState4 } from "react";
68
67
  import { useQueryClient as useQueryClient2 } from "@tanstack/react-query";
69
68
  init_button();
70
69
  import { RefreshCw } from "lucide-react";
@@ -213,7 +212,7 @@ function TicketOpenForm({
213
212
  }
214
213
 
215
214
  // src/components/tickets/ticket-row.tsx
216
- import { useCallback, useRef } from "react";
215
+ import { useEffect, useRef } from "react";
217
216
 
218
217
  // src/components/collapsible.tsx
219
218
  import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
@@ -406,7 +405,7 @@ function TicketTimelinePanel({ ticket }) {
406
405
  ConversationCardRow,
407
406
  {
408
407
  author,
409
- role: "Reply",
408
+ role: isCustomer ? "Reply" : "Note",
410
409
  avatarSrc,
411
410
  timestamp: eng.createdAt,
412
411
  body: stripAttachmentsPreamble(eng.body ?? ""),
@@ -606,22 +605,14 @@ function TicketRow({
606
605
  }) {
607
606
  const optimistic = isOptimistic(ticket);
608
607
  const rowRef = useRef(null);
609
- const handleClick = useCallback(() => {
610
- onToggle(ticket.id);
611
- scrollElementIntoView(rowRef.current, {
612
- adjustTargetY: (raw) => {
613
- if (!rowRef.current) return raw;
614
- const expandedDrawer = document.querySelector(
615
- 'div[id^="ticket-drawer-"]'
616
- );
617
- if (!(expandedDrawer instanceof HTMLElement)) return raw;
618
- const drawerRect = expandedDrawer.getBoundingClientRect();
619
- const myRect = rowRef.current.getBoundingClientRect();
620
- if (drawerRect.bottom > myRect.top) return raw;
621
- return raw - drawerRect.height;
622
- }
608
+ useEffect(() => {
609
+ if (!expanded || optimistic) return;
610
+ requestAnimationFrame(() => {
611
+ requestAnimationFrame(() => {
612
+ rowRef.current?.scrollIntoView({ behavior: "smooth", block: "start" });
613
+ });
623
614
  });
624
- }, [onToggle, ticket.id]);
615
+ }, [expanded, optimistic]);
625
616
  const tileData = {
626
617
  id: ticket.id,
627
618
  title: ticket.subject ?? "(untitled)",
@@ -642,7 +633,7 @@ function TicketRow({
642
633
  // when the task exists but its status hasn't synced yet.
643
634
  linkedTaskLabel: ticket.clickup ? ticket.clickup.status ? ticket.clickup.status.replace(/\b\w/g, (c) => c.toUpperCase()) : "Linked work" : void 0
644
635
  };
645
- return /* @__PURE__ */ jsx4("div", { ref: rowRef, className: "scroll-mt-24", children: /* @__PURE__ */ jsxs3(
636
+ return /* @__PURE__ */ jsx4("div", { ref: rowRef, className: "scroll-mt-4", children: /* @__PURE__ */ jsxs3(
646
637
  Collapsible,
647
638
  {
648
639
  open: expanded && !optimistic,
@@ -652,7 +643,7 @@ function TicketRow({
652
643
  ChatTicketItem,
653
644
  {
654
645
  ticket: tileData,
655
- onClick: optimistic ? void 0 : handleClick,
646
+ onClick: optimistic ? void 0 : onToggle,
656
647
  "aria-expanded": expanded && !optimistic,
657
648
  "aria-controls": `ticket-drawer-${ticket.id}`
658
649
  }
@@ -767,7 +758,7 @@ function useTicketsList(filters) {
767
758
  }
768
759
 
769
760
  // src/components/tickets/hooks/use-ticket-actions.ts
770
- import { useCallback as useCallback2, useEffect, useMemo, useRef as useRef2, useState as useState3 } from "react";
761
+ import { useCallback, useEffect as useEffect2, useMemo, useRef as useRef2, useState as useState3 } from "react";
771
762
  import { useQueryClient } from "@tanstack/react-query";
772
763
  var TICKET_ACTION_ENDPOINT = "/api/chat/agent/ticket-action";
773
764
  var MIRROR_SYNC_BACKOFF_MS = [3e3, 6e3, 12e3];
@@ -778,14 +769,14 @@ function useTicketActions(options) {
778
769
  const [isSubmittingForm, setIsSubmittingForm] = useState3(false);
779
770
  const busyRowsRef = useRef2(/* @__PURE__ */ new Set());
780
771
  const [busyRows, setBusyRows] = useState3(() => /* @__PURE__ */ new Set());
781
- const setRowBusy = useCallback2((id, busy) => {
772
+ const setRowBusy = useCallback((id, busy) => {
782
773
  if (busy) busyRowsRef.current.add(id);
783
774
  else busyRowsRef.current.delete(id);
784
775
  setBusyRows(new Set(busyRowsRef.current));
785
776
  }, []);
786
- const isRowBusy = useCallback2((id) => busyRows.has(id), [busyRows]);
777
+ const isRowBusy = useCallback((id) => busyRows.has(id), [busyRows]);
787
778
  const watcherControllersRef = useRef2(/* @__PURE__ */ new Map());
788
- useEffect(() => {
779
+ useEffect2(() => {
789
780
  return () => {
790
781
  for (const controller of watcherControllersRef.current.values()) {
791
782
  controller.abort();
@@ -794,12 +785,12 @@ function useTicketActions(options) {
794
785
  };
795
786
  }, []);
796
787
  const queueRef = useRef2(Promise.resolve());
797
- const enqueue = useCallback2((work) => {
788
+ const enqueue = useCallback((work) => {
798
789
  const next = queueRef.current.then(work, work);
799
790
  queueRef.current = next.catch(() => void 0);
800
791
  return next;
801
792
  }, []);
802
- const executeTicketAction = useCallback2(
793
+ const executeTicketAction = useCallback(
803
794
  async (toolName, args) => {
804
795
  const res = await embedAuthedFetch(TICKET_ACTION_ENDPOINT, {
805
796
  method: "POST",
@@ -815,7 +806,7 @@ function useTicketActions(options) {
815
806
  },
816
807
  []
817
808
  );
818
- const watchMirrorSync = useCallback2(
809
+ const watchMirrorSync = useCallback(
819
810
  (placeholderId, expectedTicketId) => {
820
811
  const prior = watcherControllersRef.current.get(placeholderId);
821
812
  if (prior) prior.abort();
@@ -861,7 +852,7 @@ function useTicketActions(options) {
861
852
  },
862
853
  [queryClient, removeOptimistic, toast2]
863
854
  );
864
- const surfaceError = useCallback2(
855
+ const surfaceError = useCallback(
865
856
  (err, action) => {
866
857
  const mapped = mapTicketActionError(err);
867
858
  if (mapped.supportSystemDown) onSupportSystemDown();
@@ -874,7 +865,7 @@ function useTicketActions(options) {
874
865
  },
875
866
  [toast2, onSupportSystemDown]
876
867
  );
877
- const submitTicket = useCallback2(
868
+ const submitTicket = useCallback(
878
869
  async (input) => {
879
870
  if (formInFlightRef.current) return false;
880
871
  formInFlightRef.current = true;
@@ -939,7 +930,7 @@ function useTicketActions(options) {
939
930
  surfaceError
940
931
  ]
941
932
  );
942
- const updateTicket = useCallback2(
933
+ const updateTicket = useCallback(
943
934
  async (ticket, serverArgs, successCopy, action) => {
944
935
  if (busyRowsRef.current.has(ticket.id)) return false;
945
936
  setRowBusy(ticket.id, true);
@@ -972,7 +963,7 @@ function useTicketActions(options) {
972
963
  // and cascade-recreate addNote/closeTicket/etc.
973
964
  [setRowBusy, enqueue, executeTicketAction, queryClient, toast2, surfaceError, removeTicketFromCache]
974
965
  );
975
- const sendMessage = useCallback2(
966
+ const sendMessage = useCallback(
976
967
  (ticket, text, attachments) => {
977
968
  const trimmed = text.trim();
978
969
  const hasText = trimmed.length > 0;
@@ -990,7 +981,7 @@ function useTicketActions(options) {
990
981
  },
991
982
  [updateTicket]
992
983
  );
993
- const closeTicket = useCallback2(
984
+ const closeTicket = useCallback(
994
985
  (ticket, resolution) => updateTicket(
995
986
  ticket,
996
987
  {
@@ -1002,7 +993,7 @@ function useTicketActions(options) {
1002
993
  ),
1003
994
  [updateTicket]
1004
995
  );
1005
- const reopenTicket = useCallback2(
996
+ const reopenTicket = useCallback(
1006
997
  (ticket) => updateTicket(ticket, { status: "OPEN" }, TOAST_COPY.reopen_success, "reopen ticket"),
1007
998
  [updateTicket]
1008
999
  );
@@ -1149,14 +1140,14 @@ function TicketCenterAuthed({
1149
1140
  const [optimisticTickets, setOptimisticTickets] = useState4([]);
1150
1141
  const [expandedTicketId, setExpandedTicketId] = useState4(null);
1151
1142
  const [supportSystemDown, setSupportSystemDown] = useState4(false);
1152
- const prependOptimistic = useCallback3((placeholder) => {
1143
+ const prependOptimistic = useCallback2((placeholder) => {
1153
1144
  setOptimisticTickets((prev) => [placeholder, ...prev]);
1154
1145
  }, []);
1155
- const removeOptimistic = useCallback3((placeholderId) => {
1146
+ const removeOptimistic = useCallback2((placeholderId) => {
1156
1147
  setOptimisticTickets((prev) => prev.filter((t) => t.id !== placeholderId));
1157
1148
  setExpandedTicketId((prev) => prev === placeholderId ? null : prev);
1158
1149
  }, []);
1159
- const removeTicketFromCache = useCallback3(
1150
+ const removeTicketFromCache = useCallback2(
1160
1151
  (ticketId) => {
1161
1152
  queryClient.setQueriesData(
1162
1153
  { queryKey: ["tickets"] },
@@ -1173,7 +1164,7 @@ function TicketCenterAuthed({
1173
1164
  toast: toast2,
1174
1165
  onSupportSystemDown: () => setSupportSystemDown(true)
1175
1166
  });
1176
- const toggleRow = useCallback3((id) => {
1167
+ const toggleRow = useCallback2((id) => {
1177
1168
  setExpandedTicketId((prev) => prev === id ? null : id);
1178
1169
  }, []);
1179
1170
  const merged = [...optimisticTickets, ...tickets];
@@ -1256,14 +1247,12 @@ function TicketListSkeleton() {
1256
1247
  }
1257
1248
 
1258
1249
  // src/components/tickets/help-center-list.tsx
1259
- import { useCallback as useCallback5, useState as useState6 } from "react";
1250
+ import { useCallback as useCallback3, useState as useState6 } from "react";
1260
1251
  import { useQueryClient as useQueryClient3 } from "@tanstack/react-query";
1261
1252
  init_unified_pagination();
1262
1253
 
1263
1254
  // src/components/tickets/help-center-card.tsx
1264
- import { useCallback as useCallback4, useRef as useRef3 } from "react";
1265
1255
  import { Fragment, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1266
- var STICKY_HEADER_OFFSET_PX = 96;
1267
1256
  function HelpCenterCard({
1268
1257
  ticket,
1269
1258
  expanded,
@@ -1284,24 +1273,6 @@ function HelpCenterCard({
1284
1273
  const description = ticket.preview ?? ticket.body ?? "";
1285
1274
  const isExpandable = !optimistic;
1286
1275
  const isExpanded = expanded && isExpandable;
1287
- const rowRef = useRef3(null);
1288
- const handleClick = useCallback4(() => {
1289
- onToggle(ticket.id);
1290
- scrollElementIntoView(rowRef.current, {
1291
- headerOffset: STICKY_HEADER_OFFSET_PX,
1292
- adjustTargetY: (raw) => {
1293
- if (!rowRef.current) return raw;
1294
- const expandedDrawer = document.querySelector(
1295
- 'div[id^="help-center-drawer-"]'
1296
- );
1297
- if (!(expandedDrawer instanceof HTMLElement)) return raw;
1298
- const drawerRect = expandedDrawer.getBoundingClientRect();
1299
- const myRect = rowRef.current.getBoundingClientRect();
1300
- if (drawerRect.bottom > myRect.top) return raw;
1301
- return raw - drawerRect.height;
1302
- }
1303
- });
1304
- }, [onToggle, ticket.id]);
1305
1276
  const rightBadges = /* @__PURE__ */ jsxs5(Fragment, { children: [
1306
1277
  /* @__PURE__ */ jsx6(
1307
1278
  StatusBadge,
@@ -1325,8 +1296,6 @@ function HelpCenterCard({
1325
1296
  return /* @__PURE__ */ jsxs5(
1326
1297
  "div",
1327
1298
  {
1328
- ref: rowRef,
1329
- style: { scrollMarginTop: STICKY_HEADER_OFFSET_PX },
1330
1299
  className: `border-b border-ods-border last:border-b-0 ${optimistic ? "opacity-60" : ""}`,
1331
1300
  "aria-busy": optimistic || void 0,
1332
1301
  children: [
@@ -1334,7 +1303,7 @@ function HelpCenterCard({
1334
1303
  "button",
1335
1304
  {
1336
1305
  type: "button",
1337
- onClick: isExpandable ? handleClick : void 0,
1306
+ onClick: isExpandable ? () => onToggle(ticket.id) : void 0,
1338
1307
  disabled: !isExpandable,
1339
1308
  "aria-expanded": isExpandable ? isExpanded : void 0,
1340
1309
  "aria-controls": isExpanded ? `help-center-drawer-${ticket.id}` : void 0,
@@ -1549,14 +1518,14 @@ function HelpCenterListAuthed({
1549
1518
  const [optimisticTickets, setOptimisticTickets] = useState6([]);
1550
1519
  const [expandedTicketId, setExpandedTicketId] = useState6(null);
1551
1520
  const [supportSystemDown, setSupportSystemDown] = useState6(false);
1552
- const prependOptimistic = useCallback5((placeholder) => {
1521
+ const prependOptimistic = useCallback3((placeholder) => {
1553
1522
  setOptimisticTickets((prev) => [placeholder, ...prev]);
1554
1523
  }, []);
1555
- const removeOptimistic = useCallback5((placeholderId) => {
1524
+ const removeOptimistic = useCallback3((placeholderId) => {
1556
1525
  setOptimisticTickets((prev) => prev.filter((t) => t.id !== placeholderId));
1557
1526
  setExpandedTicketId((prev) => prev === placeholderId ? null : prev);
1558
1527
  }, []);
1559
- const removeTicketFromCache = useCallback5(
1528
+ const removeTicketFromCache = useCallback3(
1560
1529
  (ticketId) => {
1561
1530
  queryClient.setQueriesData(
1562
1531
  { queryKey: ["tickets"] },
@@ -1573,7 +1542,7 @@ function HelpCenterListAuthed({
1573
1542
  toast: toast2,
1574
1543
  onSupportSystemDown: () => setSupportSystemDown(true)
1575
1544
  });
1576
- const toggleRow = useCallback5((id) => {
1545
+ const toggleRow = useCallback3((id) => {
1577
1546
  setExpandedTicketId((prev) => prev === id ? null : id);
1578
1547
  }, []);
1579
1548
  const merged = [...optimisticTickets, ...tickets];
@@ -1626,31 +1595,21 @@ function HelpCenterListAuthed({
1626
1595
  description: "Open one above to start the conversation with the support team.",
1627
1596
  showCTA: false
1628
1597
  }
1629
- ) : (
1630
- // `overflow-clip` (NOT `overflow-hidden`) — both visually
1631
- // clip the rounded corners, but `hidden` makes the element
1632
- // a "scroll container" per CSSOM spec, which causes
1633
- // `scrollIntoView` calls inside (`<HelpCenterCard>` click
1634
- // handlers) to try scrolling THIS div (can't, overflow
1635
- // hidden) instead of bubbling up to the window. `clip`
1636
- // keeps the visual clip but NOT the scroll-container
1637
- // status, so click-to-scroll actually moves the page.
1638
- /* @__PURE__ */ jsx8("div", { className: "bg-ods-card border border-ods-border rounded-[6px] overflow-clip w-full", children: merged.map((ticket) => /* @__PURE__ */ jsx8(
1639
- HelpCenterCard,
1640
- {
1641
- ticket,
1642
- expanded: expandedTicketId === ticket.id,
1643
- onToggle: toggleRow,
1644
- busy: isOptimistic(ticket) ? false : actions.isRowBusy(ticket.id),
1645
- supportSystemDown,
1646
- onSendMessage: actions.sendMessage,
1647
- onClose: actions.closeTicket,
1648
- onReopen: actions.reopenTicket,
1649
- onActionCollapsed: () => setExpandedTicketId(null)
1650
- },
1651
- ticket.id
1652
- )) })
1653
- ) }),
1598
+ ) : /* @__PURE__ */ jsx8("div", { className: "bg-ods-card border border-ods-border rounded-[6px] overflow-hidden w-full", children: merged.map((ticket) => /* @__PURE__ */ jsx8(
1599
+ HelpCenterCard,
1600
+ {
1601
+ ticket,
1602
+ expanded: expandedTicketId === ticket.id,
1603
+ onToggle: toggleRow,
1604
+ busy: isOptimistic(ticket) ? false : actions.isRowBusy(ticket.id),
1605
+ supportSystemDown,
1606
+ onSendMessage: actions.sendMessage,
1607
+ onClose: actions.closeTicket,
1608
+ onReopen: actions.reopenTicket,
1609
+ onActionCollapsed: () => setExpandedTicketId(null)
1610
+ },
1611
+ ticket.id
1612
+ )) }) }),
1654
1613
  !error && totalPages > 1 && /* @__PURE__ */ jsx8(UnifiedPagination, { currentPage: page, totalPages })
1655
1614
  ] });
1656
1615
  return /* @__PURE__ */ jsx8(DevSectionPage, { sectionKey: "tickets", preControls: form, children: body });