@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.
- package/dist/{chunk-KXZO2WZX.js → chunk-2AASLY6D.js} +2 -2
- package/dist/{chunk-UQDMJ6DH.cjs → chunk-2RLI5XVI.cjs} +13 -13
- package/dist/{chunk-UQDMJ6DH.cjs.map → chunk-2RLI5XVI.cjs.map} +1 -1
- package/dist/{chunk-YQEPRYT5.cjs → chunk-53JKCFFE.cjs} +7 -7
- package/dist/{chunk-YQEPRYT5.cjs.map → chunk-53JKCFFE.cjs.map} +1 -1
- package/dist/{chunk-K5MSCMDK.cjs → chunk-5AZZQQYS.cjs} +37 -37
- package/dist/{chunk-K5MSCMDK.cjs.map → chunk-5AZZQQYS.cjs.map} +1 -1
- package/dist/{chunk-C7OY3PQP.cjs → chunk-5CDPRCPS.cjs} +11 -11
- package/dist/{chunk-C7OY3PQP.cjs.map → chunk-5CDPRCPS.cjs.map} +1 -1
- package/dist/{chunk-DYPYR7FR.cjs → chunk-6TL5XIAW.cjs} +87 -87
- package/dist/{chunk-DYPYR7FR.cjs.map → chunk-6TL5XIAW.cjs.map} +1 -1
- package/dist/{chunk-7WZHBQ4J.js → chunk-CTMLY2GN.js} +2 -2
- package/dist/{chunk-XGIFOHKE.js → chunk-DBR5JLX3.js} +2 -2
- package/dist/{chunk-QJJISLPA.cjs → chunk-EJ3EBYNV.cjs} +26 -26
- package/dist/{chunk-QJJISLPA.cjs.map → chunk-EJ3EBYNV.cjs.map} +1 -1
- package/dist/{chunk-AEELJC4N.js → chunk-FEGEC6FY.js} +165 -158
- package/dist/{chunk-AEELJC4N.js.map → chunk-FEGEC6FY.js.map} +1 -1
- package/dist/{chunk-I2B6X77L.js → chunk-HCZJZMU7.js} +2 -2
- package/dist/{chunk-3QSR22IC.js → chunk-HX4CJYXL.js} +6 -6
- package/dist/{chunk-BT2WWDFP.cjs → chunk-J2JUAS4C.cjs} +5 -5
- package/dist/{chunk-BT2WWDFP.cjs.map → chunk-J2JUAS4C.cjs.map} +1 -1
- package/dist/{chunk-LBAKLT6T.cjs → chunk-JMBIGH4H.cjs} +61 -61
- package/dist/{chunk-LBAKLT6T.cjs.map → chunk-JMBIGH4H.cjs.map} +1 -1
- package/dist/{chunk-PO5O654H.js → chunk-JOCFPAS6.js} +4 -4
- package/dist/{chunk-DC2TKS7C.js → chunk-LBOWSKGM.js} +2 -2
- package/dist/{chunk-V3ZAAFE3.js → chunk-MLGGF24T.js} +5 -5
- package/dist/{chunk-4G5TLHJD.cjs → chunk-RB2EW6IZ.cjs} +544 -537
- package/dist/chunk-RB2EW6IZ.cjs.map +1 -0
- package/dist/{chunk-M37PBG4N.cjs → chunk-RHQ7BJKK.cjs} +31 -31
- package/dist/{chunk-M37PBG4N.cjs.map → chunk-RHQ7BJKK.cjs.map} +1 -1
- package/dist/{chunk-CIOLOQKQ.cjs → chunk-RJ3D3PE2.cjs} +4 -4
- package/dist/{chunk-CIOLOQKQ.cjs.map → chunk-RJ3D3PE2.cjs.map} +1 -1
- package/dist/{chunk-K6QTZ7CZ.js → chunk-SRYV4H3M.js} +2 -2
- package/dist/{chunk-72XAID7Y.js → chunk-TBGSQTJK.js} +4 -4
- package/dist/{chunk-LFUPI7VX.js → chunk-UWPT23SA.js} +2 -2
- package/dist/{chunk-KBN7PMFT.js → chunk-VDJF4ZAU.js} +2 -2
- package/dist/{chunk-TWSKTJHW.js → chunk-WNOGR5AA.js} +2 -2
- package/dist/{chunk-3CGZPAGR.cjs → chunk-WSAPKKDU.cjs} +3 -3
- package/dist/{chunk-3CGZPAGR.cjs.map → chunk-WSAPKKDU.cjs.map} +1 -1
- package/dist/{chunk-2T4GTV25.cjs → chunk-XJVRAKEX.cjs} +9 -9
- package/dist/{chunk-2T4GTV25.cjs.map → chunk-XJVRAKEX.cjs.map} +1 -1
- package/dist/{chunk-T7MCSA55.cjs → chunk-Z35QWWJH.cjs} +26 -26
- package/dist/{chunk-T7MCSA55.cjs.map → chunk-Z35QWWJH.cjs.map} +1 -1
- package/dist/components/case-studies/index.cjs +8 -8
- package/dist/components/case-studies/index.js +2 -2
- package/dist/components/chat/index.cjs +2 -2
- package/dist/components/chat/index.js +1 -1
- package/dist/components/contact/index.cjs +3 -3
- package/dist/components/contact/index.js +2 -2
- package/dist/components/docs/index.cjs +5 -5
- package/dist/components/docs/index.js +4 -4
- package/dist/components/embeds/index.cjs +3 -3
- package/dist/components/embeds/index.js +2 -2
- package/dist/components/faq/index.cjs +3 -3
- package/dist/components/faq/index.js +2 -2
- package/dist/components/features/index.cjs +2 -2
- package/dist/components/features/index.js +1 -1
- package/dist/components/help-center-pages/index.cjs +22 -22
- package/dist/components/help-center-pages/index.js +13 -13
- package/dist/components/index.cjs +132 -132
- package/dist/components/index.js +11 -11
- package/dist/components/meeting-scheduler/index.cjs +34 -34
- package/dist/components/meeting-scheduler/index.js +3 -3
- package/dist/components/navigation/header.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +2 -2
- package/dist/components/navigation/index.js +1 -1
- package/dist/components/onboarding-guides/index.cjs +5 -5
- package/dist/components/onboarding-guides/index.js +4 -4
- package/dist/components/related-content/index.cjs +3 -3
- package/dist/components/related-content/index.js +2 -2
- package/dist/components/tickets/index.cjs +6 -6
- package/dist/components/tickets/index.js +5 -5
- package/dist/components/ui/index.cjs +2 -2
- package/dist/components/ui/index.js +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/components/navigation/header.tsx +21 -16
- package/src/stories/TopNavigation.stories.tsx +1 -1
- package/dist/chunk-4G5TLHJD.cjs.map +0 -1
- /package/dist/{chunk-KXZO2WZX.js.map → chunk-2AASLY6D.js.map} +0 -0
- /package/dist/{chunk-7WZHBQ4J.js.map → chunk-CTMLY2GN.js.map} +0 -0
- /package/dist/{chunk-XGIFOHKE.js.map → chunk-DBR5JLX3.js.map} +0 -0
- /package/dist/{chunk-I2B6X77L.js.map → chunk-HCZJZMU7.js.map} +0 -0
- /package/dist/{chunk-3QSR22IC.js.map → chunk-HX4CJYXL.js.map} +0 -0
- /package/dist/{chunk-PO5O654H.js.map → chunk-JOCFPAS6.js.map} +0 -0
- /package/dist/{chunk-DC2TKS7C.js.map → chunk-LBOWSKGM.js.map} +0 -0
- /package/dist/{chunk-V3ZAAFE3.js.map → chunk-MLGGF24T.js.map} +0 -0
- /package/dist/{chunk-K6QTZ7CZ.js.map → chunk-SRYV4H3M.js.map} +0 -0
- /package/dist/{chunk-72XAID7Y.js.map → chunk-TBGSQTJK.js.map} +0 -0
- /package/dist/{chunk-LFUPI7VX.js.map → chunk-UWPT23SA.js.map} +0 -0
- /package/dist/{chunk-KBN7PMFT.js.map → chunk-VDJF4ZAU.js.map} +0 -0
- /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
|
|
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
|
|
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 =
|
|
39850
|
+
var TicketLiveContext = React113.createContext(null);
|
|
39731
39851
|
function useOptionalTicketLive() {
|
|
39732
|
-
return
|
|
39852
|
+
return React113.useContext(TicketLiveContext);
|
|
39733
39853
|
}
|
|
39734
39854
|
function useTicketLive() {
|
|
39735
|
-
const ctx =
|
|
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] =
|
|
39755
|
-
const [summary, setSummary] =
|
|
39756
|
-
const [openTicketIdState, setOpenTicketIdState] =
|
|
39757
|
-
const openTicketIdRef =
|
|
39758
|
-
const pendingTicketIdsRef =
|
|
39759
|
-
const invalidateTimerRef =
|
|
39760
|
-
const flushInvalidations =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
39803
|
-
const noStreamRef =
|
|
39804
|
-
const handlersRef =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
40030
|
+
const setOpenTicketId = React113.useCallback((ticketExternalId) => {
|
|
39911
40031
|
openTicketIdRef.current = ticketExternalId;
|
|
39912
40032
|
setOpenTicketIdState(ticketExternalId);
|
|
39913
40033
|
}, []);
|
|
39914
|
-
const notifyTicketCreated =
|
|
40034
|
+
const notifyTicketCreated = React113.useCallback(() => {
|
|
39915
40035
|
noStreamRef.current = false;
|
|
39916
40036
|
subscriptionRef.current?.reconnectNow();
|
|
39917
40037
|
}, []);
|
|
39918
|
-
const value =
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
39995
|
-
/* @__PURE__ */
|
|
39996
|
-
/* @__PURE__ */
|
|
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
|
|
40296
|
-
// (DM Sans 500)
|
|
40297
|
-
//
|
|
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
|
-
|
|
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:
|
|
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-
|
|
60707
|
+
//# sourceMappingURL=chunk-FEGEC6FY.js.map
|