@flamingo-stack/openframe-frontend-core 0.0.499 → 0.0.500

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 (156) hide show
  1. package/dist/{chunk-XV22URNM.cjs → chunk-4NDGD2YH.cjs} +19 -19
  2. package/dist/{chunk-XV22URNM.cjs.map → chunk-4NDGD2YH.cjs.map} +1 -1
  3. package/dist/{chunk-YDNIQLAP.js → chunk-5CY6YKWY.js} +6 -6
  4. package/dist/{chunk-Q66TP2LY.js → chunk-6TJJFQ74.js} +6 -6
  5. package/dist/{chunk-47LHA4QI.cjs → chunk-C5R2OX7A.cjs} +7 -2
  6. package/dist/chunk-C5R2OX7A.cjs.map +1 -0
  7. package/dist/{chunk-NSDDV4F6.cjs → chunk-ETU6VFOL.cjs} +40 -40
  8. package/dist/{chunk-NSDDV4F6.cjs.map → chunk-ETU6VFOL.cjs.map} +1 -1
  9. package/dist/{chunk-WJ2S6I34.cjs → chunk-GDUWGCPP.cjs} +12 -12
  10. package/dist/{chunk-WJ2S6I34.cjs.map → chunk-GDUWGCPP.cjs.map} +1 -1
  11. package/dist/{chunk-44YXQBNM.cjs → chunk-I64ZGPA6.cjs} +3 -3
  12. package/dist/{chunk-44YXQBNM.cjs.map → chunk-I64ZGPA6.cjs.map} +1 -1
  13. package/dist/{chunk-7DUMNMED.cjs → chunk-IDRKW6MS.cjs} +12 -12
  14. package/dist/{chunk-7DUMNMED.cjs.map → chunk-IDRKW6MS.cjs.map} +1 -1
  15. package/dist/{chunk-SGL6URIJ.cjs → chunk-L5CI57RM.cjs} +9 -5
  16. package/dist/chunk-L5CI57RM.cjs.map +1 -0
  17. package/dist/{chunk-Q6B7VAHN.cjs → chunk-LN2X4XAB.cjs} +18 -18
  18. package/dist/{chunk-Q6B7VAHN.cjs.map → chunk-LN2X4XAB.cjs.map} +1 -1
  19. package/dist/{chunk-RAL274JM.js → chunk-P3B65FBX.js} +4 -4
  20. package/dist/{chunk-QWCW4Z75.js → chunk-P5UMIPKR.js} +5 -5
  21. package/dist/{chunk-QL5YB4F7.js → chunk-P7IOCYGD.js} +52 -47
  22. package/dist/chunk-P7IOCYGD.js.map +1 -0
  23. package/dist/{chunk-V2APV4E4.cjs → chunk-PAO45LBQ.cjs} +1113 -916
  24. package/dist/chunk-PAO45LBQ.cjs.map +1 -0
  25. package/dist/{chunk-3AXJESKA.js → chunk-QQAKDJPE.js} +3 -3
  26. package/dist/{chunk-O7JY7LRP.js → chunk-R2IGOYHU.js} +3 -3
  27. package/dist/{chunk-RBZOUGCL.cjs → chunk-S3COVC7H.cjs} +73 -73
  28. package/dist/{chunk-RBZOUGCL.cjs.map → chunk-S3COVC7H.cjs.map} +1 -1
  29. package/dist/{chunk-QUFB5SDZ.js → chunk-SOX7CGFX.js} +303 -106
  30. package/dist/{chunk-QUFB5SDZ.js.map → chunk-SOX7CGFX.js.map} +1 -1
  31. package/dist/{chunk-W42256FC.cjs → chunk-TJCUGL7S.cjs} +33 -33
  32. package/dist/{chunk-W42256FC.cjs.map → chunk-TJCUGL7S.cjs.map} +1 -1
  33. package/dist/{chunk-SSYE7BQC.js → chunk-UM2YFCPE.js} +3 -3
  34. package/dist/{chunk-2CEDCSYD.cjs → chunk-V5ALIJZ6.cjs} +32 -32
  35. package/dist/{chunk-2CEDCSYD.cjs.map → chunk-V5ALIJZ6.cjs.map} +1 -1
  36. package/dist/{chunk-EP7ELZTU.cjs → chunk-VLI6ESJN.cjs} +93 -93
  37. package/dist/{chunk-EP7ELZTU.cjs.map → chunk-VLI6ESJN.cjs.map} +1 -1
  38. package/dist/{chunk-BAMTV6GL.js → chunk-VMDQDD5Y.js} +2 -2
  39. package/dist/{chunk-IUP26OXG.js → chunk-VPQBQJ4S.js} +2 -2
  40. package/dist/{chunk-TTJSLIXA.js → chunk-W6Y66G4K.js} +3 -3
  41. package/dist/{chunk-QKWOBV55.js → chunk-WHJGRRK2.js} +9 -5
  42. package/dist/chunk-WHJGRRK2.js.map +1 -0
  43. package/dist/{chunk-AEZ5BXLJ.js → chunk-XBLRT3MX.js} +4 -4
  44. package/dist/{chunk-FLZTUE2T.cjs → chunk-YSN2AZJR.cjs} +5 -5
  45. package/dist/{chunk-FLZTUE2T.cjs.map → chunk-YSN2AZJR.cjs.map} +1 -1
  46. package/dist/{chunk-6QVV3OLL.cjs → chunk-ZLJCE75C.cjs} +40 -40
  47. package/dist/{chunk-6QVV3OLL.cjs.map → chunk-ZLJCE75C.cjs.map} +1 -1
  48. package/dist/{chunk-UD4IT3GY.js → chunk-ZU27I5NZ.js} +6 -6
  49. package/dist/components/case-studies/index.cjs +10 -10
  50. package/dist/components/case-studies/index.js +4 -4
  51. package/dist/components/chat/index.cjs +4 -4
  52. package/dist/components/chat/index.js +3 -3
  53. package/dist/components/contact/index.cjs +5 -5
  54. package/dist/components/contact/index.js +4 -4
  55. package/dist/components/docs/index.cjs +7 -7
  56. package/dist/components/docs/index.js +6 -6
  57. package/dist/components/embeds/index.cjs +5 -5
  58. package/dist/components/embeds/index.js +4 -4
  59. package/dist/components/faq/index.cjs +6 -6
  60. package/dist/components/faq/index.js +5 -5
  61. package/dist/components/features/filters-dropdown.d.ts.map +1 -1
  62. package/dist/components/features/index.cjs +4 -4
  63. package/dist/components/features/index.js +3 -3
  64. package/dist/components/help-center-pages/index.cjs +23 -23
  65. package/dist/components/help-center-pages/index.js +14 -14
  66. package/dist/components/index.cjs +165 -161
  67. package/dist/components/index.cjs.map +1 -1
  68. package/dist/components/index.js +16 -12
  69. package/dist/components/index.js.map +1 -1
  70. package/dist/components/navigation/app-header.d.ts +48 -0
  71. package/dist/components/navigation/app-header.d.ts.map +1 -1
  72. package/dist/components/navigation/header-mingo-button.d.ts.map +1 -1
  73. package/dist/components/navigation/index.cjs +6 -4
  74. package/dist/components/navigation/index.cjs.map +1 -1
  75. package/dist/components/navigation/index.d.ts +2 -2
  76. package/dist/components/navigation/index.d.ts.map +1 -1
  77. package/dist/components/navigation/index.js +5 -3
  78. package/dist/components/navigation/navigation-sidebar-item.d.ts +14 -0
  79. package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
  80. package/dist/components/navigation/navigation-sidebar-toggle.d.ts.map +1 -1
  81. package/dist/components/navigation/navigation-sidebar.d.ts +18 -0
  82. package/dist/components/navigation/navigation-sidebar.d.ts.map +1 -1
  83. package/dist/components/onboarding-guides/index.cjs +8 -8
  84. package/dist/components/onboarding-guides/index.js +7 -7
  85. package/dist/components/related-content/index.cjs +6 -6
  86. package/dist/components/related-content/index.js +5 -5
  87. package/dist/components/tickets/index.cjs +7 -7
  88. package/dist/components/tickets/index.js +6 -6
  89. package/dist/components/ui/button/button-styles.d.ts +1 -0
  90. package/dist/components/ui/button/button-styles.d.ts.map +1 -1
  91. package/dist/components/ui/button/button.d.ts.map +1 -1
  92. package/dist/components/ui/data-table/data-table-body.d.ts.map +1 -1
  93. package/dist/components/ui/data-table/data-table-column-filter.d.ts.map +1 -1
  94. package/dist/components/ui/data-table/data-table-header.d.ts.map +1 -1
  95. package/dist/components/ui/data-table/data-table-row.d.ts.map +1 -1
  96. package/dist/components/ui/data-table/data-table-skeleton.d.ts +12 -0
  97. package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
  98. package/dist/components/ui/data-table/index.d.ts +1 -1
  99. package/dist/components/ui/data-table/index.d.ts.map +1 -1
  100. package/dist/components/ui/data-table/utils.d.ts +18 -0
  101. package/dist/components/ui/data-table/utils.d.ts.map +1 -1
  102. package/dist/components/ui/file-manager/index.cjs +50 -50
  103. package/dist/components/ui/file-manager/index.js +1 -1
  104. package/dist/components/ui/index.cjs +6 -4
  105. package/dist/components/ui/index.cjs.map +1 -1
  106. package/dist/components/ui/index.js +5 -3
  107. package/dist/hooks/index.cjs +4 -2
  108. package/dist/hooks/index.cjs.map +1 -1
  109. package/dist/hooks/index.js +3 -1
  110. package/dist/hooks/ui/index.d.ts +1 -0
  111. package/dist/hooks/ui/index.d.ts.map +1 -1
  112. package/dist/hooks/ui/use-isomorphic-layout-effect.d.ts +17 -0
  113. package/dist/hooks/ui/use-isomorphic-layout-effect.d.ts.map +1 -0
  114. package/dist/index.cjs +10 -4
  115. package/dist/index.cjs.map +1 -1
  116. package/dist/index.js +9 -3
  117. package/dist/types/navigation.d.ts +24 -0
  118. package/dist/types/navigation.d.ts.map +1 -1
  119. package/package.json +1 -1
  120. package/src/components/features/filters-dropdown.tsx +17 -5
  121. package/src/components/navigation/app-header.tsx +178 -0
  122. package/src/components/navigation/header-mingo-button.tsx +5 -0
  123. package/src/components/navigation/index.ts +2 -2
  124. package/src/components/navigation/navigation-sidebar-item.tsx +22 -0
  125. package/src/components/navigation/navigation-sidebar-toggle.tsx +10 -6
  126. package/src/components/navigation/navigation-sidebar.tsx +187 -44
  127. package/src/components/ui/button/button-styles.ts +11 -0
  128. package/src/components/ui/button/button.tsx +6 -3
  129. package/src/components/ui/button/split-button.tsx +2 -2
  130. package/src/components/ui/data-table/data-table-body.tsx +5 -2
  131. package/src/components/ui/data-table/data-table-column-filter.tsx +54 -25
  132. package/src/components/ui/data-table/data-table-header.tsx +134 -45
  133. package/src/components/ui/data-table/data-table-row.tsx +3 -2
  134. package/src/components/ui/data-table/data-table-skeleton.tsx +17 -2
  135. package/src/components/ui/data-table/index.ts +1 -1
  136. package/src/components/ui/data-table/utils.ts +49 -3
  137. package/src/hooks/ui/index.ts +1 -0
  138. package/src/hooks/ui/use-isomorphic-layout-effect.ts +20 -0
  139. package/src/types/navigation.ts +21 -0
  140. package/dist/chunk-47LHA4QI.cjs.map +0 -1
  141. package/dist/chunk-QKWOBV55.js.map +0 -1
  142. package/dist/chunk-QL5YB4F7.js.map +0 -1
  143. package/dist/chunk-SGL6URIJ.cjs.map +0 -1
  144. package/dist/chunk-V2APV4E4.cjs.map +0 -1
  145. /package/dist/{chunk-YDNIQLAP.js.map → chunk-5CY6YKWY.js.map} +0 -0
  146. /package/dist/{chunk-Q66TP2LY.js.map → chunk-6TJJFQ74.js.map} +0 -0
  147. /package/dist/{chunk-RAL274JM.js.map → chunk-P3B65FBX.js.map} +0 -0
  148. /package/dist/{chunk-QWCW4Z75.js.map → chunk-P5UMIPKR.js.map} +0 -0
  149. /package/dist/{chunk-3AXJESKA.js.map → chunk-QQAKDJPE.js.map} +0 -0
  150. /package/dist/{chunk-O7JY7LRP.js.map → chunk-R2IGOYHU.js.map} +0 -0
  151. /package/dist/{chunk-SSYE7BQC.js.map → chunk-UM2YFCPE.js.map} +0 -0
  152. /package/dist/{chunk-BAMTV6GL.js.map → chunk-VMDQDD5Y.js.map} +0 -0
  153. /package/dist/{chunk-IUP26OXG.js.map → chunk-VPQBQJ4S.js.map} +0 -0
  154. /package/dist/{chunk-TTJSLIXA.js.map → chunk-W6Y66G4K.js.map} +0 -0
  155. /package/dist/{chunk-AEZ5BXLJ.js.map → chunk-XBLRT3MX.js.map} +0 -0
  156. /package/dist/{chunk-UD4IT3GY.js.map → chunk-ZU27I5NZ.js.map} +0 -0
@@ -23,6 +23,7 @@ import {
23
23
  useHumanitySignals,
24
24
  useImageEdgeColor,
25
25
  useIsTruncated,
26
+ useIsomorphicLayoutEffect,
26
27
  useLgUp,
27
28
  useLocalStorage,
28
29
  useMarqueeEngine,
@@ -35,7 +36,7 @@ import {
35
36
  useResetOnPageHidden,
36
37
  useSuppressCloneFocus,
37
38
  useToast
38
- } from "./chunk-QL5YB4F7.js";
39
+ } from "./chunk-P7IOCYGD.js";
39
40
  import {
40
41
  AlertCircleIcon,
41
42
  AnthropicLogoGreyIcon,
@@ -191,7 +192,7 @@ import {
191
192
  init_button2,
192
193
  init_split_button,
193
194
  usePortalContainer
194
- } from "./chunk-QKWOBV55.js";
195
+ } from "./chunk-WHJGRRK2.js";
195
196
  import {
196
197
  CheckboxCheckmarkIcon,
197
198
  SearchIcon
@@ -29968,7 +29969,6 @@ var FiltersDropdown = ({
29968
29969
  const handleClickOutside = (event) => {
29969
29970
  if (containerRef.current && !containerRef.current.contains(event.target)) {
29970
29971
  setIsOpen(false);
29971
- setActualPlacement(placement);
29972
29972
  }
29973
29973
  };
29974
29974
  if (isOpen) {
@@ -29980,17 +29980,16 @@ var FiltersDropdown = ({
29980
29980
  document.removeEventListener("mousedown", handleClickOutside);
29981
29981
  };
29982
29982
  }
29983
- }, [isOpen, placement]);
29983
+ }, [isOpen]);
29984
29984
  useEffect50(() => {
29985
29985
  const handleEscape = (e) => {
29986
29986
  if (e.key === "Escape" && isOpen) {
29987
29987
  setIsOpen(false);
29988
- setActualPlacement(placement);
29989
29988
  }
29990
29989
  };
29991
29990
  document.addEventListener("keydown", handleEscape);
29992
29991
  return () => document.removeEventListener("keydown", handleEscape);
29993
- }, [isOpen, placement]);
29992
+ }, [isOpen]);
29994
29993
  const handleToggleOption = (sectionId, optionId, sectionType) => {
29995
29994
  setSelectedFilters((prev) => {
29996
29995
  const current = prev[sectionId] || [];
@@ -30035,7 +30034,6 @@ var FiltersDropdown = ({
30035
30034
  const handleApply = () => {
30036
30035
  onApply(selectedFilters);
30037
30036
  setIsOpen(false);
30038
- setActualPlacement(placement);
30039
30037
  };
30040
30038
  const getActiveFiltersCount = () => {
30041
30039
  return Object.values(selectedFilters).reduce((acc, curr) => acc + curr.length, 0);
@@ -38525,7 +38523,7 @@ function useSectionNavigation(sections, options) {
38525
38523
  }
38526
38524
 
38527
38525
  // src/components/navigation/navigation-sidebar.tsx
38528
- import { useCallback as useCallback37, useEffect as useEffect70, useLayoutEffect as useLayoutEffect8, useMemo as useMemo39, useState as useState93 } from "react";
38526
+ import { useCallback as useCallback37, useEffect as useEffect70, useMemo as useMemo39, useState as useState93 } from "react";
38529
38527
 
38530
38528
  // src/components/navigation/navigation-sidebar-header.tsx
38531
38529
  import { jsx as jsx289, jsxs as jsxs227 } from "react/jsx-runtime";
@@ -38623,6 +38621,12 @@ var NavigationSidebarItemButton = memo6(function NavigationSidebarItemButton2({
38623
38621
  }
38624
38622
  return /* @__PURE__ */ jsx290(next_link_default, { href: item.path, onClick: (event) => onClick(item, event), ...shared, children: content });
38625
38623
  });
38624
+ function NavigationSidebarItemSkeleton({ showLabel }) {
38625
+ return /* @__PURE__ */ jsxs228("div", { className: "w-full flex items-center justify-start h-14 p-[var(--spacing-system-m)]", "aria-hidden": "true", children: [
38626
+ /* @__PURE__ */ jsx290("div", { className: "relative flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx290("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) }),
38627
+ showLabel && /* @__PURE__ */ jsx290("div", { className: "h-4 flex-1 ml-[var(--spacing-system-xs)] animate-pulse rounded bg-ods-border" })
38628
+ ] });
38629
+ }
38626
38630
 
38627
38631
  // src/components/navigation/navigation-sidebar-toggle.tsx
38628
38632
  import { jsx as jsx291, jsxs as jsxs229 } from "react/jsx-runtime";
@@ -38645,15 +38649,7 @@ function NavigationSidebarToggle({
38645
38649
  title: minimized ? "Hide Menu" : void 0,
38646
38650
  "aria-label": "Hide Menu",
38647
38651
  children: [
38648
- /* @__PURE__ */ jsx291("div", { className: "flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx291(
38649
- Chevrons03LeftIcon,
38650
- {
38651
- className: cn(
38652
- "text-ods-text-secondary w-6 h-6 transition-transform duration-300",
38653
- minimized && "rotate-180"
38654
- )
38655
- }
38656
- ) }),
38652
+ /* @__PURE__ */ jsx291("div", { className: "flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx291(Chevrons03LeftIcon, { className: "rotate-180 @[140px]/of-nav-sidebar:rotate-0 text-ods-text-secondary w-6 h-6 transition-transform duration-300" }) }),
38657
38653
  /* @__PURE__ */ jsx291(
38658
38654
  "span",
38659
38655
  {
@@ -38675,6 +38671,20 @@ import { Fragment as Fragment61, jsx as jsx292, jsxs as jsxs230 } from "react/js
38675
38671
  var MINIMIZED_WIDTH = 56;
38676
38672
  var EXPANDED_WIDTH = 224;
38677
38673
  var STORAGE_KEY = "of.navigationSidebar.minimized";
38674
+ var NAVIGATION_SIDEBAR_WIDTH_VAR = "--of-navigation-sidebar-width";
38675
+ var SIDEBAR_CONTAINER = "@container/of-nav-sidebar";
38676
+ var SIDEBAR_GEOMETRY_CLASSES = [
38677
+ // Tablet: float over the content, anchored to the layout row (`absolute`
38678
+ // within AppLayout's `relative` row) — NOT the viewport — so an optional
38679
+ // `topBar` above the row is not overlapped. With no topBar the row spans the
38680
+ // full viewport, so this is visually identical to a viewport-fixed sidebar.
38681
+ "md:absolute md:inset-y-0 md:left-0 md:z-[45]",
38682
+ // Desktop: back in the flex flow, width from the persisted preference. The
38683
+ // fallback IS the default, so the property needs no global declaration and an
38684
+ // unseeded consumer gets the full sidebar rather than a rail with no labels.
38685
+ "lg:relative lg:inset-auto lg:z-auto lg:h-full lg:w-[var(--of-navigation-sidebar-width,14rem)]"
38686
+ ].join(" ");
38687
+ var SIDEBAR_TABLET_WIDTH = { rail: "md:w-14", overlay: "md:w-56" };
38678
38688
  var isModifiedClick = (event) => !!event && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0);
38679
38689
  function NavigationSidebar({ config, disabled = false }) {
38680
38690
  const isMdUp = useMdUp() ?? false;
@@ -38688,7 +38698,9 @@ function NavigationSidebar({ config, disabled = false }) {
38688
38698
  useEffect70(() => {
38689
38699
  if (isTablet) setTabletMinimized(true);
38690
38700
  }, [isTablet]);
38691
- const minimized = isTablet ? tabletMinimized : desktopMinimized;
38701
+ const [hydrated, setHydrated] = useState93(false);
38702
+ useEffect70(() => setHydrated(true), []);
38703
+ const minimized = hydrated ? isTablet ? tabletMinimized : desktopMinimized : config.minimized ?? false;
38692
38704
  const [transitionsEnabled, setTransitionsEnabled] = useState93(false);
38693
38705
  const isOverlayOpen = isTablet && !minimized;
38694
38706
  const showLabel = !minimized;
@@ -38739,11 +38751,23 @@ function NavigationSidebar({ config, disabled = false }) {
38739
38751
  primaryItems: config.items.filter((item) => item.section !== "secondary"),
38740
38752
  secondaryItems: config.items.filter((item) => item.section === "secondary")
38741
38753
  }), [config.items]);
38754
+ const loadingRows = useMemo39(() => {
38755
+ if (!config.loading) return null;
38756
+ const primary = config.loadingRows?.primary ?? 7;
38757
+ const secondary = config.loadingRows?.secondary ?? 2;
38758
+ return {
38759
+ primary: Array.from({ length: Math.max(0, primary) }, (_, i) => `primary-${i}`),
38760
+ secondary: Array.from({ length: Math.max(0, secondary) }, (_, i) => `secondary-${i}`)
38761
+ };
38762
+ }, [config.loading, config.loadingRows?.primary, config.loadingRows?.secondary]);
38742
38763
  const sidebarWidth = useMemo39(
38743
38764
  () => minimized ? `${MINIMIZED_WIDTH}px` : `${EXPANDED_WIDTH}px`,
38744
38765
  [minimized]
38745
38766
  );
38746
- useLayoutEffect8(() => {
38767
+ useIsomorphicLayoutEffect(() => {
38768
+ document.documentElement.style.setProperty(NAVIGATION_SIDEBAR_WIDTH_VAR, sidebarWidth);
38769
+ }, [sidebarWidth]);
38770
+ useIsomorphicLayoutEffect(() => {
38747
38771
  if (!transitionsEnabled) {
38748
38772
  const id = requestAnimationFrame(() => {
38749
38773
  setTransitionsEnabled(true);
@@ -38765,35 +38789,27 @@ function NavigationSidebar({ config, disabled = false }) {
38765
38789
  "aria-hidden": "true"
38766
38790
  }
38767
38791
  ),
38768
- isTablet && /* @__PURE__ */ jsx292(
38769
- "div",
38770
- {
38771
- className: "h-full hidden md:block flex-shrink-0",
38772
- style: { width: `${MINIMIZED_WIDTH}px` },
38773
- "aria-hidden": "true"
38774
- }
38775
- ),
38792
+ /* @__PURE__ */ jsx292("div", { className: "h-full hidden md:block lg:hidden w-14 flex-shrink-0", "aria-hidden": "true" }),
38776
38793
  /* @__PURE__ */ jsxs230(
38777
38794
  "aside",
38778
38795
  {
38779
38796
  className: cn(
38797
+ SIDEBAR_CONTAINER,
38780
38798
  "flex-col hidden md:flex flex-shrink-0",
38781
38799
  "bg-ods-card border-r border-ods-border",
38782
- // Tablet: float the sidebar over content. Anchored to the layout row
38783
- // (`absolute` within AppLayout's `relative` row) NOT the viewport
38784
- // so an optional `topBar` above the row is not overlapped. With no
38785
- // topBar the row spans the full viewport, so this is visually
38786
- // identical to a viewport-fixed sidebar.
38787
- isTablet ? "absolute inset-y-0 left-0 z-[45]" : "relative h-full",
38800
+ SIDEBAR_GEOMETRY_CLASSES,
38801
+ // The one width a viewport cannot imply: an overlay the user opened on
38802
+ // tablet. Only ever true after a click, so the first paint always gets
38803
+ // the rail.
38804
+ isOverlayOpen ? SIDEBAR_TABLET_WIDTH.overlay : SIDEBAR_TABLET_WIDTH.rail,
38788
38805
  transitionsEnabled && "transition-[width] duration-300",
38789
38806
  config.className
38790
38807
  ),
38791
- style: { width: sidebarWidth },
38792
38808
  "aria-label": "Main navigation sidebar",
38793
38809
  children: [
38794
38810
  /* @__PURE__ */ jsx292(NavigationSidebarHeader, { minimized }),
38795
38811
  /* @__PURE__ */ jsxs230("div", { className: "flex-1 flex flex-col justify-between py-4 overflow-y-auto", children: [
38796
- /* @__PURE__ */ jsx292("nav", { className: "flex flex-col", "aria-label": "Primary navigation", children: primaryItems.map((item) => /* @__PURE__ */ jsx292(
38812
+ /* @__PURE__ */ jsx292("nav", { className: "flex flex-col", "aria-label": "Primary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.primary.map((key) => /* @__PURE__ */ jsx292(NavigationSidebarItemSkeleton, { showLabel }, key)) : primaryItems.map((item) => /* @__PURE__ */ jsx292(
38797
38813
  NavigationSidebarItemButton,
38798
38814
  {
38799
38815
  item,
@@ -38805,7 +38821,7 @@ function NavigationSidebar({ config, disabled = false }) {
38805
38821
  },
38806
38822
  item.id
38807
38823
  )) }),
38808
- secondaryItems.length > 0 && /* @__PURE__ */ jsx292("nav", { className: "flex flex-col", "aria-label": "Secondary navigation", children: secondaryItems.map((item) => /* @__PURE__ */ jsx292(
38824
+ (loadingRows ? loadingRows.secondary.length > 0 : secondaryItems.length > 0) && /* @__PURE__ */ jsx292("nav", { className: "flex flex-col", "aria-label": "Secondary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.secondary.map((key) => /* @__PURE__ */ jsx292(NavigationSidebarItemSkeleton, { showLabel }, key)) : secondaryItems.map((item) => /* @__PURE__ */ jsx292(
38809
38825
  NavigationSidebarItemButton,
38810
38826
  {
38811
38827
  item,
@@ -38917,6 +38933,11 @@ function HeaderMingoButton({
38917
38933
  "aria-pressed": isActive,
38918
38934
  className: cn(
38919
38935
  "flex items-center shrink-0 h-full gap-2 px-4",
38936
+ // Fixed 140px cell from md, so the header's right-hand cluster has a
38937
+ // known width and a loading placeholder can reserve it exactly
38938
+ // (`AppHeaderProps.loadingActionCells` → `'wide'`). Content-width below
38939
+ // md, and in `iconOnly` mode, where the control is a square affordance.
38940
+ !iconOnly && "md:w-[140px] md:justify-center",
38920
38941
  "transition-colors duration-200",
38921
38942
  "focus:outline-none focus-visible:ring-2 focus-visible:ring-ods-accent",
38922
38943
  // Transparent at rest so the cell inherits the bar's background
@@ -39025,9 +39046,32 @@ var AppHeader = React116.memo(function AppHeader2({
39025
39046
  className,
39026
39047
  isMobileMenuOpen,
39027
39048
  onToggleMobileMenu,
39028
- disabled = false
39049
+ disabled = false,
39050
+ loading = false,
39051
+ loadingActionCells
39029
39052
  }) {
39030
39053
  const isMdUp = useMdUp() ?? false;
39054
+ if (loading) {
39055
+ return /* @__PURE__ */ jsx296(
39056
+ AppHeaderSkeleton,
39057
+ {
39058
+ showSearch,
39059
+ actionCells: loadingActionCells ?? // Fallback: what the `show*` props imply, in the order the live cells are
39060
+ // mounted below. Only correct for a host that knows its header composition
39061
+ // before it starts loading. The cell types carry each control's own
39062
+ // breakpoint — the organization filter is `hidden lg:flex`, the avatar is
39063
+ // gated on `isMdUp`, and Mingo is `iconOnly` below md.
39064
+ [
39065
+ showOrganizations && "icon-lg",
39066
+ showTimeTracker && "icon",
39067
+ showNotifications && "icon",
39068
+ showUser && "icon-md",
39069
+ showMingoAI && "wide"
39070
+ ].filter(Boolean),
39071
+ className
39072
+ }
39073
+ );
39074
+ }
39031
39075
  const dimmedClass = disabled ? "pointer-events-none opacity-50" : "";
39032
39076
  const cellDivider = "border-l border-ods-border";
39033
39077
  return /* @__PURE__ */ jsx296(
@@ -39195,6 +39239,60 @@ function NotificationsHeaderButton({ fallbackUnreadCount, disabled, dimmedClass
39195
39239
  }
39196
39240
  );
39197
39241
  }
39242
+ var CELL_VISIBILITY = {
39243
+ icon: void 0,
39244
+ "icon-md": "hidden md:flex",
39245
+ "icon-lg": "hidden lg:flex"
39246
+ };
39247
+ function HeaderCellSkeleton({ className }) {
39248
+ return /* @__PURE__ */ jsx296(
39249
+ "div",
39250
+ {
39251
+ className: cn(
39252
+ "flex h-full w-12 shrink-0 items-center justify-center border-l border-ods-border md:w-14",
39253
+ className
39254
+ ),
39255
+ children: /* @__PURE__ */ jsx296("div", { className: "h-4 w-4 animate-pulse rounded bg-ods-border md:h-6 md:w-6" })
39256
+ }
39257
+ );
39258
+ }
39259
+ function HeaderWideCellSkeleton() {
39260
+ return /* @__PURE__ */ jsxs234("div", { className: "flex h-full w-12 shrink-0 items-center justify-center gap-2 border-l border-ods-border md:w-[140px] md:px-4", children: [
39261
+ /* @__PURE__ */ jsx296("div", { className: "h-4 w-4 shrink-0 animate-pulse rounded bg-ods-border md:h-6 md:w-6" }),
39262
+ /* @__PURE__ */ jsx296("div", { className: "hidden h-5 animate-pulse rounded bg-ods-border md:block md:w-[72px]" })
39263
+ ] });
39264
+ }
39265
+ function AppHeaderSkeleton({
39266
+ showSearch,
39267
+ actionCells,
39268
+ className
39269
+ }) {
39270
+ const cells = typeof actionCells === "number" ? Array.from({ length: Math.max(0, actionCells) }, () => "icon") : actionCells;
39271
+ return /* @__PURE__ */ jsx296(
39272
+ TopNavigation,
39273
+ {
39274
+ className: cn("sticky top-0 z-40", className),
39275
+ centerBreakpoint: "md",
39276
+ "aria-busy": "true",
39277
+ leading: (
39278
+ // Burger cell: mobile only, in CSS.
39279
+ /* @__PURE__ */ jsx296("div", { className: "flex h-full w-12 shrink-0 items-center justify-center border-r border-ods-border md:hidden", children: /* @__PURE__ */ jsx296("div", { className: "h-4 w-4 animate-pulse rounded bg-ods-border" }) })
39280
+ ),
39281
+ logo: /* @__PURE__ */ jsxs234(Fragment62, { children: [
39282
+ /* @__PURE__ */ jsx296("div", { className: "h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" }),
39283
+ /* @__PURE__ */ jsx296("div", { className: "h-4 w-24 animate-pulse rounded bg-ods-border" })
39284
+ ] }),
39285
+ logoClassName: "gap-2 md:hidden",
39286
+ center: showSearch ? /* @__PURE__ */ jsx296("div", { className: "h-10 w-full animate-pulse rounded-md bg-ods-border" }) : void 0,
39287
+ sideActions: /* @__PURE__ */ jsxs234(Fragment62, { children: [
39288
+ showSearch && /* @__PURE__ */ jsx296(HeaderCellSkeleton, { className: "md:hidden" }),
39289
+ cells.map(
39290
+ (cell, i) => cell === "wide" ? /* @__PURE__ */ jsx296(HeaderWideCellSkeleton, {}, i) : /* @__PURE__ */ jsx296(HeaderCellSkeleton, { className: CELL_VISIBILITY[cell] }, i)
39291
+ )
39292
+ ] })
39293
+ }
39294
+ );
39295
+ }
39198
39296
 
39199
39297
  // src/components/navigation/app-layout.tsx
39200
39298
  import { Suspense as Suspense2, useCallback as useCallback39, useMemo as useMemo40, useRef as useRef53, useState as useState94 } from "react";
@@ -42133,26 +42231,45 @@ function DataTableRoot({ table, children, className }) {
42133
42231
  }
42134
42232
 
42135
42233
  // src/components/ui/data-table/data-table-header.tsx
42136
- import { flexRender } from "@tanstack/react-table";
42137
42234
  init_cn();
42235
+ import { flexRender } from "@tanstack/react-table";
42138
42236
 
42139
42237
  // src/components/ui/data-table/data-table-column-filter.tsx
42140
42238
  init_cn();
42141
42239
  import { useCallback as useCallback43, useMemo as useMemo43 } from "react";
42142
42240
 
42143
42241
  // src/components/ui/data-table/utils.ts
42242
+ var BREAKPOINT_ORDER = ["md", "lg", "xl", "2xl"];
42144
42243
  function getHideClasses2(hideAt) {
42145
42244
  if (!hideAt) return "";
42146
42245
  const breakpoints = Array.isArray(hideAt) ? hideAt : [hideAt];
42147
- const order = ["md", "lg", "xl", "2xl"];
42148
42246
  if (breakpoints.length === 1) {
42149
42247
  return `hidden ${breakpoints[0]}:flex`;
42150
42248
  }
42151
- const maxIdx = Math.max(...breakpoints.map((bp) => order.indexOf(bp)));
42249
+ const maxIdx = Math.max(...breakpoints.map((bp) => BREAKPOINT_ORDER.indexOf(bp)));
42152
42250
  const hideClasses = breakpoints.map((bp) => `${bp}:hidden`).join(" ");
42153
- const showBreakpoint = order[maxIdx + 1];
42251
+ const showBreakpoint = BREAKPOINT_ORDER[maxIdx + 1];
42154
42252
  return showBreakpoint ? `${hideClasses} ${showBreakpoint}:flex` : hideClasses;
42155
42253
  }
42254
+ function getHideAtVisibility(hideAt) {
42255
+ const steps = BREAKPOINT_ORDER.length + 1;
42256
+ if (!hideAt) return Array.from({ length: steps }, () => true);
42257
+ const breakpoints = Array.isArray(hideAt) ? hideAt : [hideAt];
42258
+ if (breakpoints.length === 1) {
42259
+ const showFrom = BREAKPOINT_ORDER.indexOf(breakpoints[0]) + 1;
42260
+ return Array.from({ length: steps }, (_, step) => step >= showFrom);
42261
+ }
42262
+ const maxIdx = Math.max(...breakpoints.map((bp) => BREAKPOINT_ORDER.indexOf(bp)));
42263
+ const showBreakpoint = BREAKPOINT_ORDER[maxIdx + 1];
42264
+ const visible = [true];
42265
+ for (const bp of BREAKPOINT_ORDER) {
42266
+ let state = visible[visible.length - 1];
42267
+ if (breakpoints.includes(bp)) state = false;
42268
+ if (bp === showBreakpoint) state = true;
42269
+ visible.push(state);
42270
+ }
42271
+ return visible;
42272
+ }
42156
42273
  function alignJustify(align) {
42157
42274
  switch (align) {
42158
42275
  case "center":
@@ -42208,38 +42325,56 @@ function DataTableColumnFilter({
42208
42325
  const handleReset = useCallback43(() => {
42209
42326
  column.setFilterValue(void 0);
42210
42327
  }, [column]);
42328
+ const isPending = options.length === 0;
42329
+ const trigger = /* @__PURE__ */ jsxs264(
42330
+ "div",
42331
+ {
42332
+ className: cn(
42333
+ // Fixed 48px per design, same as the plain header cell next to it —
42334
+ // NOT padding around the label. The two were drifting: 12px+20px+12px
42335
+ // came out 44px here while the sibling was pinned to 48, so in a
42336
+ // header mixing filterable and plain columns the labels sat on
42337
+ // different centre lines and the filter's hit area was 4px short of
42338
+ // the row it belongs to.
42339
+ "group flex w-full items-center gap-[var(--spacing-system-xsf)] h-12 rounded-sm transition-colors duration-200 select-none",
42340
+ alignJustify(align),
42341
+ isPending ? "cursor-default" : "cursor-pointer"
42342
+ ),
42343
+ "aria-label": `Filter by ${label}`,
42344
+ "aria-disabled": isPending || void 0,
42345
+ children: [
42346
+ /* @__PURE__ */ jsx332(
42347
+ "span",
42348
+ {
42349
+ className: cn(
42350
+ "text-h5 text-ods-text-secondary whitespace-nowrap transition-colors duration-200",
42351
+ !isPending && "group-hover:text-ods-text-primary"
42352
+ ),
42353
+ children: label
42354
+ }
42355
+ ),
42356
+ /* @__PURE__ */ jsx332(
42357
+ Filter02Icon,
42358
+ {
42359
+ className: cn(
42360
+ "w-4 h-4 transition-colors",
42361
+ activeCount > 0 && "text-ods-accent",
42362
+ activeCount === 0 && "text-ods-text-secondary",
42363
+ activeCount === 0 && !isPending && "group-hover:text-ods-text-primary"
42364
+ )
42365
+ }
42366
+ )
42367
+ ]
42368
+ }
42369
+ );
42370
+ if (isPending) {
42371
+ return /* @__PURE__ */ jsx332("div", { className: "block w-full", children: trigger });
42372
+ }
42211
42373
  return /* @__PURE__ */ jsx332(
42212
42374
  FiltersDropdown,
42213
42375
  {
42214
42376
  className: "!block w-full",
42215
- triggerElement: /* @__PURE__ */ jsxs264(
42216
- "div",
42217
- {
42218
- className: cn(
42219
- // Fixed 48px per design, same as the plain header cell next to it —
42220
- // NOT padding around the label. The two were drifting: 12px+20px+12px
42221
- // came out 44px here while the sibling was pinned to 48, so in a
42222
- // header mixing filterable and plain columns the labels sat on
42223
- // different centre lines and the filter's hit area was 4px short of
42224
- // the row it belongs to.
42225
- "group flex w-full items-center gap-[var(--spacing-system-xsf)] h-12 rounded-sm cursor-pointer transition-colors duration-200 select-none",
42226
- alignJustify(align)
42227
- ),
42228
- "aria-label": `Filter by ${label}`,
42229
- children: [
42230
- /* @__PURE__ */ jsx332("span", { className: "text-h5 text-ods-text-secondary whitespace-nowrap transition-colors duration-200 group-hover:text-ods-text-primary", children: label }),
42231
- /* @__PURE__ */ jsx332(
42232
- Filter02Icon,
42233
- {
42234
- className: cn(
42235
- "w-4 h-4 transition-colors",
42236
- activeCount > 0 ? "text-ods-accent" : "text-ods-text-secondary group-hover:text-ods-text-primary"
42237
- )
42238
- }
42239
- )
42240
- ]
42241
- }
42242
- ),
42377
+ triggerElement: trigger,
42243
42378
  sections,
42244
42379
  currentFilters,
42245
42380
  onApply: handleApply,
@@ -42261,15 +42396,11 @@ function DataTableHeader({
42261
42396
  onSortChange
42262
42397
  }) {
42263
42398
  const table = useDataTableContext();
42264
- const isLgUp = useLgUp() ?? false;
42265
42399
  const headerGroup = table.getHeaderGroups()[0];
42266
42400
  if (!headerGroup) return null;
42267
- const hasVisibleHeaderCell = headerGroup.headers.some((header) => {
42268
- if (header.isPlaceholder) return false;
42269
- if (isLgUp) return true;
42270
- const meta = header.column.columnDef.meta;
42271
- return Boolean(meta?.filter) || meta?.alwaysShowHeader === true;
42272
- });
42401
+ const hasTabletVisibleCell = headerGroup.headers.some(
42402
+ (header) => !header.isPlaceholder && keepsCellOnTablet(header.column.columnDef.meta)
42403
+ );
42273
42404
  return /* @__PURE__ */ jsx333(
42274
42405
  "div",
42275
42406
  {
@@ -42279,45 +42410,101 @@ function DataTableHeader({
42279
42410
  className
42280
42411
  ),
42281
42412
  children: /* @__PURE__ */ jsxs265("div", { className: "flex items-stretch gap-[var(--spacing-system-mf)] px-[var(--spacing-system-mf)] relative", children: [
42282
- headerGroup.headers.map((header) => /* @__PURE__ */ jsx333(
42283
- HeaderCell,
42413
+ headerGroup.headers.map((header) => /* @__PURE__ */ jsx333(HeaderCell, { header, sort, onSortChange }, header.id)),
42414
+ rightSlot && /* @__PURE__ */ jsx333(
42415
+ "div",
42284
42416
  {
42285
- header,
42286
- isLgUp,
42287
- sort,
42288
- onSortChange
42289
- },
42290
- header.id
42291
- )),
42292
- rightSlot && (hasVisibleHeaderCell ? /* @__PURE__ */ jsx333("div", { className: "absolute right-[var(--spacing-system-mf)] inset-y-0 flex items-center", children: rightSlot }) : (
42293
- // In-flow fallback: with no visible header cell this slot is the
42294
- // only thing giving the row height, so it carries the same fixed 48
42295
- // rather than padding out to 44.
42296
- /* @__PURE__ */ jsx333("div", { className: "ml-auto flex items-center h-12", children: rightSlot })
42297
- ))
42417
+ className: cn(
42418
+ "flex items-center",
42419
+ hasTabletVisibleCell ? "absolute right-[var(--spacing-system-mf)] inset-y-0" : (
42420
+ // No cell is visible below lg, so there this slot is the only thing
42421
+ // giving the row height and carries the same fixed 48 rather than
42422
+ // padding out to 44. From lg the cells are back and it returns to
42423
+ // the absolute placement. Safe as a `max-lg:` override: nothing
42424
+ // else in this string sets margin or height, so it competes only
42425
+ // with unprefixed defaults, never with a `md:`/`lg:` class.
42426
+ "max-lg:ml-auto max-lg:h-12 lg:absolute lg:right-[var(--spacing-system-mf)] lg:inset-y-0"
42427
+ )
42428
+ ),
42429
+ children: rightSlot
42430
+ }
42431
+ )
42298
42432
  ] })
42299
42433
  }
42300
42434
  );
42301
42435
  }
42302
- function HeaderCell({ header, isLgUp, sort, onSortChange }) {
42436
+ function keepsCellOnTablet(meta) {
42437
+ return Boolean(meta?.filter) || meta?.alwaysShowHeader === true;
42438
+ }
42439
+ var SHOW_FROM = {
42440
+ md: "md:flex",
42441
+ lg: "lg:flex",
42442
+ xl: "xl:flex",
42443
+ "2xl": "2xl:flex"
42444
+ };
42445
+ var HIDE_FROM = {
42446
+ md: "md:hidden",
42447
+ lg: "lg:hidden",
42448
+ xl: "xl:hidden",
42449
+ "2xl": "2xl:hidden"
42450
+ };
42451
+ var LG_STEP = BREAKPOINT_ORDER.indexOf("lg") + 1;
42452
+ function getCellVisibilityClasses(keepOnTablet, hideAt) {
42453
+ const fromHideAt = getHideAtVisibility(hideAt);
42454
+ const visible = fromHideAt.map(
42455
+ (shown, step) => keepOnTablet ? (
42456
+ // Reachable below lg whatever `hideAt` says; from lg it governs again.
42457
+ step < LG_STEP || shown
42458
+ ) : (
42459
+ // Otherwise lg is a floor `hideAt` can raise but never lower.
42460
+ shown && step >= LG_STEP
42461
+ )
42462
+ );
42463
+ const classes = [visible[0] ? "flex" : "hidden"];
42464
+ for (let step = 1; step < visible.length; step++) {
42465
+ if (visible[step] === visible[step - 1]) continue;
42466
+ const breakpoint = BREAKPOINT_ORDER[step - 1];
42467
+ classes.push(visible[step] ? SHOW_FROM[breakpoint] : HIDE_FROM[breakpoint]);
42468
+ }
42469
+ return classes.join(" ");
42470
+ }
42471
+ function HeaderCell({ header, sort, onSortChange }) {
42303
42472
  if (header.isPlaceholder) return null;
42304
42473
  const column = header.column;
42305
42474
  const meta = column.columnDef.meta;
42306
42475
  const hasFilter = Boolean(meta?.filter);
42307
- const keepOnTablet = hasFilter || meta?.alwaysShowHeader === true;
42476
+ const keepOnTablet = keepsCellOnTablet(meta);
42308
42477
  const align = meta?.align ?? "left";
42309
42478
  const canSort = meta?.sortable === true;
42310
42479
  const sortDir = sort?.id === column.id ? sort.desc ? "desc" : "asc" : false;
42311
- if (!isLgUp && !keepOnTablet) return null;
42312
42480
  return /* @__PURE__ */ jsx333(
42313
42481
  "div",
42314
42482
  {
42315
42483
  className: cn(
42316
- "flex items-stretch",
42317
- isLgUp && (meta?.width || "flex-1 min-w-0"),
42318
- meta?.headerClassName,
42319
- // Don't apply hide classes if column is filterable on tablet (keep filter accessible)
42320
- !(keepOnTablet && !isLgUp) && getHideClasses2(meta?.hideAt)
42484
+ "items-stretch",
42485
+ // Cells are hidden rather than dropped from the tree, so which columns
42486
+ // exist never depends on when an effect ran.
42487
+ getCellVisibilityClasses(keepOnTablet, meta?.hideAt),
42488
+ // Width applies from lg only. Stated as "always, neutralized below lg"
42489
+ // because `meta.width` is an opaque consumer string that cannot be
42490
+ // prefixed. Only `keepOnTablet` cells need the override — the rest are
42491
+ // hidden below lg anyway.
42492
+ //
42493
+ // `[&&]` doubles the class in the selector (`.cls.cls`, specificity 0-2-0),
42494
+ // and it is load-bearing: consumers routinely write a RESPONSIVE width
42495
+ // (`w-[80px] md:w-1/5` is the common shape), and between md and lg that
42496
+ // `md:` rule and this `max-lg:` one both match. At equal specificity source
42497
+ // order decides, and Tailwind emits the `max-lg` block BEFORE the `md` one
42498
+ // — the same ordering documented for visibility above — so the tablet would
42499
+ // keep a width the design drops there, leaving the cells spread across the
42500
+ // row instead of packed beside their filters. An opaque consumer string
42501
+ // cannot be outranked by ordering, so this wins on the cascade's other axis.
42502
+ // Specificity rather than `!important`: it stays a normal declaration, so a
42503
+ // consumer that genuinely needs a tablet width can still take it back with a
42504
+ // more specific rule — `!important` could only be answered with another one.
42505
+ meta?.width || "flex-1 min-w-0",
42506
+ keepOnTablet && "max-lg:[&&]:w-auto max-lg:[&&]:flex-none max-lg:[&&]:basis-auto",
42507
+ meta?.headerClassName
42321
42508
  ),
42322
42509
  children: hasFilter ? /* @__PURE__ */ jsx333(
42323
42510
  DataTableColumnFilter,
@@ -42335,7 +42522,9 @@ function HeaderCell({ header, isLgUp, sort, onSortChange }) {
42335
42522
  // Fixed 48px header height per design (20px label centered inside)
42336
42523
  // instead of the padding-driven 44px.
42337
42524
  "flex w-full items-center gap-[var(--spacing-system-xsf)] h-12 rounded-sm select-none transition-colors duration-200",
42338
- isLgUp && alignJustify(align),
42525
+ // Same "always, neutralized below lg" shape as the width above.
42526
+ alignJustify(align),
42527
+ keepOnTablet && "max-lg:justify-start",
42339
42528
  canSort && "group cursor-pointer"
42340
42529
  ),
42341
42530
  onClick: canSort ? () => onSortChange?.(column.id) : void 0,
@@ -42396,6 +42585,7 @@ init_cn();
42396
42585
  import { Fragment as Fragment69, jsx as jsx335, jsxs as jsxs266 } from "react/jsx-runtime";
42397
42586
  var ROW_HEIGHT_DESKTOP2 = "h-[66px] md:h-[78px]";
42398
42587
  var ROW_HEIGHT_MOBILE2 = "h-[66px]";
42588
+ var ROW_SHELL_CLASSES = "items-center gap-[var(--spacing-system-mf)] px-[var(--spacing-system-mf)]";
42399
42589
  function DataTableSkeleton({
42400
42590
  rows = 10,
42401
42591
  className,
@@ -42416,7 +42606,8 @@ function DataTableSkeleton({
42416
42606
  "div",
42417
42607
  {
42418
42608
  className: cn(
42419
- "hidden md:flex items-center gap-[var(--spacing-system-mf)] px-[var(--spacing-system-mf)] py-0",
42609
+ "hidden md:flex py-0",
42610
+ ROW_SHELL_CLASSES,
42420
42611
  ROW_HEIGHT_DESKTOP2,
42421
42612
  rowClassName
42422
42613
  ),
@@ -42449,7 +42640,8 @@ function DataTableSkeleton({
42449
42640
  "div",
42450
42641
  {
42451
42642
  className: cn(
42452
- "flex md:hidden gap-[var(--spacing-system-sf)] items-center justify-start px-[var(--spacing-system-sf)] py-0",
42643
+ "flex md:hidden justify-start py-0",
42644
+ ROW_SHELL_CLASSES,
42453
42645
  ROW_HEIGHT_MOBILE2,
42454
42646
  rowClassName
42455
42647
  ),
@@ -42505,7 +42697,8 @@ function DataTableRowImpl({
42505
42697
  "div",
42506
42698
  {
42507
42699
  className: cn(
42508
- "flex items-center gap-[var(--spacing-system-mf)] px-[var(--spacing-system-mf)]",
42700
+ "flex",
42701
+ ROW_SHELL_CLASSES,
42509
42702
  compact ? "py-[var(--spacing-system-xsf)]" : autoHeight ? "py-[var(--spacing-system-sf)] min-h-[66px] md:min-h-[78px]" : `py-0 ${ROW_HEIGHT_DESKTOP2}`,
42510
42703
  hasSubRow && "border-b border-ods-border"
42511
42704
  ),
@@ -42625,7 +42818,8 @@ function DataTableBody({
42625
42818
  "div",
42626
42819
  {
42627
42820
  className: cn(
42628
- "hidden md:flex items-center gap-[var(--spacing-system-mf)] px-[var(--spacing-system-mf)] py-0",
42821
+ "hidden md:flex py-0",
42822
+ ROW_SHELL_CLASSES,
42629
42823
  ROW_HEIGHT_DESKTOP2
42630
42824
  )
42631
42825
  }
@@ -42634,7 +42828,8 @@ function DataTableBody({
42634
42828
  "div",
42635
42829
  {
42636
42830
  className: cn(
42637
- "flex md:hidden gap-[var(--spacing-system-sf)] items-center justify-start px-[var(--spacing-system-sf)] py-0",
42831
+ "flex md:hidden justify-start py-0",
42832
+ ROW_SHELL_CLASSES,
42638
42833
  ROW_HEIGHT_MOBILE2
42639
42834
  )
42640
42835
  }
@@ -57212,6 +57407,7 @@ export {
57212
57407
  DataTableEmpty,
57213
57408
  ROW_HEIGHT_DESKTOP2 as ROW_HEIGHT_DESKTOP,
57214
57409
  ROW_HEIGHT_MOBILE2 as ROW_HEIGHT_MOBILE,
57410
+ ROW_SHELL_CLASSES,
57215
57411
  DataTableSkeleton,
57216
57412
  DataTableRow,
57217
57413
  DataTableBody,
@@ -57265,6 +57461,7 @@ export {
57265
57461
  SlidingSidebar,
57266
57462
  StickySectionNav,
57267
57463
  useSectionNavigation,
57464
+ NAVIGATION_SIDEBAR_WIDTH_VAR,
57268
57465
  NavigationSidebar,
57269
57466
  HeaderGlobalSearch,
57270
57467
  HeaderMingoButton,
@@ -57289,4 +57486,4 @@ export {
57289
57486
  LogsList,
57290
57487
  assets
57291
57488
  };
57292
- //# sourceMappingURL=chunk-QUFB5SDZ.js.map
57489
+ //# sourceMappingURL=chunk-SOX7CGFX.js.map