@flamingo-stack/openframe-frontend-core 0.0.509 → 0.0.510

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 (93) hide show
  1. package/dist/{chunk-KXZO2WZX.js → chunk-2AASLY6D.js} +2 -2
  2. package/dist/{chunk-UQDMJ6DH.cjs → chunk-2RLI5XVI.cjs} +13 -13
  3. package/dist/{chunk-UQDMJ6DH.cjs.map → chunk-2RLI5XVI.cjs.map} +1 -1
  4. package/dist/{chunk-YQEPRYT5.cjs → chunk-53JKCFFE.cjs} +7 -7
  5. package/dist/{chunk-YQEPRYT5.cjs.map → chunk-53JKCFFE.cjs.map} +1 -1
  6. package/dist/{chunk-K5MSCMDK.cjs → chunk-5AZZQQYS.cjs} +37 -37
  7. package/dist/{chunk-K5MSCMDK.cjs.map → chunk-5AZZQQYS.cjs.map} +1 -1
  8. package/dist/{chunk-C7OY3PQP.cjs → chunk-5CDPRCPS.cjs} +11 -11
  9. package/dist/{chunk-C7OY3PQP.cjs.map → chunk-5CDPRCPS.cjs.map} +1 -1
  10. package/dist/{chunk-DYPYR7FR.cjs → chunk-6TL5XIAW.cjs} +87 -87
  11. package/dist/{chunk-DYPYR7FR.cjs.map → chunk-6TL5XIAW.cjs.map} +1 -1
  12. package/dist/{chunk-7WZHBQ4J.js → chunk-CTMLY2GN.js} +2 -2
  13. package/dist/{chunk-XGIFOHKE.js → chunk-DBR5JLX3.js} +2 -2
  14. package/dist/{chunk-QJJISLPA.cjs → chunk-EJ3EBYNV.cjs} +26 -26
  15. package/dist/{chunk-QJJISLPA.cjs.map → chunk-EJ3EBYNV.cjs.map} +1 -1
  16. package/dist/{chunk-AEELJC4N.js → chunk-FEGEC6FY.js} +165 -158
  17. package/dist/{chunk-AEELJC4N.js.map → chunk-FEGEC6FY.js.map} +1 -1
  18. package/dist/{chunk-I2B6X77L.js → chunk-HCZJZMU7.js} +2 -2
  19. package/dist/{chunk-3QSR22IC.js → chunk-HX4CJYXL.js} +6 -6
  20. package/dist/{chunk-BT2WWDFP.cjs → chunk-J2JUAS4C.cjs} +5 -5
  21. package/dist/{chunk-BT2WWDFP.cjs.map → chunk-J2JUAS4C.cjs.map} +1 -1
  22. package/dist/{chunk-LBAKLT6T.cjs → chunk-JMBIGH4H.cjs} +61 -61
  23. package/dist/{chunk-LBAKLT6T.cjs.map → chunk-JMBIGH4H.cjs.map} +1 -1
  24. package/dist/{chunk-PO5O654H.js → chunk-JOCFPAS6.js} +4 -4
  25. package/dist/{chunk-DC2TKS7C.js → chunk-LBOWSKGM.js} +2 -2
  26. package/dist/{chunk-V3ZAAFE3.js → chunk-MLGGF24T.js} +5 -5
  27. package/dist/{chunk-4G5TLHJD.cjs → chunk-RB2EW6IZ.cjs} +544 -537
  28. package/dist/chunk-RB2EW6IZ.cjs.map +1 -0
  29. package/dist/{chunk-M37PBG4N.cjs → chunk-RHQ7BJKK.cjs} +31 -31
  30. package/dist/{chunk-M37PBG4N.cjs.map → chunk-RHQ7BJKK.cjs.map} +1 -1
  31. package/dist/{chunk-CIOLOQKQ.cjs → chunk-RJ3D3PE2.cjs} +4 -4
  32. package/dist/{chunk-CIOLOQKQ.cjs.map → chunk-RJ3D3PE2.cjs.map} +1 -1
  33. package/dist/{chunk-K6QTZ7CZ.js → chunk-SRYV4H3M.js} +2 -2
  34. package/dist/{chunk-72XAID7Y.js → chunk-TBGSQTJK.js} +4 -4
  35. package/dist/{chunk-LFUPI7VX.js → chunk-UWPT23SA.js} +2 -2
  36. package/dist/{chunk-KBN7PMFT.js → chunk-VDJF4ZAU.js} +2 -2
  37. package/dist/{chunk-TWSKTJHW.js → chunk-WNOGR5AA.js} +2 -2
  38. package/dist/{chunk-3CGZPAGR.cjs → chunk-WSAPKKDU.cjs} +3 -3
  39. package/dist/{chunk-3CGZPAGR.cjs.map → chunk-WSAPKKDU.cjs.map} +1 -1
  40. package/dist/{chunk-2T4GTV25.cjs → chunk-XJVRAKEX.cjs} +9 -9
  41. package/dist/{chunk-2T4GTV25.cjs.map → chunk-XJVRAKEX.cjs.map} +1 -1
  42. package/dist/{chunk-T7MCSA55.cjs → chunk-Z35QWWJH.cjs} +26 -26
  43. package/dist/{chunk-T7MCSA55.cjs.map → chunk-Z35QWWJH.cjs.map} +1 -1
  44. package/dist/components/case-studies/index.cjs +8 -8
  45. package/dist/components/case-studies/index.js +2 -2
  46. package/dist/components/chat/index.cjs +2 -2
  47. package/dist/components/chat/index.js +1 -1
  48. package/dist/components/contact/index.cjs +3 -3
  49. package/dist/components/contact/index.js +2 -2
  50. package/dist/components/docs/index.cjs +5 -5
  51. package/dist/components/docs/index.js +4 -4
  52. package/dist/components/embeds/index.cjs +3 -3
  53. package/dist/components/embeds/index.js +2 -2
  54. package/dist/components/faq/index.cjs +3 -3
  55. package/dist/components/faq/index.js +2 -2
  56. package/dist/components/features/index.cjs +2 -2
  57. package/dist/components/features/index.js +1 -1
  58. package/dist/components/help-center-pages/index.cjs +22 -22
  59. package/dist/components/help-center-pages/index.js +13 -13
  60. package/dist/components/index.cjs +132 -132
  61. package/dist/components/index.js +11 -11
  62. package/dist/components/meeting-scheduler/index.cjs +34 -34
  63. package/dist/components/meeting-scheduler/index.js +3 -3
  64. package/dist/components/navigation/header.d.ts.map +1 -1
  65. package/dist/components/navigation/index.cjs +2 -2
  66. package/dist/components/navigation/index.js +1 -1
  67. package/dist/components/onboarding-guides/index.cjs +5 -5
  68. package/dist/components/onboarding-guides/index.js +4 -4
  69. package/dist/components/related-content/index.cjs +3 -3
  70. package/dist/components/related-content/index.js +2 -2
  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 +2 -2
  76. package/dist/index.js +1 -1
  77. package/package.json +1 -1
  78. package/src/components/navigation/header.tsx +21 -16
  79. package/src/stories/TopNavigation.stories.tsx +1 -1
  80. package/dist/chunk-4G5TLHJD.cjs.map +0 -1
  81. /package/dist/{chunk-KXZO2WZX.js.map → chunk-2AASLY6D.js.map} +0 -0
  82. /package/dist/{chunk-7WZHBQ4J.js.map → chunk-CTMLY2GN.js.map} +0 -0
  83. /package/dist/{chunk-XGIFOHKE.js.map → chunk-DBR5JLX3.js.map} +0 -0
  84. /package/dist/{chunk-I2B6X77L.js.map → chunk-HCZJZMU7.js.map} +0 -0
  85. /package/dist/{chunk-3QSR22IC.js.map → chunk-HX4CJYXL.js.map} +0 -0
  86. /package/dist/{chunk-PO5O654H.js.map → chunk-JOCFPAS6.js.map} +0 -0
  87. /package/dist/{chunk-DC2TKS7C.js.map → chunk-LBOWSKGM.js.map} +0 -0
  88. /package/dist/{chunk-V3ZAAFE3.js.map → chunk-MLGGF24T.js.map} +0 -0
  89. /package/dist/{chunk-K6QTZ7CZ.js.map → chunk-SRYV4H3M.js.map} +0 -0
  90. /package/dist/{chunk-72XAID7Y.js.map → chunk-TBGSQTJK.js.map} +0 -0
  91. /package/dist/{chunk-LFUPI7VX.js.map → chunk-UWPT23SA.js.map} +0 -0
  92. /package/dist/{chunk-KBN7PMFT.js.map → chunk-VDJF4ZAU.js.map} +0 -0
  93. /package/dist/{chunk-TWSKTJHW.js.map → chunk-WNOGR5AA.js.map} +0 -0
@@ -39654,11 +39654,131 @@ function MingoAiButton({ source, icon, label = "Mingo AI", className, onClick, .
39654
39654
  );
39655
39655
  }
39656
39656
 
39657
+ // src/components/navigation/mobile-nav-panel.tsx
39658
+ import { useRef as useRef47 } from "react";
39659
+ import { usePreventScroll as usePreventScroll3 } from "@react-aria/overlays";
39660
+ init_button2();
39661
+ import { X as X10 } from "lucide-react";
39662
+ import { Fragment as Fragment56, jsx as jsx287, jsxs as jsxs224 } from "react/jsx-runtime";
39663
+ var MOBILE_NAV_PANEL_ID = "mobile-nav-panel";
39664
+ function MobileNavPanel({ isOpen, config }) {
39665
+ const panelRef = useRef47(null);
39666
+ usePreventScroll3({ isDisabled: !isOpen });
39667
+ useFocusTrap(panelRef, isOpen, { onEscape: config.onClose });
39668
+ const headerHeight = useHeaderHeight(64, { enabled: isOpen });
39669
+ if (!isOpen) return null;
39670
+ const renderNavigationItem = (item) => {
39671
+ if (item.element) {
39672
+ return /* @__PURE__ */ jsx287("div", { children: item.element }, item.id);
39673
+ }
39674
+ const handleClick = () => {
39675
+ if (item.onClick) {
39676
+ item.onClick();
39677
+ }
39678
+ config.onClose?.();
39679
+ };
39680
+ if (item.href) {
39681
+ return /* @__PURE__ */ jsx287(
39682
+ Button,
39683
+ {
39684
+ variant: "outline",
39685
+ size: "small-legacy",
39686
+ href: item.href,
39687
+ onClick: handleClick,
39688
+ leftIcon: item.icon,
39689
+ rightIcon: item.badge,
39690
+ className: cn(
39691
+ "justify-start h-12 px-4 bg-transparent border-none text-ods-text-primary hover:bg-ods-bg-hover gap-3 rounded-md transition-colors",
39692
+ item.isActive ? "bg-ods-bg-hover" : ""
39693
+ ),
39694
+ children: item.label
39695
+ },
39696
+ item.id
39697
+ );
39698
+ }
39699
+ return /* @__PURE__ */ jsxs224(
39700
+ Button,
39701
+ {
39702
+ variant: "outline",
39703
+ size: "small-legacy",
39704
+ onClick: handleClick,
39705
+ leftIcon: item.icon,
39706
+ className: cn(
39707
+ "justify-start h-12 px-4 bg-transparent border-none text-ods-text-primary hover:bg-ods-bg-hover gap-3 rounded-md transition-colors",
39708
+ item.isActive ? "bg-ods-bg-hover" : ""
39709
+ ),
39710
+ children: [
39711
+ /* @__PURE__ */ jsx287("span", { className: "flex-1 text-left", children: item.label }),
39712
+ item.badge !== void 0 && /* @__PURE__ */ jsx287("span", { className: "ml-auto", children: item.badge })
39713
+ ]
39714
+ },
39715
+ item.id
39716
+ );
39717
+ };
39718
+ return /* @__PURE__ */ jsxs224(Fragment56, { children: [
39719
+ /* @__PURE__ */ jsx287(
39720
+ "div",
39721
+ {
39722
+ className: cn("fixed inset-0 z-[9998]", OVERLAY_BACKDROP_CLASS),
39723
+ onClick: config.onClose
39724
+ }
39725
+ ),
39726
+ /* @__PURE__ */ jsxs224(
39727
+ "div",
39728
+ {
39729
+ ref: panelRef,
39730
+ id: MOBILE_NAV_PANEL_ID,
39731
+ role: "dialog",
39732
+ "aria-modal": "true",
39733
+ "aria-label": "Navigation menu",
39734
+ tabIndex: -1,
39735
+ style: { "--mobile-nav-top": `${headerHeight + 16}px` },
39736
+ className: cn(
39737
+ "fixed z-[9999] rounded-lg shadow-xl",
39738
+ config.className ? "" : "bg-ods-card border border-ods-border",
39739
+ // Responsive positioning and sizing — LEFT-anchored from md, flush
39740
+ // under the burger cell at the left edge of the unified
39741
+ // top-navigation (a larger inset read as a stray gap between the
39742
+ // burger and its panel).
39743
+ "right-2 left-2 md:right-auto",
39744
+ "md:left-2 md:w-[400px] md:max-w-[calc(100vw-1rem)]",
39745
+ // Small-viewport (svh) sizing anchored below the measured header —
39746
+ // 100vh overflowed under mobile browser chrome, leaving the bottom
39747
+ // entries and footer unreachable while the body was scroll-locked.
39748
+ "top-[var(--mobile-nav-top)]",
39749
+ "max-h-[calc(100svh-var(--mobile-nav-top)-50px)] md:max-h-[calc(100svh-var(--mobile-nav-top)-8px)]",
39750
+ "flex flex-col",
39751
+ config.className || ""
39752
+ ),
39753
+ onClick: (e) => e.stopPropagation(),
39754
+ children: [
39755
+ /* @__PURE__ */ jsx287("div", { className: "flex justify-end p-2 border-b border-ods-border flex-shrink-0", children: /* @__PURE__ */ jsx287(
39756
+ Button,
39757
+ {
39758
+ "aria-label": "Close menu",
39759
+ size: "icon",
39760
+ variant: "transparent",
39761
+ leftIcon: /* @__PURE__ */ jsx287(X10, { className: "w-4 h-4 text-ods-text-primary" }),
39762
+ onClick: config.onClose,
39763
+ className: "hover:bg-ods-bg-hover"
39764
+ }
39765
+ ) }),
39766
+ /* @__PURE__ */ jsx287("div", { className: "flex-1 overflow-y-auto overflow-x-hidden overscroll-contain px-2 py-2", children: /* @__PURE__ */ jsx287("div", { className: "flex flex-col space-y-1", children: config.sections.map((section, index) => /* @__PURE__ */ jsxs224("div", { children: [
39767
+ section.title && /* @__PURE__ */ jsx287("div", { className: "px-4 pt-2 pb-1 text-h6 font-semibold uppercase text-ods-text-secondary", children: section.title }),
39768
+ /* @__PURE__ */ jsx287("div", { className: "flex flex-col gap-1", children: section.items.map(renderNavigationItem) })
39769
+ ] }, index)) }) }),
39770
+ config.footer && /* @__PURE__ */ jsx287("div", { className: "border-t border-ods-border p-4 pb-[max(1rem,env(safe-area-inset-bottom))] flex-shrink-0", children: config.footer })
39771
+ ]
39772
+ }
39773
+ )
39774
+ ] });
39775
+ }
39776
+
39657
39777
  // src/components/navigation/ticket-alerts-button.tsx
39658
39778
  init_cn();
39659
39779
 
39660
39780
  // src/components/tickets/ticket-live-provider.tsx
39661
- import React112 from "react";
39781
+ import React113 from "react";
39662
39782
  import { useQueryClient } from "@tanstack/react-query";
39663
39783
 
39664
39784
  // src/components/chat/hooks/use-chat-identity.ts
@@ -39717,7 +39837,7 @@ function useChatIdentity() {
39717
39837
  }
39718
39838
 
39719
39839
  // src/components/tickets/ticket-live-provider.tsx
39720
- import { jsx as jsx287 } from "react/jsx-runtime";
39840
+ import { jsx as jsx288 } from "react/jsx-runtime";
39721
39841
  var TICKET_STREAM_ENDPOINT = "/api/tickets/stream";
39722
39842
  var TICKET_READ_ENDPOINT = "/api/tickets/read";
39723
39843
  var EMPTY_SUMMARY = { totalUnread: 0, tickets: {}, latestUnreadAt: {} };
@@ -39727,12 +39847,12 @@ var stampMs = (stamp) => {
39727
39847
  return Number.isNaN(ms) ? 0 : ms;
39728
39848
  };
39729
39849
  var INVALIDATE_DEBOUNCE_MS = 1500;
39730
- var TicketLiveContext = React112.createContext(null);
39850
+ var TicketLiveContext = React113.createContext(null);
39731
39851
  function useOptionalTicketLive() {
39732
- return React112.useContext(TicketLiveContext);
39852
+ return React113.useContext(TicketLiveContext);
39733
39853
  }
39734
39854
  function useTicketLive() {
39735
- const ctx = React112.useContext(TicketLiveContext);
39855
+ const ctx = React113.useContext(TicketLiveContext);
39736
39856
  if (!ctx) {
39737
39857
  throw new Error("useTicketLive must be used within <TicketLiveProvider>");
39738
39858
  }
@@ -39751,13 +39871,13 @@ function TicketLiveProvider({ children }) {
39751
39871
  const streamUrl = runtime?.endpoints.ticketStreamUrl ?? TICKET_STREAM_ENDPOINT;
39752
39872
  const readUrl = runtime?.endpoints.ticketReadUrl ?? TICKET_READ_ENDPOINT;
39753
39873
  const authed = identity.authTier !== "anon" && !!identity.user?.email;
39754
- const [connected, setConnected] = React112.useState(false);
39755
- const [summary, setSummary] = React112.useState(EMPTY_SUMMARY);
39756
- const [openTicketIdState, setOpenTicketIdState] = React112.useState(null);
39757
- const openTicketIdRef = React112.useRef(null);
39758
- const pendingTicketIdsRef = React112.useRef(/* @__PURE__ */ new Set());
39759
- const invalidateTimerRef = React112.useRef(null);
39760
- const flushInvalidations = React112.useCallback(() => {
39874
+ const [connected, setConnected] = React113.useState(false);
39875
+ const [summary, setSummary] = React113.useState(EMPTY_SUMMARY);
39876
+ const [openTicketIdState, setOpenTicketIdState] = React113.useState(null);
39877
+ const openTicketIdRef = React113.useRef(null);
39878
+ const pendingTicketIdsRef = React113.useRef(/* @__PURE__ */ new Set());
39879
+ const invalidateTimerRef = React113.useRef(null);
39880
+ const flushInvalidations = React113.useCallback(() => {
39761
39881
  invalidateTimerRef.current = null;
39762
39882
  const ids = Array.from(pendingTicketIdsRef.current);
39763
39883
  pendingTicketIdsRef.current.clear();
@@ -39766,7 +39886,7 @@ function TicketLiveProvider({ children }) {
39766
39886
  void queryClient.invalidateQueries({ queryKey: ["ticket-engagements", id] });
39767
39887
  }
39768
39888
  }, [queryClient]);
39769
- const scheduleInvalidation = React112.useCallback(
39889
+ const scheduleInvalidation = React113.useCallback(
39770
39890
  (ticketId) => {
39771
39891
  if (ticketId) pendingTicketIdsRef.current.add(ticketId);
39772
39892
  if (invalidateTimerRef.current) return;
@@ -39774,7 +39894,7 @@ function TicketLiveProvider({ children }) {
39774
39894
  },
39775
39895
  [flushInvalidations]
39776
39896
  );
39777
- const bumpUnread = React112.useCallback((ticketId, createdAt) => {
39897
+ const bumpUnread = React113.useCallback((ticketId, createdAt) => {
39778
39898
  setSummary((prev) => {
39779
39899
  const stamp = createdAt ?? (/* @__PURE__ */ new Date()).toISOString();
39780
39900
  const existing = prev.latestUnreadAt[ticketId];
@@ -39788,7 +39908,7 @@ function TicketLiveProvider({ children }) {
39788
39908
  };
39789
39909
  });
39790
39910
  }, []);
39791
- const zeroUnread = React112.useCallback((ticketId) => {
39911
+ const zeroUnread = React113.useCallback((ticketId) => {
39792
39912
  setSummary((prev) => {
39793
39913
  const current = prev.tickets[ticketId] ?? 0;
39794
39914
  if (current === 0) return prev;
@@ -39799,9 +39919,9 @@ function TicketLiveProvider({ children }) {
39799
39919
  return { totalUnread: Math.max(0, prev.totalUnread - current), tickets, latestUnreadAt };
39800
39920
  });
39801
39921
  }, []);
39802
- const subscriptionRef = React112.useRef(null);
39803
- const noStreamRef = React112.useRef(false);
39804
- const handlersRef = React112.useRef({ onEvent: () => {
39922
+ const subscriptionRef = React113.useRef(null);
39923
+ const noStreamRef = React113.useRef(false);
39924
+ const handlersRef = React113.useRef({ onEvent: () => {
39805
39925
  }, onStatus: () => {
39806
39926
  }, onConnected: () => {
39807
39927
  } });
@@ -39854,7 +39974,7 @@ function TicketLiveProvider({ children }) {
39854
39974
  if (status === "no-stream") noStreamRef.current = true;
39855
39975
  };
39856
39976
  const streamEnabled = authed && !!streamUrl;
39857
- React112.useEffect(() => {
39977
+ React113.useEffect(() => {
39858
39978
  if (!streamEnabled) return;
39859
39979
  if (typeof window === "undefined") return;
39860
39980
  subscriptionRef.current = createSseSubscription({
@@ -39885,7 +40005,7 @@ function TicketLiveProvider({ children }) {
39885
40005
  setSummary(EMPTY_SUMMARY);
39886
40006
  };
39887
40007
  }, [streamEnabled, streamUrl]);
39888
- const markRead = React112.useCallback(
40008
+ const markRead = React113.useCallback(
39889
40009
  async (ticketExternalId) => {
39890
40010
  try {
39891
40011
  const response = await embedAuthedFetch(readUrl, {
@@ -39907,15 +40027,15 @@ function TicketLiveProvider({ children }) {
39907
40027
  },
39908
40028
  [readUrl, zeroUnread]
39909
40029
  );
39910
- const setOpenTicketId = React112.useCallback((ticketExternalId) => {
40030
+ const setOpenTicketId = React113.useCallback((ticketExternalId) => {
39911
40031
  openTicketIdRef.current = ticketExternalId;
39912
40032
  setOpenTicketIdState(ticketExternalId);
39913
40033
  }, []);
39914
- const notifyTicketCreated = React112.useCallback(() => {
40034
+ const notifyTicketCreated = React113.useCallback(() => {
39915
40035
  noStreamRef.current = false;
39916
40036
  subscriptionRef.current?.reconnectNow();
39917
40037
  }, []);
39918
- const value = React112.useMemo(() => {
40038
+ const value = React113.useMemo(() => {
39919
40039
  let unreadByTicket = summary.tickets;
39920
40040
  let unreadTotal = summary.totalUnread;
39921
40041
  if (openTicketIdState && unreadByTicket[openTicketIdState]) {
@@ -39952,7 +40072,7 @@ function TicketLiveProvider({ children }) {
39952
40072
  setOpenTicketId,
39953
40073
  notifyTicketCreated
39954
40074
  ]);
39955
- return /* @__PURE__ */ jsx287(TicketLiveContext.Provider, { value, children });
40075
+ return /* @__PURE__ */ jsx288(TicketLiveContext.Provider, { value, children });
39956
40076
  }
39957
40077
 
39958
40078
  // src/components/tickets/types.ts
@@ -39972,7 +40092,7 @@ var TOAST_COPY = {
39972
40092
  };
39973
40093
 
39974
40094
  // src/components/navigation/ticket-alerts-button.tsx
39975
- import { jsx as jsx288, jsxs as jsxs224 } from "react/jsx-runtime";
40095
+ import { jsx as jsx289, jsxs as jsxs225 } from "react/jsx-runtime";
39976
40096
  function TicketAlertsButton({ href, onNavigate, disabled, className }) {
39977
40097
  const live = useOptionalTicketLive();
39978
40098
  if (!live || !live.authed || live.unreadTotal === 0) return null;
@@ -39982,7 +40102,7 @@ function TicketAlertsButton({ href, onNavigate, disabled, className }) {
39982
40102
  if (onNavigate) onNavigate(target);
39983
40103
  else window.location.assign(target);
39984
40104
  };
39985
- return /* @__PURE__ */ jsx288(
40105
+ return /* @__PURE__ */ jsx289(
39986
40106
  HeaderButton,
39987
40107
  {
39988
40108
  icon: (
@@ -39991,9 +40111,9 @@ function TicketAlertsButton({ href, onNavigate, disabled, className }) {
39991
40111
  // bell and time-tracker cells. The indication is carried by the
39992
40112
  // count pill (sidebar count-pill precedent) and by the cell only
39993
40113
  // existing while updates are unread — never by tinting the glyph.
39994
- /* @__PURE__ */ jsxs224("span", { className: "relative inline-flex", children: [
39995
- /* @__PURE__ */ jsx288(LifeBuoyIcon, { className: "w-6 h-6" }),
39996
- /* @__PURE__ */ jsx288(UnreadCountBadge, { count: live.unreadTotal })
40114
+ /* @__PURE__ */ jsxs225("span", { className: "relative inline-flex", children: [
40115
+ /* @__PURE__ */ jsx289(LifeBuoyIcon, { className: "w-6 h-6" }),
40116
+ /* @__PURE__ */ jsx289(UnreadCountBadge, { count: live.unreadTotal })
39997
40117
  ] })
39998
40118
  ),
39999
40119
  "aria-label": `Support tickets \u2014 ${live.unreadTotal} unread ${live.unreadTotal === 1 ? "update" : "updates"}`,
@@ -40004,126 +40124,6 @@ function TicketAlertsButton({ href, onNavigate, disabled, className }) {
40004
40124
  );
40005
40125
  }
40006
40126
 
40007
- // src/components/navigation/mobile-nav-panel.tsx
40008
- import { useRef as useRef47 } from "react";
40009
- import { usePreventScroll as usePreventScroll3 } from "@react-aria/overlays";
40010
- init_button2();
40011
- import { X as X10 } from "lucide-react";
40012
- import { Fragment as Fragment56, jsx as jsx289, jsxs as jsxs225 } from "react/jsx-runtime";
40013
- var MOBILE_NAV_PANEL_ID = "mobile-nav-panel";
40014
- function MobileNavPanel({ isOpen, config }) {
40015
- const panelRef = useRef47(null);
40016
- usePreventScroll3({ isDisabled: !isOpen });
40017
- useFocusTrap(panelRef, isOpen, { onEscape: config.onClose });
40018
- const headerHeight = useHeaderHeight(64, { enabled: isOpen });
40019
- if (!isOpen) return null;
40020
- const renderNavigationItem = (item) => {
40021
- if (item.element) {
40022
- return /* @__PURE__ */ jsx289("div", { children: item.element }, item.id);
40023
- }
40024
- const handleClick = () => {
40025
- if (item.onClick) {
40026
- item.onClick();
40027
- }
40028
- config.onClose?.();
40029
- };
40030
- if (item.href) {
40031
- return /* @__PURE__ */ jsx289(
40032
- Button,
40033
- {
40034
- variant: "outline",
40035
- size: "small-legacy",
40036
- href: item.href,
40037
- onClick: handleClick,
40038
- leftIcon: item.icon,
40039
- rightIcon: item.badge,
40040
- className: cn(
40041
- "justify-start h-12 px-4 bg-transparent border-none text-ods-text-primary hover:bg-ods-bg-hover gap-3 rounded-md transition-colors",
40042
- item.isActive ? "bg-ods-bg-hover" : ""
40043
- ),
40044
- children: item.label
40045
- },
40046
- item.id
40047
- );
40048
- }
40049
- return /* @__PURE__ */ jsxs225(
40050
- Button,
40051
- {
40052
- variant: "outline",
40053
- size: "small-legacy",
40054
- onClick: handleClick,
40055
- leftIcon: item.icon,
40056
- className: cn(
40057
- "justify-start h-12 px-4 bg-transparent border-none text-ods-text-primary hover:bg-ods-bg-hover gap-3 rounded-md transition-colors",
40058
- item.isActive ? "bg-ods-bg-hover" : ""
40059
- ),
40060
- children: [
40061
- /* @__PURE__ */ jsx289("span", { className: "flex-1 text-left", children: item.label }),
40062
- item.badge !== void 0 && /* @__PURE__ */ jsx289("span", { className: "ml-auto", children: item.badge })
40063
- ]
40064
- },
40065
- item.id
40066
- );
40067
- };
40068
- return /* @__PURE__ */ jsxs225(Fragment56, { children: [
40069
- /* @__PURE__ */ jsx289(
40070
- "div",
40071
- {
40072
- className: cn("fixed inset-0 z-[9998]", OVERLAY_BACKDROP_CLASS),
40073
- onClick: config.onClose
40074
- }
40075
- ),
40076
- /* @__PURE__ */ jsxs225(
40077
- "div",
40078
- {
40079
- ref: panelRef,
40080
- id: MOBILE_NAV_PANEL_ID,
40081
- role: "dialog",
40082
- "aria-modal": "true",
40083
- "aria-label": "Navigation menu",
40084
- tabIndex: -1,
40085
- style: { "--mobile-nav-top": `${headerHeight + 16}px` },
40086
- className: cn(
40087
- "fixed z-[9999] rounded-lg shadow-xl",
40088
- config.className ? "" : "bg-ods-card border border-ods-border",
40089
- // Responsive positioning and sizing — LEFT-anchored from md, flush
40090
- // under the burger cell at the left edge of the unified
40091
- // top-navigation (a larger inset read as a stray gap between the
40092
- // burger and its panel).
40093
- "right-2 left-2 md:right-auto",
40094
- "md:left-2 md:w-[400px] md:max-w-[calc(100vw-1rem)]",
40095
- // Small-viewport (svh) sizing anchored below the measured header —
40096
- // 100vh overflowed under mobile browser chrome, leaving the bottom
40097
- // entries and footer unreachable while the body was scroll-locked.
40098
- "top-[var(--mobile-nav-top)]",
40099
- "max-h-[calc(100svh-var(--mobile-nav-top)-50px)] md:max-h-[calc(100svh-var(--mobile-nav-top)-8px)]",
40100
- "flex flex-col",
40101
- config.className || ""
40102
- ),
40103
- onClick: (e) => e.stopPropagation(),
40104
- children: [
40105
- /* @__PURE__ */ jsx289("div", { className: "flex justify-end p-2 border-b border-ods-border flex-shrink-0", children: /* @__PURE__ */ jsx289(
40106
- Button,
40107
- {
40108
- "aria-label": "Close menu",
40109
- size: "icon",
40110
- variant: "transparent",
40111
- leftIcon: /* @__PURE__ */ jsx289(X10, { className: "w-4 h-4 text-ods-text-primary" }),
40112
- onClick: config.onClose,
40113
- className: "hover:bg-ods-bg-hover"
40114
- }
40115
- ) }),
40116
- /* @__PURE__ */ jsx289("div", { className: "flex-1 overflow-y-auto overflow-x-hidden overscroll-contain px-2 py-2", children: /* @__PURE__ */ jsx289("div", { className: "flex flex-col space-y-1", children: config.sections.map((section, index) => /* @__PURE__ */ jsxs225("div", { children: [
40117
- section.title && /* @__PURE__ */ jsx289("div", { className: "px-4 pt-2 pb-1 text-h6 font-semibold uppercase text-ods-text-secondary", children: section.title }),
40118
- /* @__PURE__ */ jsx289("div", { className: "flex flex-col gap-1", children: section.items.map(renderNavigationItem) })
40119
- ] }, index)) }) }),
40120
- config.footer && /* @__PURE__ */ jsx289("div", { className: "border-t border-ods-border p-4 pb-[max(1rem,env(safe-area-inset-bottom))] flex-shrink-0", children: config.footer })
40121
- ]
40122
- }
40123
- )
40124
- ] });
40125
- }
40126
-
40127
40127
  // src/components/navigation/top-navigation.tsx
40128
40128
  init_cn();
40129
40129
  import { jsx as jsx290, jsxs as jsxs226 } from "react/jsx-runtime";
@@ -40203,6 +40203,7 @@ function TopNavigation({
40203
40203
 
40204
40204
  // src/components/navigation/header.tsx
40205
40205
  import { Fragment as Fragment57, jsx as jsx291, jsxs as jsxs227 } from "react/jsx-runtime";
40206
+ var NAV_ITEM_CLASSES = "text-h6 [&_svg]:h-6 [&_svg]:w-6";
40206
40207
  function Header2({ config, platform }) {
40207
40208
  const [show, setShow] = useState90(true);
40208
40209
  const [lastScrollY, setLastScrollY] = useState90(0);
@@ -40292,9 +40293,10 @@ function Header2({ config, platform }) {
40292
40293
  size: "default",
40293
40294
  font: "regular",
40294
40295
  className: cn(
40295
- // Top-level nav links: the default-size button with the h4
40296
- // (DM Sans 500) `font="regular"` labelFigma 133-740, added
40297
- // for navigation; dropdown children stay on the h6 step.
40296
+ // Top-level nav links (Figma 2936-6815): compact h6 label
40297
+ // (DM Sans 500, 14/20) with 24px icons overrides the
40298
+ // font="regular" h4 step and the button's 20px svg cap.
40299
+ NAV_ITEM_CLASSES,
40298
40300
  item.isActive && "bg-ods-bg-hover",
40299
40301
  // Active items get subtle gray background
40300
40302
  isOpen && "bg-ods-bg-hover",
@@ -40337,7 +40339,11 @@ function Header2({ config, platform }) {
40337
40339
  },
40338
40340
  className: cn(
40339
40341
  "flex justify-start w-full",
40340
- "text-h6 font-bold",
40342
+ // Same caption step as the top-level nav links (designer:
40343
+ // dropdowns follow the h6 caption size/weight too). The
40344
+ // explicit font-medium beats small-legacy's font-bold via
40345
+ // tailwind-merge instead of stylesheet order.
40346
+ "text-h6 font-medium",
40341
40347
  index < (item.children?.length ?? 0) - 1 && "mb-1",
40342
40348
  "text-ods-text-primary",
40343
40349
  // All dropdown items use primary text color
@@ -40370,6 +40376,7 @@ function Header2({ config, platform }) {
40370
40376
  size: "default",
40371
40377
  font: "regular",
40372
40378
  className: cn(
40379
+ NAV_ITEM_CLASSES,
40373
40380
  "hover:bg-ods-bg-hover focus:bg-ods-bg-hover",
40374
40381
  "whitespace-nowrap",
40375
40382
  "text-ods-text-primary",
@@ -40394,6 +40401,7 @@ function Header2({ config, platform }) {
40394
40401
  size: "default",
40395
40402
  font: "regular",
40396
40403
  className: cn(
40404
+ NAV_ITEM_CLASSES,
40397
40405
  "hover:bg-ods-bg-hover focus:bg-ods-bg-hover",
40398
40406
  "whitespace-nowrap",
40399
40407
  "text-ods-text-primary",
@@ -40408,7 +40416,6 @@ function Header2({ config, platform }) {
40408
40416
  );
40409
40417
  };
40410
40418
  const hasNav = !!config.navigation && config.navigation.items.length > 0;
40411
- const hasLeftCells = !!config.actions?.left?.length;
40412
40419
  const hasCta = !!config.actions?.right?.length || !!(config.actions?.persistent && config.actions.persistent.length > 0);
40413
40420
  return /* @__PURE__ */ jsx291(
40414
40421
  "div",
@@ -40443,7 +40450,7 @@ function Header2({ config, platform }) {
40443
40450
  )
40444
40451
  ] }),
40445
40452
  logo: /* @__PURE__ */ jsx291(next_link_default, { href: config.logo.href, className: "transition-opacity duration-200 hover:opacity-80", children: config.logo.element }),
40446
- logoClassName: cn("md:pl-[var(--spacing-system-mf)]", hasLeftCells && "lg:pl-[var(--spacing-system-l)]"),
40453
+ logoClassName: "pl-[var(--spacing-system-lf)] md:pl-[var(--spacing-system-lf)] lg:pl-[var(--spacing-system-lf)]",
40447
40454
  center: hasNav ? /* @__PURE__ */ jsx291(
40448
40455
  "nav",
40449
40456
  {
@@ -60655,6 +60662,8 @@ export {
60655
60662
  TicketInfoSection,
60656
60663
  FilterPillRow,
60657
60664
  MingoAiButton,
60665
+ MOBILE_NAV_PANEL_ID,
60666
+ MobileNavPanel,
60658
60667
  useOptionalTicketLive,
60659
60668
  useTicketLive,
60660
60669
  TicketLiveProvider,
@@ -60663,8 +60672,6 @@ export {
60663
60672
  TICKET_MARK_READ_DEBOUNCE_MS,
60664
60673
  TOAST_COPY,
60665
60674
  TicketAlertsButton,
60666
- MOBILE_NAV_PANEL_ID,
60667
- MobileNavPanel,
60668
60675
  TopNavigation,
60669
60676
  Header2 as Header,
60670
60677
  HeaderSkeleton,
@@ -60697,4 +60704,4 @@ export {
60697
60704
  LogsList,
60698
60705
  assets
60699
60706
  };
60700
- //# sourceMappingURL=chunk-AEELJC4N.js.map
60707
+ //# sourceMappingURL=chunk-FEGEC6FY.js.map