@flamingo-stack/openframe-frontend-core 0.0.491 → 0.0.492

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 (96) hide show
  1. package/dist/{chunk-J2V4B6FF.cjs → chunk-2XAAFAQT.cjs} +11 -11
  2. package/dist/{chunk-J2V4B6FF.cjs.map → chunk-2XAAFAQT.cjs.map} +1 -1
  3. package/dist/{chunk-GTMW4KY7.js → chunk-4AWRPTKE.js} +4 -4
  4. package/dist/{chunk-IUGJAILN.js → chunk-4J3CB4KO.js} +2 -2
  5. package/dist/{chunk-2RTNC3KP.cjs → chunk-4MLOMMDX.cjs} +886 -749
  6. package/dist/chunk-4MLOMMDX.cjs.map +1 -0
  7. package/dist/{chunk-CYIUPI7J.js → chunk-56J7RLMM.js} +353 -216
  8. package/dist/{chunk-CYIUPI7J.js.map → chunk-56J7RLMM.js.map} +1 -1
  9. package/dist/{chunk-GL33BHGZ.cjs → chunk-5ICPQAUI.cjs} +59 -59
  10. package/dist/{chunk-GL33BHGZ.cjs.map → chunk-5ICPQAUI.cjs.map} +1 -1
  11. package/dist/{chunk-35CTCUJ7.js → chunk-5RHJVPL7.js} +4 -4
  12. package/dist/{chunk-2YQK6LHR.js → chunk-BTIRYGDT.js} +4 -4
  13. package/dist/{chunk-QNFAZIFC.cjs → chunk-DY6AJNVK.cjs} +5 -5
  14. package/dist/{chunk-QNFAZIFC.cjs.map → chunk-DY6AJNVK.cjs.map} +1 -1
  15. package/dist/{chunk-U2JIGUXF.js → chunk-FG5ALORQ.js} +2 -2
  16. package/dist/{chunk-VD4QDSP7.cjs → chunk-J2J36PEN.cjs} +31 -31
  17. package/dist/{chunk-VD4QDSP7.cjs.map → chunk-J2J36PEN.cjs.map} +1 -1
  18. package/dist/{chunk-ITV6LSG7.cjs → chunk-LIRXKEOE.cjs} +15 -15
  19. package/dist/{chunk-ITV6LSG7.cjs.map → chunk-LIRXKEOE.cjs.map} +1 -1
  20. package/dist/{chunk-PVSXTCJY.cjs → chunk-LVDI7R7T.cjs} +37 -37
  21. package/dist/{chunk-PVSXTCJY.cjs.map → chunk-LVDI7R7T.cjs.map} +1 -1
  22. package/dist/{chunk-6O3YTVLG.cjs → chunk-M4SCYPCR.cjs} +7 -7
  23. package/dist/{chunk-6O3YTVLG.cjs.map → chunk-M4SCYPCR.cjs.map} +1 -1
  24. package/dist/{chunk-YKE2KZ2Y.cjs → chunk-O6S6Q52W.cjs} +26 -26
  25. package/dist/{chunk-YKE2KZ2Y.cjs.map → chunk-O6S6Q52W.cjs.map} +1 -1
  26. package/dist/{chunk-7NRRONK5.cjs → chunk-OFFYASUY.cjs} +26 -26
  27. package/dist/{chunk-7NRRONK5.cjs.map → chunk-OFFYASUY.cjs.map} +1 -1
  28. package/dist/{chunk-ZDUJ6BDI.js → chunk-P3ITKTUE.js} +2 -2
  29. package/dist/{chunk-EHHX22JL.cjs → chunk-PI5BMKV3.cjs} +62 -62
  30. package/dist/{chunk-EHHX22JL.cjs.map → chunk-PI5BMKV3.cjs.map} +1 -1
  31. package/dist/{chunk-6XNWT2KC.js → chunk-QHRNQTW5.js} +2 -2
  32. package/dist/{chunk-ZEC5U5T7.js → chunk-SZWMJIH3.js} +2 -2
  33. package/dist/{chunk-CZTKQVIQ.js → chunk-U5LU56JE.js} +2 -2
  34. package/dist/{chunk-HRMOCJKU.cjs → chunk-VML66FJQ.cjs} +9 -9
  35. package/dist/{chunk-HRMOCJKU.cjs.map → chunk-VML66FJQ.cjs.map} +1 -1
  36. package/dist/{chunk-T4BUS6JV.js → chunk-WKWZ7LVC.js} +2 -2
  37. package/dist/{chunk-QF54RPHZ.js → chunk-WPFLV4QJ.js} +4 -4
  38. package/dist/components/case-studies/index.cjs +8 -8
  39. package/dist/components/case-studies/index.js +2 -2
  40. package/dist/components/chat/index.cjs +2 -2
  41. package/dist/components/chat/index.js +1 -1
  42. package/dist/components/contact/index.cjs +3 -3
  43. package/dist/components/contact/index.js +2 -2
  44. package/dist/components/docs/index.cjs +5 -5
  45. package/dist/components/docs/index.js +4 -4
  46. package/dist/components/embeds/index.cjs +3 -3
  47. package/dist/components/embeds/index.js +2 -2
  48. package/dist/components/faq/index.cjs +3 -3
  49. package/dist/components/faq/index.js +2 -2
  50. package/dist/components/features/floating-walkthrough-video.d.ts.map +1 -1
  51. package/dist/components/features/index.cjs +2 -2
  52. package/dist/components/features/index.js +1 -1
  53. package/dist/components/help-center-pages/index.cjs +20 -20
  54. package/dist/components/help-center-pages/index.js +11 -11
  55. package/dist/components/index.cjs +130 -130
  56. package/dist/components/index.js +9 -9
  57. package/dist/components/navigation/index.cjs +2 -2
  58. package/dist/components/navigation/index.js +1 -1
  59. package/dist/components/navigation/navigation-sidebar-item.d.ts +23 -1
  60. package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
  61. package/dist/components/navigation/navigation-sidebar.d.ts.map +1 -1
  62. package/dist/components/onboarding-guides/index.cjs +5 -5
  63. package/dist/components/onboarding-guides/index.js +4 -4
  64. package/dist/components/related-content/index.cjs +3 -3
  65. package/dist/components/related-content/index.js +2 -2
  66. package/dist/components/tickets/index.cjs +5 -5
  67. package/dist/components/tickets/index.js +4 -4
  68. package/dist/components/ui/data-table/data-table-column-filter.d.ts.map +1 -1
  69. package/dist/components/ui/data-table/data-table-header.d.ts.map +1 -1
  70. package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
  71. package/dist/components/ui/index.cjs +2 -2
  72. package/dist/components/ui/index.js +1 -1
  73. package/dist/components/ui/tab-navigation.d.ts.map +1 -1
  74. package/dist/index.cjs +2 -2
  75. package/dist/index.js +1 -1
  76. package/package.json +1 -1
  77. package/src/components/features/floating-walkthrough-video.tsx +3 -1
  78. package/src/components/navigation/navigation-sidebar-item.tsx +80 -30
  79. package/src/components/navigation/navigation-sidebar.tsx +106 -46
  80. package/src/components/ui/__tests__/tab-navigation.test.tsx +159 -0
  81. package/src/components/ui/data-table/data-table-column-filter.tsx +7 -1
  82. package/src/components/ui/data-table/data-table-header.tsx +4 -1
  83. package/src/components/ui/data-table/data-table-skeleton.tsx +7 -0
  84. package/src/components/ui/tab-navigation.tsx +370 -171
  85. package/dist/chunk-2RTNC3KP.cjs.map +0 -1
  86. /package/dist/{chunk-GTMW4KY7.js.map → chunk-4AWRPTKE.js.map} +0 -0
  87. /package/dist/{chunk-IUGJAILN.js.map → chunk-4J3CB4KO.js.map} +0 -0
  88. /package/dist/{chunk-35CTCUJ7.js.map → chunk-5RHJVPL7.js.map} +0 -0
  89. /package/dist/{chunk-2YQK6LHR.js.map → chunk-BTIRYGDT.js.map} +0 -0
  90. /package/dist/{chunk-U2JIGUXF.js.map → chunk-FG5ALORQ.js.map} +0 -0
  91. /package/dist/{chunk-ZDUJ6BDI.js.map → chunk-P3ITKTUE.js.map} +0 -0
  92. /package/dist/{chunk-6XNWT2KC.js.map → chunk-QHRNQTW5.js.map} +0 -0
  93. /package/dist/{chunk-ZEC5U5T7.js.map → chunk-SZWMJIH3.js.map} +0 -0
  94. /package/dist/{chunk-CZTKQVIQ.js.map → chunk-U5LU56JE.js.map} +0 -0
  95. /package/dist/{chunk-T4BUS6JV.js.map → chunk-WKWZ7LVC.js.map} +0 -0
  96. /package/dist/{chunk-QF54RPHZ.js.map → chunk-WPFLV4QJ.js.map} +0 -0
@@ -19736,72 +19736,50 @@ function TabContent({
19736
19736
  // src/components/ui/tab-navigation.tsx
19737
19737
  init_next_navigation();
19738
19738
  init_cn();
19739
- import { useState as useState43, useEffect as useEffect34, useDeferredValue, useMemo as useMemo24, useRef as useRef26, useCallback as useCallback19 } from "react";
19739
+ import { useState as useState43, useEffect as useEffect34, useLayoutEffect as useLayoutEffect7, useDeferredValue, useMemo as useMemo24, useRef as useRef26, useCallback as useCallback19, memo as memo4, startTransition } from "react";
19740
19740
  import { Fragment as Fragment32, jsx as jsx139, jsxs as jsxs111 } from "react/jsx-runtime";
19741
- function TabNavigation({
19742
- activeTab: controlledActiveTab,
19743
- onTabChange: controlledOnTabChange,
19741
+ var HIDDEN_INDICATOR = { left: 0, width: 0 };
19742
+ var StatusDot = ({ indicator, className }) => /* @__PURE__ */ jsx139("div", { className: cn(
19743
+ "w-3 h-3 rounded-full border-2 border-ods-bg",
19744
+ indicator === "error" && "bg-ods-error",
19745
+ indicator === "warning" && "bg-ods-accent",
19746
+ indicator === "success" && "bg-ods-success",
19747
+ className
19748
+ ) });
19749
+ var TabBar = memo4(function TabBar2({
19744
19750
  tabs,
19751
+ activeTab,
19752
+ onTabChange,
19745
19753
  className,
19746
19754
  shadowClassName,
19747
- showRightGradient = false,
19748
- showLeftGradient = false,
19749
- stretchTabs = false,
19750
- urlSync = false,
19751
- defaultTab,
19752
- children
19755
+ showLeftGradient,
19756
+ showRightGradient,
19757
+ stretchTabs
19753
19758
  }) {
19754
- const router = useRouter();
19755
- const pathname = usePathname();
19756
- const searchParams = useSearchParams();
19757
- const isUrlSyncEnabled = !!urlSync;
19758
- const paramName = typeof urlSync === "object" ? urlSync.paramName || "tab" : "tab";
19759
- const replaceState = typeof urlSync === "object" ? urlSync.replaceState !== false : true;
19760
- const validTabIds = useMemo24(() => new Set(tabs.map((t) => t.id)), [tabs]);
19761
- const getInitialTab = () => {
19762
- if (isUrlSyncEnabled) {
19763
- const fromUrl = searchParams?.get(paramName) || "";
19764
- if (validTabIds.has(fromUrl)) {
19765
- return fromUrl;
19766
- }
19767
- }
19768
- return defaultTab || tabs[0]?.id || "";
19769
- };
19770
- const [internalActiveTab, setInternalActiveTab] = useState43(getInitialTab);
19771
- const activeTab = isUrlSyncEnabled ? internalActiveTab : controlledActiveTab || "";
19772
- useEffect34(() => {
19773
- if (!isUrlSyncEnabled) return;
19774
- const fromUrl = searchParams?.get(paramName) || "";
19775
- const nextTab = validTabIds.has(fromUrl) ? fromUrl : defaultTab || tabs[0]?.id || "";
19776
- if (nextTab !== internalActiveTab) {
19777
- setInternalActiveTab(nextTab);
19778
- }
19779
- }, [isUrlSyncEnabled, searchParams, paramName, validTabIds, defaultTab, tabs, internalActiveTab]);
19780
- const handleTabChange = (tabId) => {
19781
- if (isUrlSyncEnabled) {
19782
- setInternalActiveTab(tabId);
19783
- const params = new URLSearchParams(searchParams?.toString());
19784
- params.set(paramName, tabId);
19785
- const method = replaceState ? "replace" : "push";
19786
- router[method](`${pathname}?${params.toString()}`);
19787
- controlledOnTabChange?.(tabId);
19788
- } else {
19789
- controlledOnTabChange?.(tabId);
19790
- }
19791
- };
19792
- const deferredActiveTab = useDeferredValue(activeTab);
19793
- const isStale = activeTab !== deferredActiveTab;
19794
19759
  const scrollRef = useRef26(null);
19795
19760
  const activeTabRef = useRef26(null);
19796
19761
  const isFirstActiveScrollRef = useRef26(true);
19797
19762
  const [canScrollLeft, setCanScrollLeft] = useState43(false);
19798
19763
  const [canScrollRight, setCanScrollRight] = useState43(false);
19764
+ const [indicator, setIndicator] = useState43(HIDDEN_INDICATOR);
19765
+ const hasPlacedIndicatorRef = useRef26(false);
19766
+ const measureIndicator = useCallback19(() => {
19767
+ const active = activeTabRef.current;
19768
+ const next = active ? { left: active.offsetLeft, width: active.offsetWidth } : HIDDEN_INDICATOR;
19769
+ setIndicator((prev) => prev.left === next.left && prev.width === next.width ? prev : next);
19770
+ }, []);
19799
19771
  const updateScrollShadows = useCallback19(() => {
19800
19772
  const el = scrollRef.current;
19801
19773
  if (!el) return;
19802
19774
  setCanScrollLeft(el.scrollLeft > 0);
19803
19775
  setCanScrollRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);
19804
19776
  }, []);
19777
+ useLayoutEffect7(() => {
19778
+ measureIndicator();
19779
+ }, [measureIndicator, activeTab, tabs]);
19780
+ useLayoutEffect7(() => {
19781
+ if (indicator.width > 0) hasPlacedIndicatorRef.current = true;
19782
+ }, [indicator]);
19805
19783
  useEffect34(() => {
19806
19784
  const el = scrollRef.current;
19807
19785
  if (!el) return;
@@ -19818,14 +19796,23 @@ function TabNavigation({
19818
19796
  };
19819
19797
  el.addEventListener("scroll", updateScrollShadows, { passive: true });
19820
19798
  el.addEventListener("wheel", onWheel, { passive: false });
19821
- const ro = new ResizeObserver(updateScrollShadows);
19799
+ const ro = new ResizeObserver(() => {
19800
+ updateScrollShadows();
19801
+ measureIndicator();
19802
+ });
19822
19803
  ro.observe(el);
19804
+ let cancelled = false;
19805
+ document.fonts?.ready.then(() => {
19806
+ if (!cancelled) measureIndicator();
19807
+ }).catch(() => {
19808
+ });
19823
19809
  return () => {
19810
+ cancelled = true;
19824
19811
  el.removeEventListener("scroll", updateScrollShadows);
19825
19812
  el.removeEventListener("wheel", onWheel);
19826
19813
  ro.disconnect();
19827
19814
  };
19828
- }, [updateScrollShadows]);
19815
+ }, [updateScrollShadows, measureIndicator]);
19829
19816
  useEffect34(() => {
19830
19817
  const el = scrollRef.current;
19831
19818
  const active = activeTabRef.current;
@@ -19842,7 +19829,7 @@ function TabNavigation({
19842
19829
  }, [activeTab]);
19843
19830
  const leftFade = canScrollLeft || showLeftGradient;
19844
19831
  const rightFade = canScrollRight || showRightGradient;
19845
- const borderStyle = (() => {
19832
+ const borderStyle = useMemo24(() => {
19846
19833
  const c = "var(--color-border-default)";
19847
19834
  if (leftFade && rightFade) {
19848
19835
  return { background: `linear-gradient(to right, transparent 0, ${c} 40px, ${c} calc(100% - 40px), transparent 100%)` };
@@ -19854,20 +19841,37 @@ function TabNavigation({
19854
19841
  return { background: `linear-gradient(to right, ${c} 0, ${c} calc(100% - 40px), transparent 100%)` };
19855
19842
  }
19856
19843
  return { background: c };
19857
- })();
19858
- return /* @__PURE__ */ jsxs111(Fragment32, { children: [
19859
- /* @__PURE__ */ jsxs111("div", { className: cn("relative w-full", className), children: [
19860
- /* @__PURE__ */ jsx139("div", { ref: scrollRef, className: "flex gap-[var(--spacing-system-xxs)] items-center justify-start h-full overflow-x-auto overflow-y-hidden scrollbar-hide", children: tabs.map((tab) => {
19844
+ }, [leftFade, rightFade]);
19845
+ const isPlaced = indicator.width > 0;
19846
+ const indicatorStyle = {
19847
+ transform: `translateX(${indicator.left}px) scaleX(${indicator.width})`,
19848
+ opacity: isPlaced ? 1 : 0
19849
+ };
19850
+ const shouldAnimateIndicator = hasPlacedIndicatorRef.current;
19851
+ return /* @__PURE__ */ jsxs111("div", { className: cn("relative w-full", className), children: [
19852
+ /* @__PURE__ */ jsxs111("div", { ref: scrollRef, className: "relative flex gap-[var(--spacing-system-xxs)] items-center justify-start h-full overflow-x-auto overflow-y-hidden scrollbar-hide", children: [
19853
+ tabs.map((tab) => {
19861
19854
  const isActive = activeTab === tab.id;
19862
19855
  return /* @__PURE__ */ jsxs111(
19863
19856
  "button",
19864
19857
  {
19865
19858
  ref: isActive ? activeTabRef : void 0,
19866
19859
  type: "button",
19867
- onClick: () => handleTabChange(tab.id),
19860
+ onClick: () => onTabChange(tab.id),
19868
19861
  className: cn(
19869
19862
  "flex gap-[var(--spacing-system-xxs)] items-center justify-center p-[var(--spacing-system-m)] relative shrink-0 cursor-pointer",
19870
- "transition-all duration-200 bg-transparent border-none outline-none",
19863
+ // Named rather than `transition-all`: the only thing that moves
19864
+ // here is colour. `all` also made the browser re-check every
19865
+ // property each frame, including the background GRADIENT — which
19866
+ // never animated anyway, since the inactive state has no
19867
+ // background-image to interpolate from.
19868
+ "transition-colors duration-200 bg-transparent border-none outline-none",
19869
+ // `outline-none` above drops the browser's own focus ring, so
19870
+ // put one back or the strip is un-navigable by keyboard — you
19871
+ // can tab through it with nothing to show where you are. Inset,
19872
+ // so it stays within the button instead of overlapping the tab
19873
+ // sitting 4px away.
19874
+ "focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ods-focus",
19871
19875
  stretchTabs && "flex-1",
19872
19876
  // Known limitation: ODS color vars hold hex values, so Tailwind
19873
19877
  // alpha modifiers (to-ods-accent/10) silently produce no CSS.
@@ -19882,36 +19886,123 @@ function TabNavigation({
19882
19886
  className: cn("h-4 w-4 md:h-6 md:w-6 transition-colors", isActive ? "text-ods-accent" : "text-ods-text-secondary")
19883
19887
  }
19884
19888
  ),
19885
- tab.indicator && /* @__PURE__ */ jsx139("div", { className: cn(
19886
- "absolute right-0 top-[-3px] w-3 h-3 rounded-full border-2 border-ods-bg",
19887
- tab.indicator === "error" && "bg-ods-error",
19888
- tab.indicator === "warning" && "bg-ods-accent",
19889
- tab.indicator === "success" && "bg-ods-success"
19890
- ) })
19889
+ tab.indicator && /* @__PURE__ */ jsx139(StatusDot, { indicator: tab.indicator, className: "absolute right-0 top-[-3px]" })
19891
19890
  ] }) : tab.indicator ? (
19892
19891
  // Text-only tabs keep their status badge — inline dot before
19893
19892
  // the label (there's no icon corner to anchor to).
19894
- /* @__PURE__ */ jsx139("div", { className: cn(
19895
- "w-3 h-3 shrink-0 rounded-full border-2 border-ods-bg",
19896
- tab.indicator === "error" && "bg-ods-error",
19897
- tab.indicator === "warning" && "bg-ods-accent",
19898
- tab.indicator === "success" && "bg-ods-success"
19899
- ) })
19893
+ /* @__PURE__ */ jsx139(StatusDot, { indicator: tab.indicator, className: "shrink-0" })
19900
19894
  ) : null,
19901
19895
  /* @__PURE__ */ jsx139("span", { className: cn(
19902
19896
  "text-h4 whitespace-nowrap transition-colors",
19903
19897
  isActive ? "text-ods-text-primary" : "text-ods-text-secondary"
19904
- ), children: tab.label }),
19905
- isActive && /* @__PURE__ */ jsx139("div", { className: "absolute bottom-0 left-0 right-0 h-1 bg-ods-accent" })
19898
+ ), children: tab.label })
19906
19899
  ]
19907
19900
  },
19908
19901
  tab.id
19909
19902
  );
19910
- }) }),
19911
- leftFade && /* @__PURE__ */ jsx139("div", { className: cn("absolute left-0 top-0 bottom-0 w-10 pointer-events-none bg-gradient-to-r to-transparent", shadowClassName || "from-ods-bg") }),
19912
- rightFade && /* @__PURE__ */ jsx139("div", { className: cn("absolute right-0 top-0 bottom-0 w-10 pointer-events-none bg-gradient-to-l to-transparent", shadowClassName || "from-ods-bg") }),
19913
- /* @__PURE__ */ jsx139("div", { className: "absolute bottom-0 left-0 right-0 h-px pointer-events-none", style: borderStyle })
19903
+ }),
19904
+ /* @__PURE__ */ jsx139(
19905
+ "div",
19906
+ {
19907
+ "aria-hidden": true,
19908
+ className: cn(
19909
+ "pointer-events-none absolute bottom-0 left-0 h-1 w-px origin-left bg-ods-accent",
19910
+ shouldAnimateIndicator && "transition-[transform,opacity] duration-200 ease-out motion-reduce:transition-none"
19911
+ ),
19912
+ style: indicatorStyle
19913
+ }
19914
+ )
19914
19915
  ] }),
19916
+ leftFade && /* @__PURE__ */ jsx139("div", { className: cn("absolute left-0 top-0 bottom-0 w-10 pointer-events-none bg-gradient-to-r to-transparent", shadowClassName || "from-ods-bg") }),
19917
+ rightFade && /* @__PURE__ */ jsx139("div", { className: cn("absolute right-0 top-0 bottom-0 w-10 pointer-events-none bg-gradient-to-l to-transparent", shadowClassName || "from-ods-bg") }),
19918
+ /* @__PURE__ */ jsx139("div", { className: "absolute bottom-0 left-0 right-0 h-px pointer-events-none", style: borderStyle })
19919
+ ] });
19920
+ });
19921
+ function TabNavigation({
19922
+ activeTab: controlledActiveTab,
19923
+ onTabChange: controlledOnTabChange,
19924
+ tabs,
19925
+ className,
19926
+ shadowClassName,
19927
+ showRightGradient = false,
19928
+ showLeftGradient = false,
19929
+ stretchTabs = false,
19930
+ urlSync = false,
19931
+ defaultTab,
19932
+ children
19933
+ }) {
19934
+ const router = useRouter();
19935
+ const pathname = usePathname();
19936
+ const searchParams = useSearchParams();
19937
+ const isUrlSyncEnabled = !!urlSync;
19938
+ const paramName = typeof urlSync === "object" ? urlSync.paramName || "tab" : "tab";
19939
+ const replaceState = typeof urlSync === "object" ? urlSync.replaceState !== false : true;
19940
+ const validTabIds = useMemo24(() => new Set(tabs.map((t) => t.id)), [tabs]);
19941
+ const fallbackTab = defaultTab || tabs[0]?.id || "";
19942
+ const urlTab = isUrlSyncEnabled ? searchParams?.get(paramName) || "" : "";
19943
+ const getInitialTab = () => {
19944
+ if (isUrlSyncEnabled && validTabIds.has(urlTab)) return urlTab;
19945
+ return fallbackTab;
19946
+ };
19947
+ const [internalActiveTab, setInternalActiveTab] = useState43(getInitialTab);
19948
+ const activeTab = isUrlSyncEnabled ? internalActiveTab : controlledActiveTab || "";
19949
+ const lastSyncedUrlTabRef = useRef26(urlTab);
19950
+ const inFlightUrlTabsRef = useRef26([]);
19951
+ useEffect34(() => {
19952
+ if (!isUrlSyncEnabled) return;
19953
+ const landed = inFlightUrlTabsRef.current.indexOf(urlTab);
19954
+ if (landed !== -1) {
19955
+ inFlightUrlTabsRef.current.splice(0, landed + 1);
19956
+ lastSyncedUrlTabRef.current = urlTab;
19957
+ return;
19958
+ }
19959
+ if (urlTab === lastSyncedUrlTabRef.current) {
19960
+ setInternalActiveTab(
19961
+ (prev) => validTabIds.has(prev) ? prev : validTabIds.has(urlTab) ? urlTab : fallbackTab
19962
+ );
19963
+ return;
19964
+ }
19965
+ inFlightUrlTabsRef.current.length = 0;
19966
+ lastSyncedUrlTabRef.current = urlTab;
19967
+ setInternalActiveTab(validTabIds.has(urlTab) ? urlTab : fallbackTab);
19968
+ }, [isUrlSyncEnabled, urlTab, validTabIds, fallbackTab]);
19969
+ const navRef = useRef26({ isUrlSyncEnabled, controlledOnTabChange, searchParams, pathname, paramName, replaceState });
19970
+ useEffect34(() => {
19971
+ navRef.current = { isUrlSyncEnabled, controlledOnTabChange, searchParams, pathname, paramName, replaceState };
19972
+ });
19973
+ const handleTabChange = useCallback19((tabId) => {
19974
+ const nav = navRef.current;
19975
+ if (!nav.isUrlSyncEnabled) {
19976
+ nav.controlledOnTabChange?.(tabId);
19977
+ return;
19978
+ }
19979
+ setInternalActiveTab(tabId);
19980
+ const inFlight = inFlightUrlTabsRef.current;
19981
+ if (inFlight[inFlight.length - 1] !== tabId) inFlight.push(tabId);
19982
+ const params = new URLSearchParams(nav.searchParams?.toString());
19983
+ params.set(nav.paramName, tabId);
19984
+ const method = nav.replaceState ? "replace" : "push";
19985
+ startTransition(() => {
19986
+ router[method](`${nav.pathname}?${params.toString()}`, { scroll: false });
19987
+ });
19988
+ nav.controlledOnTabChange?.(tabId);
19989
+ }, [router]);
19990
+ const deferredActiveTab = useDeferredValue(activeTab);
19991
+ const isStale = activeTab !== deferredActiveTab;
19992
+ return /* @__PURE__ */ jsxs111(Fragment32, { children: [
19993
+ /* @__PURE__ */ jsx139(
19994
+ TabBar,
19995
+ {
19996
+ tabs,
19997
+ activeTab,
19998
+ onTabChange: handleTabChange,
19999
+ className,
20000
+ shadowClassName,
20001
+ showLeftGradient,
20002
+ showRightGradient,
20003
+ stretchTabs
20004
+ }
20005
+ ),
19915
20006
  children && children(deferredActiveTab, { isStale })
19916
20007
  ] });
19917
20008
  }
@@ -20351,12 +20442,12 @@ var socialCache = SocialEmbedCache.getInstance();
20351
20442
 
20352
20443
  // src/components/media-carousel.tsx
20353
20444
  init_cn();
20354
- import { useState as useState45, useRef as useRef28, useEffect as useEffect36, memo as memo4, useCallback as useCallback20 } from "react";
20445
+ import { useState as useState45, useRef as useRef28, useEffect as useEffect36, memo as memo5, useCallback as useCallback20 } from "react";
20355
20446
  init_button2();
20356
20447
  import { Fragment as Fragment34, jsx as jsx144, jsxs as jsxs114 } from "react/jsx-runtime";
20357
20448
  var ChevronLeftIcon = () => /* @__PURE__ */ jsx144("svg", { width: "24", height: "24", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx144("polyline", { points: "15,18 9,12 15,6" }) });
20358
20449
  var ChevronRightIcon = () => /* @__PURE__ */ jsx144("svg", { width: "24", height: "24", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx144("polyline", { points: "9,18 15,12 9,6" }) });
20359
- var MediaCarousel = memo4(function MediaCarousel2({
20450
+ var MediaCarousel = memo5(function MediaCarousel2({
20360
20451
  media,
20361
20452
  className,
20362
20453
  aspectRatio = "16/9",
@@ -32418,7 +32509,7 @@ function FloatingWalkthroughVideo({
32418
32509
  ),
32419
32510
  /* @__PURE__ */ jsxs190("span", { className: "pointer-events-none absolute bottom-[var(--spacing-system-xsf)] left-[var(--spacing-system-xsf)] z-20 flex max-w-[calc(100%-2*var(--spacing-system-xsf))] items-center gap-[var(--spacing-system-xsf)] rounded-full bg-ods-overlay py-[var(--spacing-system-xxs)] pl-[var(--spacing-system-xxs)] pr-[var(--spacing-system-sf)] text-h6 text-ods-text-primary", children: [
32420
32511
  presenterAvatarSrc ? /* @__PURE__ */ jsx242(SquareAvatar, { src: presenterAvatarSrc, alt: "", sizePx: 20, variant: "round", className: "shrink-0 border-0" }) : /* @__PURE__ */ jsx242(VideoPlayBadge, { size: "sm", className: "h-5 w-5 shrink-0" }),
32421
- /* @__PURE__ */ jsx242("span", { className: "truncate", children: label })
32512
+ /* @__PURE__ */ jsx242("span", { className: "truncate", children: summaryTitle || label })
32422
32513
  ] }),
32423
32514
  showBigUnmute && /* @__PURE__ */ jsx242(
32424
32515
  Button,
@@ -38352,7 +38443,7 @@ function useSectionNavigation(sections, options) {
38352
38443
  }
38353
38444
 
38354
38445
  // src/components/navigation/navigation-sidebar.tsx
38355
- import { useCallback as useCallback37, useEffect as useEffect70, useLayoutEffect as useLayoutEffect7, useMemo as useMemo39, useState as useState93 } from "react";
38446
+ import { useCallback as useCallback37, useEffect as useEffect70, useLayoutEffect as useLayoutEffect8, useMemo as useMemo39, useState as useState93 } from "react";
38356
38447
 
38357
38448
  // src/components/navigation/navigation-sidebar-header.tsx
38358
38449
  import { jsx as jsx288, jsxs as jsxs226 } from "react/jsx-runtime";
@@ -38381,65 +38472,75 @@ function NavigationSidebarHeader({ minimized }) {
38381
38472
  }
38382
38473
 
38383
38474
  // src/components/navigation/navigation-sidebar-item.tsx
38384
- import { cloneElement } from "react";
38385
- import { jsx as jsx289, jsxs as jsxs227 } from "react/jsx-runtime";
38386
- function NavigationSidebarItemButton({
38475
+ init_next_link();
38476
+ import { cloneElement, memo as memo6 } from "react";
38477
+ import { Fragment as Fragment59, jsx as jsx289, jsxs as jsxs227 } from "react/jsx-runtime";
38478
+ var NavigationSidebarItemButton = memo6(function NavigationSidebarItemButton2({
38387
38479
  item,
38480
+ isActive,
38481
+ isPending,
38388
38482
  showLabel,
38389
38483
  disabled,
38390
38484
  onClick
38391
38485
  }) {
38392
- const isActive = item.isActive ?? false;
38393
38486
  const unreadCount = item.unreadCount ?? 0;
38394
38487
  const hasUnread = unreadCount > 0;
38395
- return /* @__PURE__ */ jsxs227(
38396
- "button",
38397
- {
38398
- onClick: (event) => onClick(item, event),
38399
- disabled,
38400
- className: cn(
38401
- "w-full flex items-center justify-start relative",
38402
- "h-14 p-[var(--spacing-system-m)]",
38403
- "transition-colors duration-300",
38404
- "[&_svg]:transition-colors [&_svg]:duration-300",
38405
- "before:content-[''] before:absolute before:left-0 before:top-0 before:bottom-0 before:w-1",
38406
- "before:transition-colors before:duration-300",
38407
- !isActive && !disabled && "hover:bg-ods-bg-hover text-ods-text-primary [&_svg]:fill-ods-text-secondary",
38408
- !isActive && disabled && "text-ods-text-secondary [&_svg]:fill-ods-text-secondary",
38409
- isActive && !disabled && [
38410
- "bg-[var(--ods-open-yellow-light)] text-ods-accent",
38411
- "[&_svg]:fill-ods-accent",
38412
- "before:bg-ods-accent"
38413
- ],
38414
- isActive && disabled && "text-ods-text-secondary [&_svg]:fill-ods-text-secondary",
38415
- disabled && "cursor-not-allowed opacity-50"
38416
- ),
38417
- title: !showLabel ? item.label : void 0,
38418
- "aria-label": item.label,
38419
- "aria-current": isActive ? "page" : void 0,
38420
- children: [
38421
- /* @__PURE__ */ jsxs227("div", { className: "relative flex items-center justify-center flex-shrink-0", children: [
38422
- cloneElement(item.icon, {
38423
- color: isActive && !disabled ? "text-ods-accent" : "text-ods-text-secondary"
38424
- }),
38425
- hasUnread && !showLabel && /* @__PURE__ */ jsx289("span", { className: "absolute top-0 right-0 bg-ods-warning rounded-full w-2 h-2" })
38426
- ] }),
38427
- /* @__PURE__ */ jsx289(
38428
- "span",
38429
- {
38430
- className: cn(
38431
- "text-h4 flex-1 text-left truncate transition-[opacity,margin-left] duration-300",
38432
- showLabel ? "opacity-100 ml-[var(--spacing-system-xs)]" : "opacity-0 ml-0"
38433
- ),
38434
- "aria-hidden": !showLabel,
38435
- children: item.label
38436
- }
38437
- ),
38438
- hasUnread && showLabel && /* @__PURE__ */ jsx289("span", { className: "bg-ods-accent flex items-center justify-center flex-shrink-0 p-2 rounded-md size-6", children: /* @__PURE__ */ jsx289("span", { className: "text-h5 text-ods-text-on-accent", children: unreadCount > 99 ? "99+" : unreadCount }) })
38439
- ]
38440
- }
38488
+ const className = cn(
38489
+ "w-full flex items-center justify-start relative",
38490
+ "h-14 p-[var(--spacing-system-m)]",
38491
+ // 150ms, not 300: the outgoing and incoming entries cross-fade, so for the
38492
+ // whole duration TWO rows read as half-active. At 300ms that window is long
38493
+ // enough to look like a flicker rather than a transition.
38494
+ "transition-colors duration-150",
38495
+ "[&_svg]:transition-colors [&_svg]:duration-150",
38496
+ "before:content-[''] before:absolute before:left-0 before:top-0 before:bottom-0 before:w-1",
38497
+ "before:transition-colors before:duration-150",
38498
+ // Pending borrows the HOVER weight and nothing else — no accent bar, no
38499
+ // accent text, no `aria-current`. It says "this row is working", not "this
38500
+ // is where you are", and it reads as the row staying pressed under the
38501
+ // cursor, which is exactly what happened.
38502
+ !isActive && !disabled && "hover:bg-ods-bg-hover text-ods-text-primary [&_svg]:fill-ods-text-secondary",
38503
+ !isActive && !disabled && isPending && "bg-ods-bg-hover",
38504
+ !isActive && disabled && "text-ods-text-secondary [&_svg]:fill-ods-text-secondary",
38505
+ isActive && !disabled && [
38506
+ "bg-[var(--ods-open-yellow-light)] text-ods-accent",
38507
+ "[&_svg]:fill-ods-accent",
38508
+ "before:bg-ods-accent"
38509
+ ],
38510
+ isActive && disabled && "text-ods-text-secondary [&_svg]:fill-ods-text-secondary",
38511
+ disabled && "cursor-not-allowed opacity-50"
38441
38512
  );
38442
- }
38513
+ const content = /* @__PURE__ */ jsxs227(Fragment59, { children: [
38514
+ /* @__PURE__ */ jsxs227("div", { className: "relative flex items-center justify-center flex-shrink-0", children: [
38515
+ cloneElement(item.icon, {
38516
+ color: isActive && !disabled ? "text-ods-accent" : "text-ods-text-secondary"
38517
+ }),
38518
+ hasUnread && !showLabel && /* @__PURE__ */ jsx289("span", { className: "absolute top-0 right-0 bg-ods-warning rounded-full w-2 h-2" })
38519
+ ] }),
38520
+ /* @__PURE__ */ jsx289(
38521
+ "span",
38522
+ {
38523
+ className: cn(
38524
+ "text-h4 flex-1 text-left truncate transition-[opacity,margin-left] duration-300",
38525
+ showLabel ? "opacity-100 ml-[var(--spacing-system-xs)]" : "opacity-0 ml-0"
38526
+ ),
38527
+ "aria-hidden": !showLabel,
38528
+ children: item.label
38529
+ }
38530
+ ),
38531
+ hasUnread && showLabel && /* @__PURE__ */ jsx289("span", { className: "bg-ods-accent flex items-center justify-center flex-shrink-0 p-2 rounded-md size-6", children: /* @__PURE__ */ jsx289("span", { className: "text-h5 text-ods-text-on-accent", children: unreadCount > 99 ? "99+" : unreadCount }) })
38532
+ ] });
38533
+ const shared = {
38534
+ className,
38535
+ title: !showLabel ? item.label : void 0,
38536
+ "aria-label": item.label,
38537
+ "aria-current": isActive ? "page" : void 0
38538
+ };
38539
+ if (disabled || !item.path || item.onClick) {
38540
+ return /* @__PURE__ */ jsx289("button", { type: "button", onClick: (event) => onClick(item, event), disabled, ...shared, children: content });
38541
+ }
38542
+ return /* @__PURE__ */ jsx289(next_link_default, { href: item.path, onClick: (event) => onClick(item, event), ...shared, children: content });
38543
+ });
38443
38544
 
38444
38545
  // src/components/navigation/navigation-sidebar-toggle.tsx
38445
38546
  import { jsx as jsx290, jsxs as jsxs228 } from "react/jsx-runtime";
@@ -38488,10 +38589,11 @@ function NavigationSidebarToggle({
38488
38589
  }
38489
38590
 
38490
38591
  // src/components/navigation/navigation-sidebar.tsx
38491
- import { Fragment as Fragment59, jsx as jsx291, jsxs as jsxs229 } from "react/jsx-runtime";
38592
+ import { Fragment as Fragment60, jsx as jsx291, jsxs as jsxs229 } from "react/jsx-runtime";
38492
38593
  var MINIMIZED_WIDTH = 56;
38493
38594
  var EXPANDED_WIDTH = 224;
38494
38595
  var STORAGE_KEY = "of.navigationSidebar.minimized";
38596
+ var isModifiedClick = (event) => !!event && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0);
38495
38597
  function NavigationSidebar({ config, disabled = false }) {
38496
38598
  const isMdUp = useMdUp() ?? false;
38497
38599
  const isLgUp = useLgUp() ?? false;
@@ -38527,15 +38629,30 @@ function NavigationSidebar({ config, disabled = false }) {
38527
38629
  document.addEventListener("keydown", handleKeyDown);
38528
38630
  return () => document.removeEventListener("keydown", handleKeyDown);
38529
38631
  }, [isOverlayOpen, closeOverlay]);
38632
+ const [pendingItemId, setPendingItemId] = useState93(null);
38633
+ const committedActiveId = useMemo39(
38634
+ () => config.items.find((item) => item.isActive)?.id ?? null,
38635
+ [config.items]
38636
+ );
38637
+ useEffect70(() => {
38638
+ setPendingItemId(null);
38639
+ }, [committedActiveId]);
38530
38640
  const handleItemClick = useCallback37((item, event) => {
38531
38641
  event?.stopPropagation();
38532
38642
  if (item.onClick) {
38533
38643
  item.onClick();
38534
- } else if (item.path) {
38535
- config.onNavigate?.(item.path);
38644
+ if (isTablet) setTabletMinimized(true);
38645
+ return;
38646
+ }
38647
+ if (!item.path) return;
38648
+ if (isModifiedClick(event)) return;
38649
+ if (config.onNavigate) {
38650
+ event?.preventDefault();
38651
+ if (item.id !== committedActiveId) setPendingItemId(item.id);
38652
+ config.onNavigate(item.path);
38536
38653
  }
38537
38654
  if (isTablet) setTabletMinimized(true);
38538
- }, [config, isTablet]);
38655
+ }, [config, isTablet, committedActiveId]);
38539
38656
  const { primaryItems, secondaryItems } = useMemo39(() => ({
38540
38657
  primaryItems: config.items.filter((item) => item.section !== "secondary"),
38541
38658
  secondaryItems: config.items.filter((item) => item.section === "secondary")
@@ -38544,16 +38661,15 @@ function NavigationSidebar({ config, disabled = false }) {
38544
38661
  () => minimized ? `${MINIMIZED_WIDTH}px` : `${EXPANDED_WIDTH}px`,
38545
38662
  [minimized]
38546
38663
  );
38547
- const isHydrated = isMdUp !== void 0 && isLgUp !== void 0;
38548
- useLayoutEffect7(() => {
38549
- if (isHydrated && !transitionsEnabled) {
38664
+ useLayoutEffect8(() => {
38665
+ if (!transitionsEnabled) {
38550
38666
  const id = requestAnimationFrame(() => {
38551
38667
  setTransitionsEnabled(true);
38552
38668
  });
38553
38669
  return () => cancelAnimationFrame(id);
38554
38670
  }
38555
- }, [isHydrated, transitionsEnabled]);
38556
- return /* @__PURE__ */ jsxs229(Fragment59, { children: [
38671
+ }, [transitionsEnabled]);
38672
+ return /* @__PURE__ */ jsxs229(Fragment60, { children: [
38557
38673
  /* @__PURE__ */ jsx291(
38558
38674
  "div",
38559
38675
  {
@@ -38575,7 +38691,7 @@ function NavigationSidebar({ config, disabled = false }) {
38575
38691
  "aria-hidden": "true"
38576
38692
  }
38577
38693
  ),
38578
- /* @__PURE__ */ jsx291(
38694
+ /* @__PURE__ */ jsxs229(
38579
38695
  "aside",
38580
38696
  {
38581
38697
  className: cn(
@@ -38592,13 +38708,15 @@ function NavigationSidebar({ config, disabled = false }) {
38592
38708
  ),
38593
38709
  style: { width: sidebarWidth },
38594
38710
  "aria-label": "Main navigation sidebar",
38595
- children: isHydrated && /* @__PURE__ */ jsxs229(Fragment59, { children: [
38711
+ children: [
38596
38712
  /* @__PURE__ */ jsx291(NavigationSidebarHeader, { minimized }),
38597
38713
  /* @__PURE__ */ jsxs229("div", { className: "flex-1 flex flex-col justify-between py-4 overflow-y-auto", children: [
38598
38714
  /* @__PURE__ */ jsx291("nav", { className: "flex flex-col", "aria-label": "Primary navigation", children: primaryItems.map((item) => /* @__PURE__ */ jsx291(
38599
38715
  NavigationSidebarItemButton,
38600
38716
  {
38601
38717
  item,
38718
+ isActive: item.id === committedActiveId,
38719
+ isPending: item.id === pendingItemId,
38602
38720
  showLabel,
38603
38721
  disabled,
38604
38722
  onClick: handleItemClick
@@ -38609,6 +38727,8 @@ function NavigationSidebar({ config, disabled = false }) {
38609
38727
  NavigationSidebarItemButton,
38610
38728
  {
38611
38729
  item,
38730
+ isActive: item.id === committedActiveId,
38731
+ isPending: item.id === pendingItemId,
38612
38732
  showLabel,
38613
38733
  disabled,
38614
38734
  onClick: handleItemClick
@@ -38624,7 +38744,7 @@ function NavigationSidebar({ config, disabled = false }) {
38624
38744
  onToggle: handleToggle
38625
38745
  }
38626
38746
  )
38627
- ] })
38747
+ ]
38628
38748
  }
38629
38749
  )
38630
38750
  ] });
@@ -39005,7 +39125,7 @@ import { Suspense as Suspense2, useCallback as useCallback39, useMemo as useMemo
39005
39125
  // src/components/navigation/mobile-burger-menu.tsx
39006
39126
  import React117, { useCallback as useCallback38, useRef as useRef52 } from "react";
39007
39127
  import { usePreventScroll as usePreventScroll5 } from "@react-aria/overlays";
39008
- import { Fragment as Fragment60, jsx as jsx296, jsxs as jsxs234 } from "react/jsx-runtime";
39128
+ import { Fragment as Fragment61, jsx as jsx296, jsxs as jsxs234 } from "react/jsx-runtime";
39009
39129
  var HEADER_HEIGHT = 48;
39010
39130
  var MobileBurgerMenu = React117.memo(function MobileBurgerMenu2({
39011
39131
  isOpen,
@@ -39065,7 +39185,7 @@ var MobileBurgerMenu = React117.memo(function MobileBurgerMenu2({
39065
39185
  );
39066
39186
  };
39067
39187
  const renderNavigationGrid = (items) => /* @__PURE__ */ jsx296("div", { className: "grid grid-cols-2 gap-3", children: items.map((item) => /* @__PURE__ */ jsx296(React117.Fragment, { children: renderNavigationItem(item, true) }, item.id)) });
39068
- return /* @__PURE__ */ jsxs234(Fragment60, { children: [
39188
+ return /* @__PURE__ */ jsxs234(Fragment61, { children: [
39069
39189
  /* @__PURE__ */ jsx296(
39070
39190
  "div",
39071
39191
  {
@@ -39829,7 +39949,7 @@ import React119, { useRef as useRef54, useCallback as useCallback40 } from "reac
39829
39949
  import React118 from "react";
39830
39950
  init_button2();
39831
39951
  init_cn();
39832
- import { Fragment as Fragment61, jsx as jsx306, jsxs as jsxs244 } from "react/jsx-runtime";
39952
+ import { Fragment as Fragment62, jsx as jsx306, jsxs as jsxs244 } from "react/jsx-runtime";
39833
39953
  function OnboardingStepCard({
39834
39954
  step,
39835
39955
  isCompleted,
@@ -39871,10 +39991,10 @@ function OnboardingStepCard({
39871
39991
  /* @__PURE__ */ jsx306("h3", { className: "text-h4 text-ods-text-primary truncate", title: step.title, children: step.title }),
39872
39992
  /* @__PURE__ */ jsx306("p", { className: "text-h6 text-ods-text-secondary truncate h-[20px]", title: step.description, children: step.description })
39873
39993
  ] }),
39874
- /* @__PURE__ */ jsx306("div", { className: "flex items-center gap-2 w-full md:w-auto justify-start md:justify-end shrink-0", onClick: (e) => e.stopPropagation(), children: isCheckingCompletion ? /* @__PURE__ */ jsxs244(Fragment61, { children: [
39994
+ /* @__PURE__ */ jsx306("div", { className: "flex items-center gap-2 w-full md:w-auto justify-start md:justify-end shrink-0", onClick: (e) => e.stopPropagation(), children: isCheckingCompletion ? /* @__PURE__ */ jsxs244(Fragment62, { children: [
39875
39995
  /* @__PURE__ */ jsx306("div", { className: "h-[32px] w-[100px] bg-ods-border rounded-[6px] animate-pulse" }),
39876
39996
  /* @__PURE__ */ jsx306("div", { className: "h-[32px] w-[120px] bg-ods-border rounded-[6px] animate-pulse" })
39877
- ] }) : isCompleted ? /* @__PURE__ */ jsxs244(Fragment61, { children: [
39997
+ ] }) : isCompleted ? /* @__PURE__ */ jsxs244(Fragment62, { children: [
39878
39998
  /* @__PURE__ */ jsx306(
39879
39999
  StatusBadge,
39880
40000
  {
@@ -39893,14 +40013,14 @@ function OnboardingStepCard({
39893
40013
  children: step.completedText
39894
40014
  }
39895
40015
  )
39896
- ] }) : isSkipped ? /* @__PURE__ */ jsx306(Fragment61, { children: /* @__PURE__ */ jsx306(
40016
+ ] }) : isSkipped ? /* @__PURE__ */ jsx306(Fragment62, { children: /* @__PURE__ */ jsx306(
39897
40017
  StatusBadge,
39898
40018
  {
39899
40019
  text: "SKIPPED",
39900
40020
  variant: "card",
39901
40021
  colorScheme: "default"
39902
40022
  }
39903
- ) }) : /* @__PURE__ */ jsxs244(Fragment61, { children: [
40023
+ ) }) : /* @__PURE__ */ jsxs244(Fragment62, { children: [
39904
40024
  /* @__PURE__ */ jsx306(
39905
40025
  Button,
39906
40026
  {
@@ -40860,7 +40980,7 @@ function getHideClasses(hideAt) {
40860
40980
  }
40861
40981
 
40862
40982
  // src/components/ui/table/table-header.tsx
40863
- import { Fragment as Fragment62, jsx as jsx319, jsxs as jsxs254 } from "react/jsx-runtime";
40983
+ import { Fragment as Fragment63, jsx as jsx319, jsxs as jsxs254 } from "react/jsx-runtime";
40864
40984
  function TableHeader({
40865
40985
  columns,
40866
40986
  className,
@@ -40971,10 +41091,10 @@ function TableHeader({
40971
41091
  column.sortable && "cursor-pointer hover:text-ods-text-primary transition-colors"
40972
41092
  ),
40973
41093
  onClick: () => handleSort(column),
40974
- children: column.renderHeader ? /* @__PURE__ */ jsxs254(Fragment62, { children: [
41094
+ children: column.renderHeader ? /* @__PURE__ */ jsxs254(Fragment63, { children: [
40975
41095
  column.renderHeader(),
40976
41096
  getSortIcon(column)
40977
- ] }) : /* @__PURE__ */ jsxs254(Fragment62, { children: [
41097
+ ] }) : /* @__PURE__ */ jsxs254(Fragment63, { children: [
40978
41098
  /* @__PURE__ */ jsx319("span", { className: "text-h5 text-ods-text-secondary uppercase whitespace-nowrap", children: column.label }),
40979
41099
  getSortIcon(column)
40980
41100
  ] })
@@ -41029,7 +41149,7 @@ function TableCell({
41029
41149
 
41030
41150
  // src/components/ui/table/table-skeleton.tsx
41031
41151
  init_cn();
41032
- import { Fragment as Fragment63, jsx as jsx321, jsxs as jsxs255 } from "react/jsx-runtime";
41152
+ import { Fragment as Fragment64, jsx as jsx321, jsxs as jsxs255 } from "react/jsx-runtime";
41033
41153
  var ROW_HEIGHT_DESKTOP = "h-[66px] md:h-[78px]";
41034
41154
  var ROW_HEIGHT_MOBILE = "h-[66px]";
41035
41155
  function TableCardSkeleton({
@@ -41041,7 +41161,7 @@ function TableCardSkeleton({
41041
41161
  rowClassName
41042
41162
  }) {
41043
41163
  const primaryKey = (columns.find((c) => /flex-(1|\[)/.test(c.width || "")) ?? columns[0])?.key;
41044
- return /* @__PURE__ */ jsx321(Fragment63, { children: Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ jsxs255(
41164
+ return /* @__PURE__ */ jsx321(Fragment64, { children: Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ jsxs255(
41045
41165
  "div",
41046
41166
  {
41047
41167
  className: cn(
@@ -41220,7 +41340,7 @@ function useTableMotion(enabled) {
41220
41340
  }
41221
41341
 
41222
41342
  // src/components/ui/table/table.tsx
41223
- import { Fragment as Fragment64, jsx as jsx323, jsxs as jsxs257 } from "react/jsx-runtime";
41343
+ import { Fragment as Fragment65, jsx as jsx323, jsxs as jsxs257 } from "react/jsx-runtime";
41224
41344
  function injectSyntheticColumns(columns, rowActions, renderRowActions, rowHref) {
41225
41345
  const hasActions = Boolean(rowActions?.length) || Boolean(renderRowActions);
41226
41346
  const result = [...columns];
@@ -41422,7 +41542,7 @@ function Table({
41422
41542
  hasActions: Boolean(rowActions) && rowActions.length > 0,
41423
41543
  hasChevron: Boolean(rowHref)
41424
41544
  }
41425
- ) : data.length === 0 ? /* @__PURE__ */ jsx323(TableEmptyState, { message: emptyMessage }) : /* @__PURE__ */ jsxs257(Fragment64, { children: [
41545
+ ) : data.length === 0 ? /* @__PURE__ */ jsx323(TableEmptyState, { message: emptyMessage }) : /* @__PURE__ */ jsxs257(Fragment65, { children: [
41426
41546
  (() => {
41427
41547
  const rows = data.map((item, index) => /* @__PURE__ */ jsx323(
41428
41548
  TableRow,
@@ -42019,7 +42139,13 @@ function DataTableColumnFilter({
42019
42139
  "div",
42020
42140
  {
42021
42141
  className: cn(
42022
- "group flex w-full items-center gap-[var(--spacing-system-xsf)] py-[var(--spacing-system-sf)] rounded-sm cursor-pointer transition-colors duration-200 select-none",
42142
+ // Fixed 48px per design, same as the plain header cell next to it —
42143
+ // NOT padding around the label. The two were drifting: 12px+20px+12px
42144
+ // came out 44px here while the sibling was pinned to 48, so in a
42145
+ // header mixing filterable and plain columns the labels sat on
42146
+ // different centre lines and the filter's hit area was 4px short of
42147
+ // the row it belongs to.
42148
+ "group flex w-full items-center gap-[var(--spacing-system-xsf)] h-12 rounded-sm cursor-pointer transition-colors duration-200 select-none",
42023
42149
  alignJustify(align)
42024
42150
  ),
42025
42151
  "aria-label": `Filter by ${label}`,
@@ -42048,7 +42174,7 @@ function DataTableColumnFilter({
42048
42174
  }
42049
42175
 
42050
42176
  // src/components/ui/data-table/data-table-header.tsx
42051
- import { Fragment as Fragment65, jsx as jsx332, jsxs as jsxs264 } from "react/jsx-runtime";
42177
+ import { Fragment as Fragment66, jsx as jsx332, jsxs as jsxs264 } from "react/jsx-runtime";
42052
42178
  function DataTableHeader({
42053
42179
  className,
42054
42180
  stickyHeader,
@@ -42086,7 +42212,12 @@ function DataTableHeader({
42086
42212
  },
42087
42213
  header.id
42088
42214
  )),
42089
- rightSlot && (hasVisibleHeaderCell ? /* @__PURE__ */ jsx332("div", { className: "absolute right-[var(--spacing-system-mf)] inset-y-0 flex items-center", children: rightSlot }) : /* @__PURE__ */ jsx332("div", { className: "ml-auto flex items-center py-[var(--spacing-system-sf)]", children: rightSlot }))
42215
+ rightSlot && (hasVisibleHeaderCell ? /* @__PURE__ */ jsx332("div", { className: "absolute right-[var(--spacing-system-mf)] inset-y-0 flex items-center", children: rightSlot }) : (
42216
+ // In-flow fallback: with no visible header cell this slot is the
42217
+ // only thing giving the row height, so it carries the same fixed 48
42218
+ // rather than padding out to 44.
42219
+ /* @__PURE__ */ jsx332("div", { className: "ml-auto flex items-center h-12", children: rightSlot })
42220
+ ))
42090
42221
  ] })
42091
42222
  }
42092
42223
  );
@@ -42146,7 +42277,7 @@ function HeaderLabel({ header }) {
42146
42277
  if (typeof headerDef === "string") {
42147
42278
  return /* @__PURE__ */ jsx332("span", { className: "text-h5 text-ods-text-secondary uppercase whitespace-nowrap transition-colors duration-200 group-hover:text-ods-text-primary", children: headerDef });
42148
42279
  }
42149
- return /* @__PURE__ */ jsx332(Fragment65, { children: flexRender(headerDef, header.getContext()) });
42280
+ return /* @__PURE__ */ jsx332(Fragment66, { children: flexRender(headerDef, header.getContext()) });
42150
42281
  }
42151
42282
  function SortIcon({ sorted }) {
42152
42283
  if (sorted === "asc") return /* @__PURE__ */ jsx332(Arrow01UpIcon, { className: "w-4 h-4 text-ods-accent" });
@@ -42180,12 +42311,12 @@ function DataTableEmpty({ className, ...props }) {
42180
42311
  // src/components/ui/data-table/data-table-row.tsx
42181
42312
  init_next_link();
42182
42313
  init_cn();
42183
- import { memo as memo5, useCallback as useCallback44, useRef as useRef59 } from "react";
42314
+ import { memo as memo7, useCallback as useCallback44, useRef as useRef59 } from "react";
42184
42315
  import { flexRender as flexRender2 } from "@tanstack/react-table";
42185
42316
 
42186
42317
  // src/components/ui/data-table/data-table-skeleton.tsx
42187
42318
  init_cn();
42188
- import { Fragment as Fragment66, jsx as jsx334, jsxs as jsxs265 } from "react/jsx-runtime";
42319
+ import { Fragment as Fragment67, jsx as jsx334, jsxs as jsxs265 } from "react/jsx-runtime";
42189
42320
  var ROW_HEIGHT_DESKTOP2 = "h-[66px] md:h-[78px]";
42190
42321
  var ROW_HEIGHT_MOBILE2 = "h-[66px]";
42191
42322
  function DataTableSkeleton({
@@ -42196,7 +42327,7 @@ function DataTableSkeleton({
42196
42327
  const table = useDataTableContext();
42197
42328
  const columns = table.getVisibleFlatColumns();
42198
42329
  const firstColumnId = columns[0]?.id;
42199
- return /* @__PURE__ */ jsx334(Fragment66, { children: Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ jsxs265(
42330
+ return /* @__PURE__ */ jsx334(Fragment67, { children: Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ jsxs265(
42200
42331
  "div",
42201
42332
  {
42202
42333
  className: cn(
@@ -42219,7 +42350,13 @@ function DataTableSkeleton({
42219
42350
  {
42220
42351
  className: cn(
42221
42352
  "flex flex-col justify-center shrink-0",
42222
- meta?.width || "flex-1"
42353
+ meta?.width || "flex-1",
42354
+ // Same responsive hiding the real header and row apply.
42355
+ // Without it a `hideAt` column was drawn in the skeleton and
42356
+ // absent from the loaded table, so below that breakpoint the
42357
+ // remaining columns were sized against a different total and
42358
+ // the whole row re-laid-out the moment data arrived.
42359
+ getHideClasses2(meta?.hideAt)
42223
42360
  ),
42224
42361
  children: [
42225
42362
  /* @__PURE__ */ jsx334("div", { className: "h-5 bg-ods-bg-surface rounded-sm w-3/4 mb-[var(--spacing-system-xxs)]" }),
@@ -42252,7 +42389,7 @@ function DataTableSkeleton({
42252
42389
  }
42253
42390
 
42254
42391
  // src/components/ui/data-table/data-table-row.tsx
42255
- import { Fragment as Fragment67, jsx as jsx335, jsxs as jsxs266 } from "react/jsx-runtime";
42392
+ import { Fragment as Fragment68, jsx as jsx335, jsxs as jsxs266 } from "react/jsx-runtime";
42256
42393
  function DataTableRowImpl({
42257
42394
  row,
42258
42395
  onClick,
@@ -42349,12 +42486,12 @@ function DataTableRowImpl({
42349
42486
  }
42350
42487
  );
42351
42488
  }
42352
- var DataTableRow = memo5(DataTableRowImpl);
42489
+ var DataTableRow = memo7(DataTableRowImpl);
42353
42490
  function CellContent({ children }) {
42354
42491
  if (typeof children === "string" || typeof children === "number") {
42355
42492
  return /* @__PURE__ */ jsx335("span", { className: "text-h4 text-ods-text-primary truncate", title: String(children), children });
42356
42493
  }
42357
- return /* @__PURE__ */ jsx335(Fragment67, { children });
42494
+ return /* @__PURE__ */ jsx335(Fragment68, { children });
42358
42495
  }
42359
42496
 
42360
42497
  // src/components/ui/data-table/data-table-body.tsx
@@ -42434,7 +42571,7 @@ function DataTableBody({
42434
42571
 
42435
42572
  // src/components/ui/data-table/data-table-infinite-footer.tsx
42436
42573
  import { useEffect as useEffect73, useRef as useRef60 } from "react";
42437
- import { Fragment as Fragment68, jsx as jsx337, jsxs as jsxs268 } from "react/jsx-runtime";
42574
+ import { Fragment as Fragment69, jsx as jsx337, jsxs as jsxs268 } from "react/jsx-runtime";
42438
42575
  function DataTableInfiniteFooter({
42439
42576
  hasNextPage,
42440
42577
  isFetchingNextPage,
@@ -42458,7 +42595,7 @@ function DataTableInfiniteFooter({
42458
42595
  observer.observe(sentinel);
42459
42596
  return () => observer.disconnect();
42460
42597
  }, [hasNextPage, isFetchingNextPage, rootMargin]);
42461
- return /* @__PURE__ */ jsxs268(Fragment68, { children: [
42598
+ return /* @__PURE__ */ jsxs268(Fragment69, { children: [
42462
42599
  isFetchingNextPage && /* @__PURE__ */ jsx337(DataTableSkeleton, { rows: skeletonRows }),
42463
42600
  hasNextPage && /* @__PURE__ */ jsx337("div", { ref: sentinelRef, className: "h-1", "aria-hidden": "true" })
42464
42601
  ] });
@@ -43876,7 +44013,7 @@ function FileUpload({
43876
44013
  import * as React130 from "react";
43877
44014
  import { Loader2 as Loader210 } from "lucide-react";
43878
44015
  init_cn();
43879
- import { Fragment as Fragment70, jsx as jsx344, jsxs as jsxs275 } from "react/jsx-runtime";
44016
+ import { Fragment as Fragment71, jsx as jsx344, jsxs as jsxs275 } from "react/jsx-runtime";
43880
44017
  var DEFAULT_MAX_SIZE = 25 * 1024 * 1024;
43881
44018
  function formatSize(bytes) {
43882
44019
  const mb = bytes / (1024 * 1024);
@@ -44005,7 +44142,7 @@ function ImageUploader({
44005
44142
  !hasImage && !interactive && "cursor-not-allowed",
44006
44143
  dropzoneClassName
44007
44144
  ),
44008
- children: hasImage ? /* @__PURE__ */ jsxs275(Fragment70, { children: [
44145
+ children: hasImage ? /* @__PURE__ */ jsxs275(Fragment71, { children: [
44009
44146
  /* @__PURE__ */ jsx344("div", { className: "relative min-h-0 w-full flex-1 overflow-hidden rounded-md", children: resolvedValue && /* @__PURE__ */ jsx344(
44010
44147
  "img",
44011
44148
  {
@@ -44042,7 +44179,7 @@ function ImageUploader({
44042
44179
  )
44043
44180
  ] }),
44044
44181
  loading && /* @__PURE__ */ jsx344("div", { className: "absolute inset-0 flex items-center justify-center rounded-md bg-ods-overlay", children: /* @__PURE__ */ jsx344(Loader210, { className: "size-8 animate-spin text-ods-text-on-dark" }) })
44045
- ] }) : loading ? /* @__PURE__ */ jsx344(Loader210, { className: "size-8 animate-spin text-ods-accent" }) : /* @__PURE__ */ jsxs275(Fragment70, { children: [
44182
+ ] }) : loading ? /* @__PURE__ */ jsx344(Loader210, { className: "size-8 animate-spin text-ods-accent" }) : /* @__PURE__ */ jsxs275(Fragment71, { children: [
44046
44183
  /* @__PURE__ */ jsx344("div", { className: "flex shrink-0 items-center justify-center rounded-full border border-ods-border bg-ods-card p-[var(--spacing-system-s)]", children: /* @__PURE__ */ jsx344(ImagePlusIcon, { className: "size-6 text-ods-text-primary" }) }),
44047
44184
  /* @__PURE__ */ jsxs275("div", { className: "flex w-full flex-col items-center text-center", children: [
44048
44185
  /* @__PURE__ */ jsx344("p", { className: "text-h4 text-ods-text-primary", children: label }),
@@ -44112,7 +44249,7 @@ PopoverContent.displayName = PopoverPrimitive7.Content.displayName;
44112
44249
 
44113
44250
  // src/components/ui/color-preset-select.tsx
44114
44251
  init_cn();
44115
- import { Fragment as Fragment71, jsx as jsx346, jsxs as jsxs276 } from "react/jsx-runtime";
44252
+ import { Fragment as Fragment72, jsx as jsx346, jsxs as jsxs276 } from "react/jsx-runtime";
44116
44253
  var TICKET_STATUS_COLOR_PRESETS = [
44117
44254
  { key: "green", label: "Green", color: "#5ea62e" },
44118
44255
  { key: "lime", label: "Lime", color: "#8bc34a" },
@@ -44263,7 +44400,7 @@ function RgbInputs({ value, onChange }) {
44263
44400
  const b = next.b ?? rgb.b;
44264
44401
  onChange(rgbToHex(r, g, b));
44265
44402
  };
44266
- return /* @__PURE__ */ jsxs276(Fragment71, { children: [
44403
+ return /* @__PURE__ */ jsxs276(Fragment72, { children: [
44267
44404
  /* @__PURE__ */ jsx346(ChannelInput, { value: rgb.r, min: 0, max: 255, ariaLabel: "Red", onCommit: (r) => update({ r }) }),
44268
44405
  /* @__PURE__ */ jsx346(ChannelInput, { value: rgb.g, min: 0, max: 255, ariaLabel: "Green", onCommit: (g) => update({ g }) }),
44269
44406
  /* @__PURE__ */ jsx346(ChannelInput, { value: rgb.b, min: 0, max: 255, ariaLabel: "Blue", onCommit: (b) => update({ b }) })
@@ -44279,7 +44416,7 @@ function HslInputs({ value, onChange }) {
44279
44416
  const out = hslToRgb(h, s, l);
44280
44417
  onChange(rgbToHex(out.r, out.g, out.b));
44281
44418
  };
44282
- return /* @__PURE__ */ jsxs276(Fragment71, { children: [
44419
+ return /* @__PURE__ */ jsxs276(Fragment72, { children: [
44283
44420
  /* @__PURE__ */ jsx346(ChannelInput, { value: hsl.h, min: 0, max: 360, ariaLabel: "Hue", onCommit: (h) => update({ h }) }),
44284
44421
  /* @__PURE__ */ jsx346(ChannelInput, { value: hsl.s, min: 0, max: 100, ariaLabel: "Saturation", onCommit: (s) => update({ s }) }),
44285
44422
  /* @__PURE__ */ jsx346(ChannelInput, { value: hsl.l, min: 0, max: 100, ariaLabel: "Lightness", onCommit: (l) => update({ l }) })
@@ -44714,7 +44851,7 @@ init_cn();
44714
44851
  // src/components/ui/ticket-note-card.tsx
44715
44852
  import * as React135 from "react";
44716
44853
  init_cn();
44717
- import { Fragment as Fragment72, jsx as jsx351, jsxs as jsxs281 } from "react/jsx-runtime";
44854
+ import { Fragment as Fragment73, jsx as jsx351, jsxs as jsxs281 } from "react/jsx-runtime";
44718
44855
  function TicketNoteCard({ note, onEdit, onDelete, className }) {
44719
44856
  const [isEditing, setIsEditing] = React135.useState(false);
44720
44857
  const [editText, setEditText] = React135.useState(note.text);
@@ -44788,7 +44925,7 @@ function TicketNoteCard({ note, onEdit, onDelete, className }) {
44788
44925
  children: /* @__PURE__ */ jsx351(XmarkIcon, { className: "size-5" })
44789
44926
  }
44790
44927
  )
44791
- ] }) : /* @__PURE__ */ jsxs281(Fragment72, { children: [
44928
+ ] }) : /* @__PURE__ */ jsxs281(Fragment73, { children: [
44792
44929
  /* @__PURE__ */ jsx351("p", { className: "text-h4 text-ods-text-primary", children: note.text }),
44793
44930
  /* @__PURE__ */ jsxs281(
44794
44931
  "p",
@@ -44895,7 +45032,7 @@ function TicketNotesSection({
44895
45032
  }
44896
45033
 
44897
45034
  // src/components/ui/ticket-info-section.tsx
44898
- import { Fragment as Fragment73, jsx as jsx353, jsxs as jsxs283 } from "react/jsx-runtime";
45035
+ import { Fragment as Fragment74, jsx as jsx353, jsxs as jsxs283 } from "react/jsx-runtime";
44899
45036
  function InfoCell2({ value, label, icon, onClick }) {
44900
45037
  return /* @__PURE__ */ jsx353("div", { className: "flex-1 min-w-0 overflow-hidden", children: /* @__PURE__ */ jsxs283("div", { className: "flex flex-col justify-center", children: [
44901
45038
  /* @__PURE__ */ jsxs283("div", { className: "flex items-center gap-1 w-full min-w-0", children: [
@@ -45020,7 +45157,7 @@ function TicketInfoSection({
45020
45157
  )
45021
45158
  ] })
45022
45159
  ] }),
45023
- expanded && /* @__PURE__ */ jsxs283(Fragment73, { children: [
45160
+ expanded && /* @__PURE__ */ jsxs283(Fragment74, { children: [
45024
45161
  createdAt && /* @__PURE__ */ jsx353("div", { className: "grid grid-cols-2 gap-4 px-4 py-3 bg-ods-bg border-b border-ods-border items-center", children: /* @__PURE__ */ jsx353(InfoCell2, { value: createdAt, label: "Created" }) }),
45025
45162
  /* @__PURE__ */ jsxs283("div", { className: "flex flex-col gap-4 p-4 bg-ods-bg border-b border-ods-border", children: [
45026
45163
  description && /* @__PURE__ */ jsx353(SimpleMarkdownRenderer, { content: description }),
@@ -45078,7 +45215,7 @@ function FilterPillRow({
45078
45215
 
45079
45216
  // src/components/ui/image-gallery-modal.tsx
45080
45217
  import { ChevronLeft as ChevronLeft4, ChevronRight as ChevronRight8 } from "lucide-react";
45081
- import { Fragment as Fragment74, jsx as jsx355, jsxs as jsxs285 } from "react/jsx-runtime";
45218
+ import { Fragment as Fragment75, jsx as jsx355, jsxs as jsxs285 } from "react/jsx-runtime";
45082
45219
  function ImageGalleryModal({
45083
45220
  images,
45084
45221
  isOpen,
@@ -45134,7 +45271,7 @@ function ImageGalleryModal({
45134
45271
  onClose,
45135
45272
  className: "max-w-[95vw]",
45136
45273
  children: /* @__PURE__ */ jsxs285("div", { className: "relative flex items-center justify-center bg-black rounded-lg", children: [
45137
- images.length > 1 && /* @__PURE__ */ jsxs285(Fragment74, { children: [
45274
+ images.length > 1 && /* @__PURE__ */ jsxs285(Fragment75, { children: [
45138
45275
  selectedImageIndex > 0 && /* @__PURE__ */ jsx355("div", { className: "absolute left-4 top-1/2 -translate-y-1/2 z-[10000]", children: /* @__PURE__ */ jsx355(
45139
45276
  Button,
45140
45277
  {
@@ -45252,7 +45389,7 @@ function TaskTypeIcon({ customItemId, className = "h-5 w-5" }) {
45252
45389
  }
45253
45390
 
45254
45391
  // src/components/chat/entity-cards/roadmap-card.tsx
45255
- import { Fragment as Fragment75, jsx as jsx357, jsxs as jsxs286 } from "react/jsx-runtime";
45392
+ import { Fragment as Fragment76, jsx as jsx357, jsxs as jsxs286 } from "react/jsx-runtime";
45256
45393
  function RoadmapCardSkeleton({ size: size2 = "default" }) {
45257
45394
  if (size2 === "sm") {
45258
45395
  return /* @__PURE__ */ jsxs286("span", { className: COMPACT_CARD_SKELETON_OUTER, children: [
@@ -45314,7 +45451,7 @@ function RoadmapCard({
45314
45451
  const hasScreenshots = (item.screenshots?.length ?? 0) > 0;
45315
45452
  const typeLabel = getTaskTypeLabel(item.customItemId);
45316
45453
  const useTypeIcon = cardType === "internal_task" || !iconSrc && item.customItemId != null;
45317
- const body = /* @__PURE__ */ jsxs286(Fragment75, { children: [
45454
+ const body = /* @__PURE__ */ jsxs286(Fragment76, { children: [
45318
45455
  /* @__PURE__ */ jsx357(
45319
45456
  "span",
45320
45457
  {
@@ -45506,7 +45643,7 @@ function RoadmapCard({
45506
45643
  // src/components/chat/entity-cards/github-activity-card.tsx
45507
45644
  import React138 from "react";
45508
45645
  import { GitPullRequest, Eye as Eye4, ExternalLink as ExternalLink8 } from "lucide-react";
45509
- import { Fragment as Fragment76, jsx as jsx358, jsxs as jsxs287 } from "react/jsx-runtime";
45646
+ import { Fragment as Fragment77, jsx as jsx358, jsxs as jsxs287 } from "react/jsx-runtime";
45510
45647
  function parseRepoFromUrl(url) {
45511
45648
  if (!url) return null;
45512
45649
  try {
@@ -45638,7 +45775,7 @@ function GitHubActivityCard({ item, variant = "compact", className, anchorProps
45638
45775
  if (repo) metaParts.push(/* @__PURE__ */ jsx358("span", { className: "font-mono truncate", children: repo }, "repo"));
45639
45776
  if (dateText) metaParts.push(/* @__PURE__ */ jsx358("span", { className: "whitespace-nowrap", children: dateText }, "date"));
45640
45777
  const href = safeHref(item.url);
45641
- const body = /* @__PURE__ */ jsxs287(Fragment76, { children: [
45778
+ const body = /* @__PURE__ */ jsxs287(Fragment77, { children: [
45642
45779
  /* @__PURE__ */ jsx358("span", { className: COMPACT_CARD_ICON_SLOT, children: kindIcon(kind, "h-5 w-5") }),
45643
45780
  /* @__PURE__ */ jsxs287("span", { className: COMPACT_CARD_TEXT_COL, children: [
45644
45781
  /* @__PURE__ */ jsxs287("span", { className: `${COMPACT_CARD_TITLE_ROW} flex-nowrap gap-1.5`, children: [
@@ -45693,7 +45830,7 @@ function GitHubActivityCardSkeleton({ variant = "compact", className }) {
45693
45830
  // src/components/chat/entity-cards/slack-message-card.tsx
45694
45831
  import React139 from "react";
45695
45832
  import { ExternalLink as ExternalLink9, Hash } from "lucide-react";
45696
- import { Fragment as Fragment77, jsx as jsx359, jsxs as jsxs288 } from "react/jsx-runtime";
45833
+ import { Fragment as Fragment78, jsx as jsx359, jsxs as jsxs288 } from "react/jsx-runtime";
45697
45834
  function parseChannelFromUrl(url) {
45698
45835
  if (!url) return null;
45699
45836
  try {
@@ -45732,7 +45869,7 @@ function SlackMessageCard({ item, variant = "compact", className, anchorProps })
45732
45869
  }
45733
45870
  if (dateText) metaParts.push(/* @__PURE__ */ jsx359("span", { className: "whitespace-nowrap", children: dateText }, "date"));
45734
45871
  const href = safeHref(item.url);
45735
- const body = /* @__PURE__ */ jsxs288(Fragment77, { children: [
45872
+ const body = /* @__PURE__ */ jsxs288(Fragment78, { children: [
45736
45873
  /* @__PURE__ */ jsx359("span", { className: COMPACT_CARD_ICON_SLOT, children: /* @__PURE__ */ jsx359(SlackIcon, { className: "h-5 w-5" }) }),
45737
45874
  /* @__PURE__ */ jsxs288("span", { className: COMPACT_CARD_TEXT_COL, children: [
45738
45875
  /* @__PURE__ */ jsx359("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx359("span", { className: COMPACT_CARD_TITLE, children: item.title }) }),
@@ -45782,7 +45919,7 @@ function SlackMessageCardSkeleton({ variant = "compact", className }) {
45782
45919
  // src/components/chat/entity-cards/hubspot-ticket-card.tsx
45783
45920
  import React140 from "react";
45784
45921
  import { ExternalLink as ExternalLink10 } from "lucide-react";
45785
- import { Fragment as Fragment78, jsx as jsx360, jsxs as jsxs289 } from "react/jsx-runtime";
45922
+ import { Fragment as Fragment79, jsx as jsx360, jsxs as jsxs289 } from "react/jsx-runtime";
45786
45923
  function formatToken(token) {
45787
45924
  if (!token) return null;
45788
45925
  const lower = token.toLowerCase().replace(/_/g, " ");
@@ -45821,7 +45958,7 @@ function HubspotTicketCard({ item, variant = "compact", className, anchorProps }
45821
45958
  }
45822
45959
  if (dateText) metaParts.push(/* @__PURE__ */ jsx360("span", { className: "whitespace-nowrap", children: dateText }, "date"));
45823
45960
  const href = safeHref(item.url);
45824
- const body = /* @__PURE__ */ jsxs289(Fragment78, { children: [
45961
+ const body = /* @__PURE__ */ jsxs289(Fragment79, { children: [
45825
45962
  /* @__PURE__ */ jsxs289("span", { className: COMPACT_CARD_TEXT_COL, children: [
45826
45963
  /* @__PURE__ */ jsxs289("span", { className: "flex flex-wrap items-center gap-1.5 min-w-0", children: [
45827
45964
  /* @__PURE__ */ jsx360("span", { className: `${COMPACT_CARD_TITLE} shrink min-w-0`, children: item.title }),
@@ -45901,9 +46038,9 @@ function HubspotTicketCardSkeleton({ variant = "compact", className }) {
45901
46038
 
45902
46039
  // src/components/chat/entity-cards/data-room-doc-card.tsx
45903
46040
  import { ExternalLink as ExternalLink11 } from "lucide-react";
45904
- import { Fragment as Fragment79, jsx as jsx361, jsxs as jsxs290 } from "react/jsx-runtime";
46041
+ import { Fragment as Fragment80, jsx as jsx361, jsxs as jsxs290 } from "react/jsx-runtime";
45905
46042
  function DataRoomDocCard({ item, className, badgeText, anchorProps }) {
45906
- const body = /* @__PURE__ */ jsxs290(Fragment79, { children: [
46043
+ const body = /* @__PURE__ */ jsxs290(Fragment80, { children: [
45907
46044
  /* @__PURE__ */ jsxs290("span", { className: COMPACT_CARD_TEXT_COL, children: [
45908
46045
  /* @__PURE__ */ jsxs290("span", { className: "flex flex-wrap items-center gap-1.5 min-w-0", children: [
45909
46046
  /* @__PURE__ */ jsx361("span", { className: `${COMPACT_CARD_TITLE} shrink min-w-0`, children: item.title }),
@@ -47513,7 +47650,7 @@ function cleanEscapedString(input) {
47513
47650
  init_button();
47514
47651
  import { ExternalLink as ExternalLink12, Clock as Clock2, Play as Play4, Video as Video5 } from "lucide-react";
47515
47652
  init_cn();
47516
- import { Fragment as Fragment80, jsx as jsx362, jsxs as jsxs291 } from "react/jsx-runtime";
47653
+ import { Fragment as Fragment81, jsx as jsx362, jsxs as jsxs291 } from "react/jsx-runtime";
47517
47654
  function formatUtc(date, fmt) {
47518
47655
  return format2(new Date(date.getTime() + date.getTimezoneOffset() * 6e4), fmt);
47519
47656
  }
@@ -47588,7 +47725,7 @@ function MediaGallery({ images, title }) {
47588
47725
  setIsModalOpen(false);
47589
47726
  setSelectedImageIndex(null);
47590
47727
  };
47591
- return /* @__PURE__ */ jsxs291(Fragment80, { children: [
47728
+ return /* @__PURE__ */ jsxs291(Fragment81, { children: [
47592
47729
  /* @__PURE__ */ jsx362("div", { className: "p-6 pt-4", children: /* @__PURE__ */ jsx362("div", { className: "overflow-x-auto mb-4", children: /* @__PURE__ */ jsx362("div", { className: "flex gap-3 pb-2", style: { width: "max-content" }, children: images.map((mediaItem, index) => /* @__PURE__ */ jsxs291(
47593
47730
  "div",
47594
47731
  {
@@ -47730,7 +47867,7 @@ function ProgramCard({
47730
47867
  const dateFormat = formatUtc(itemDate, "EEEE d MMMM");
47731
47868
  const defaultRenderMeta = () => {
47732
47869
  if (config.type === "podcast" && "duration_seconds" in item && !isScheduled) {
47733
- return /* @__PURE__ */ jsxs291(Fragment80, { children: [
47870
+ return /* @__PURE__ */ jsxs291(Fragment81, { children: [
47734
47871
  /* @__PURE__ */ jsx362(Clock2, { className: "w-4 h-4 text-ods-text-secondary" }),
47735
47872
  /* @__PURE__ */ jsx362("span", { className: "font-body text-ods-text-secondary", children: formatDurationCompact(item.duration_seconds) })
47736
47873
  ] });
@@ -47741,7 +47878,7 @@ function ProgramCard({
47741
47878
  if (config.type === "webinar" && "start_at" in item) {
47742
47879
  const webinarItem = item;
47743
47880
  const duration = formatDurationFromRange(webinarItem.start_at, webinarItem.end_at);
47744
- return /* @__PURE__ */ jsxs291(Fragment80, { children: [
47881
+ return /* @__PURE__ */ jsxs291(Fragment81, { children: [
47745
47882
  /* @__PURE__ */ jsx362(Video5, { className: "w-4 h-4 text-ods-text-secondary" }),
47746
47883
  /* @__PURE__ */ jsxs291("span", { className: "font-body text-ods-text-secondary", children: [
47747
47884
  formatTimeWithTimezone(webinarItem.start_at, webinarItem.timezone ?? null),
@@ -47775,10 +47912,10 @@ function ProgramCard({
47775
47912
  /* @__PURE__ */ jsx362("h3", { className: "text-h2 text-ods-text-primary mb-3 min-h-[3rem] md:min-h-[3.5rem] line-clamp-2 flex items-center", children: item.title }),
47776
47913
  /* @__PURE__ */ jsxs291("div", { className: "flex flex-col md:flex-row md:items-center gap-2 md:gap-4 mb-4", children: [
47777
47914
  /* @__PURE__ */ jsx362("span", { className: "text-h6", style: { color: accentColor }, children: dateFormat }),
47778
- renderMeta ? /* @__PURE__ */ jsxs291(Fragment80, { children: [
47915
+ renderMeta ? /* @__PURE__ */ jsxs291(Fragment81, { children: [
47779
47916
  /* @__PURE__ */ jsx362("span", { className: "hidden md:inline text-ods-text-secondary", children: "\u2022" }),
47780
47917
  renderMeta(item)
47781
- ] }) : defaultRenderMeta() && /* @__PURE__ */ jsxs291(Fragment80, { children: [
47918
+ ] }) : defaultRenderMeta() && /* @__PURE__ */ jsxs291(Fragment81, { children: [
47782
47919
  /* @__PURE__ */ jsx362("span", { className: "hidden md:inline text-ods-text-secondary", children: "\u2022" }),
47783
47920
  /* @__PURE__ */ jsx362("div", { className: "flex items-center gap-2", children: defaultRenderMeta() })
47784
47921
  ] })
@@ -47855,10 +47992,10 @@ function ProgramCard({
47855
47992
 
47856
47993
  // src/components/chat/entity-cards/campaign-card-admin.tsx
47857
47994
  import { Megaphone as Megaphone3 } from "lucide-react";
47858
- import { Fragment as Fragment81, jsx as jsx363, jsxs as jsxs292 } from "react/jsx-runtime";
47995
+ import { Fragment as Fragment82, jsx as jsx363, jsxs as jsxs292 } from "react/jsx-runtime";
47859
47996
  function CampaignCardAdmin({ campaign, className, anchorProps }) {
47860
47997
  const goalsCount = campaign.goals?.length || 0;
47861
- const innerChildren = /* @__PURE__ */ jsxs292(Fragment81, { children: [
47998
+ const innerChildren = /* @__PURE__ */ jsxs292(Fragment82, { children: [
47862
47999
  /* @__PURE__ */ jsx363("span", { className: COMPACT_CARD_ICON_SLOT, children: /* @__PURE__ */ jsx363(Megaphone3, { className: "h-5 w-5" }) }),
47863
48000
  /* @__PURE__ */ jsxs292("span", { className: COMPACT_CARD_TEXT_COL, children: [
47864
48001
  /* @__PURE__ */ jsx363("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx363("span", { className: COMPACT_CARD_TITLE, children: campaign.name }) }),
@@ -47888,11 +48025,11 @@ function CampaignCardAdminSkeleton({ className }) {
47888
48025
 
47889
48026
  // src/components/chat/entity-cards/generic-entity-card.tsx
47890
48027
  import { ExternalLink as ExternalLink13 } from "lucide-react";
47891
- import { Fragment as Fragment82, jsx as jsx364, jsxs as jsxs293 } from "react/jsx-runtime";
48028
+ import { Fragment as Fragment83, jsx as jsx364, jsxs as jsxs293 } from "react/jsx-runtime";
47892
48029
  function GenericEntityCard({ item, className, anchorProps }) {
47893
48030
  const href = safeHref(item.url);
47894
48031
  const dateText = formatDateUTC(item.dateUpdated, { fallback: "", timezone: "local" });
47895
- const body = /* @__PURE__ */ jsxs293(Fragment82, { children: [
48032
+ const body = /* @__PURE__ */ jsxs293(Fragment83, { children: [
47896
48033
  /* @__PURE__ */ jsxs293("span", { className: COMPACT_CARD_TEXT_COL, children: [
47897
48034
  /* @__PURE__ */ jsxs293("span", { className: "flex flex-wrap items-center gap-1.5 min-w-0", children: [
47898
48035
  /* @__PURE__ */ jsx364("span", { className: `${COMPACT_CARD_TITLE} shrink min-w-0`, children: item.title }),
@@ -48077,7 +48214,7 @@ function resolveSourceIcon(input, ctx = {}) {
48077
48214
 
48078
48215
  // src/components/chat/mingo-info-card.tsx
48079
48216
  init_cn();
48080
- import { Fragment as Fragment83, jsx as jsx365, jsxs as jsxs294 } from "react/jsx-runtime";
48217
+ import { Fragment as Fragment84, jsx as jsx365, jsxs as jsxs294 } from "react/jsx-runtime";
48081
48218
  function CardMedia({
48082
48219
  imageSrc,
48083
48220
  imageAlt,
@@ -48121,7 +48258,7 @@ function MingoInfoCard({
48121
48258
  const hasMenu = !!menuGroups && menuGroups.length > 0;
48122
48259
  const isAnchor = !!anchorProps;
48123
48260
  const isInteractive = isAnchor || !!onClick;
48124
- const content = /* @__PURE__ */ jsxs294(Fragment83, { children: [
48261
+ const content = /* @__PURE__ */ jsxs294(Fragment84, { children: [
48125
48262
  hasMedia && /* @__PURE__ */ jsx365(CardMedia, { imageSrc, imageAlt, icon }),
48126
48263
  /* @__PURE__ */ jsxs294("span", { className: "flex min-w-0 flex-1 flex-col justify-center", children: [
48127
48264
  /* @__PURE__ */ jsx365("span", { className: "truncate text-h4 text-ods-text-primary", children: title }),
@@ -48170,7 +48307,7 @@ function MingoInfoCard({
48170
48307
  }
48171
48308
 
48172
48309
  // src/components/chat/entity-cards/dispatch.tsx
48173
- import { Fragment as Fragment84, jsx as jsx366, jsxs as jsxs295 } from "react/jsx-runtime";
48310
+ import { Fragment as Fragment85, jsx as jsx366, jsxs as jsxs295 } from "react/jsx-runtime";
48174
48311
  function githubKindIcon(kind) {
48175
48312
  switch (kind) {
48176
48313
  case "pull_request":
@@ -49138,10 +49275,10 @@ function ChatCardLoader({
49138
49275
  }
49139
49276
  );
49140
49277
  }
49141
- if (isLoading) return /* @__PURE__ */ jsx366(Fragment84, { children: entry.skeleton() });
49278
+ if (isLoading) return /* @__PURE__ */ jsx366(Fragment85, { children: entry.skeleton() });
49142
49279
  if (!item) return null;
49143
49280
  if (entry.bareInline) {
49144
- return /* @__PURE__ */ jsx366(Fragment84, { children: navWrap(entry.render(item, finalChatRef, renderOpts)) });
49281
+ return /* @__PURE__ */ jsx366(Fragment85, { children: navWrap(entry.render(item, finalChatRef, renderOpts)) });
49145
49282
  }
49146
49283
  return /* @__PURE__ */ jsx366(
49147
49284
  ChatCardWithDiscuss,
@@ -54596,7 +54733,7 @@ function useChatDialogManager({
54596
54733
 
54597
54734
  // src/components/chat/embeddable-chat.tsx
54598
54735
  init_next_navigation();
54599
- import { Fragment as Fragment85, jsx as jsx370, jsxs as jsxs296 } from "react/jsx-runtime";
54736
+ import { Fragment as Fragment86, jsx as jsx370, jsxs as jsxs296 } from "react/jsx-runtime";
54600
54737
  var DRAWER_DEFAULT_WIDTH_RATIO = 0.5;
54601
54738
  var DRAWER_WIDTH_KEY = "mingo-chat-width-v3";
54602
54739
  var DRAWER_DEFAULT_WIDTH_PX = 750;
@@ -54768,7 +54905,7 @@ function SourceChip({
54768
54905
  );
54769
54906
  }
54770
54907
  const displayName = src.name || formatRelativePath(src.path);
54771
- const chipBody = (label) => /* @__PURE__ */ jsxs296(Fragment85, { children: [
54908
+ const chipBody = (label) => /* @__PURE__ */ jsxs296(Fragment86, { children: [
54772
54909
  icon,
54773
54910
  /* @__PURE__ */ jsxs296("span", { className: "truncate max-w-[160px]", children: [
54774
54911
  "[",
@@ -55575,7 +55712,7 @@ function EmbeddableChatInner({
55575
55712
  // renders in the rail below); the chat block is untouched.
55576
55713
  // Back is a full-height leading cell, matching the other
55577
55714
  // header cells (not a small inline chevron).
55578
- /* @__PURE__ */ jsxs296(Fragment85, { children: [
55715
+ /* @__PURE__ */ jsxs296(Fragment86, { children: [
55579
55716
  /* @__PURE__ */ jsx370(
55580
55717
  ChatHeaderIconButton,
55581
55718
  {
@@ -55592,7 +55729,7 @@ function EmbeddableChatInner({
55592
55729
  // search + archive controls. When search is open the
55593
55730
  // inline field takes over the title area in place
55594
55731
  // (Figma 116:51217) and the magnifier toggle is hidden.
55595
- /* @__PURE__ */ jsxs296(Fragment85, { children: [
55732
+ /* @__PURE__ */ jsxs296(Fragment86, { children: [
55596
55733
  railSearchOpen && mingoCaps.onSearchChange ? /* @__PURE__ */ jsx370(
55597
55734
  ChatHeaderSearchField,
55598
55735
  {
@@ -55600,7 +55737,7 @@ function EmbeddableChatInner({
55600
55737
  onSearchChange: mingoCaps.onSearchChange,
55601
55738
  onCollapse: () => setRailSearchOpen(false)
55602
55739
  }
55603
- ) : /* @__PURE__ */ jsxs296(Fragment85, { children: [
55740
+ ) : /* @__PURE__ */ jsxs296(Fragment86, { children: [
55604
55741
  /* @__PURE__ */ jsx370("div", { className: "flex min-w-0 flex-1 items-center px-[var(--spacing-system-mf)]", children: /* @__PURE__ */ jsx370("span", { className: "min-w-0 flex-1 truncate text-h3 text-ods-text-primary", children: "Current Chats" }) }),
55605
55742
  mingoCaps.onSearchChange && /* @__PURE__ */ jsx370(
55606
55743
  ChatHeaderIconButton,
@@ -55746,7 +55883,7 @@ function EmbeddableChatInner({
55746
55883
  onRetry: reloadDialogs
55747
55884
  }
55748
55885
  )
55749
- ) : /* @__PURE__ */ jsxs296(Fragment85, { children: [
55886
+ ) : /* @__PURE__ */ jsxs296(Fragment86, { children: [
55750
55887
  /* @__PURE__ */ jsx370(
55751
55888
  "div",
55752
55889
  {
@@ -55992,7 +56129,7 @@ function EmbeddableChatInner({
55992
56129
  ]
55993
56130
  }
55994
56131
  ) }) });
55995
- return /* @__PURE__ */ jsxs296(Fragment85, { children: [
56132
+ return /* @__PURE__ */ jsxs296(Fragment86, { children: [
55996
56133
  showInternalTrigger && !shellLess && /* @__PURE__ */ jsx370(
55997
56134
  "div",
55998
56135
  {
@@ -57040,4 +57177,4 @@ export {
57040
57177
  LogsList,
57041
57178
  assets
57042
57179
  };
57043
- //# sourceMappingURL=chunk-CYIUPI7J.js.map
57180
+ //# sourceMappingURL=chunk-56J7RLMM.js.map