@flamingo-stack/openframe-frontend-core 0.0.661 → 0.0.662-snapshot.20260923194332

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 (133) hide show
  1. package/dist/{chunk-M23ZPKOK.js → chunk-3PSNWOAP.js} +4 -4
  2. package/dist/{chunk-D7QWYQBQ.cjs → chunk-4ZEHQXQ5.cjs} +75 -75
  3. package/dist/{chunk-D7QWYQBQ.cjs.map → chunk-4ZEHQXQ5.cjs.map} +1 -1
  4. package/dist/{chunk-YNW3DQFY.cjs → chunk-67FVIC5H.cjs} +81 -53
  5. package/dist/chunk-67FVIC5H.cjs.map +1 -0
  6. package/dist/{chunk-J5TAB64U.js → chunk-7I4DGWF5.js} +2 -2
  7. package/dist/{chunk-24T5HZPB.cjs → chunk-BASKR3Z4.cjs} +1 -1
  8. package/dist/chunk-BASKR3Z4.cjs.map +1 -0
  9. package/dist/{chunk-GXHZCGVJ.cjs → chunk-BSETJKSW.cjs} +25 -25
  10. package/dist/{chunk-GXHZCGVJ.cjs.map → chunk-BSETJKSW.cjs.map} +1 -1
  11. package/dist/{chunk-N4ORXOZK.cjs → chunk-DF6UYONR.cjs} +10 -10
  12. package/dist/{chunk-N4ORXOZK.cjs.map → chunk-DF6UYONR.cjs.map} +1 -1
  13. package/dist/{chunk-Z572FXXM.js → chunk-EX3YF5UR.js} +2 -2
  14. package/dist/{chunk-U4N65JUW.js → chunk-FXEOBJKX.js} +4 -4
  15. package/dist/{chunk-WDJT7NJ5.js → chunk-HZ3KIFUW.js} +5 -5
  16. package/dist/{chunk-PC5WWTDM.js → chunk-I5ZKHDT6.js} +3 -3
  17. package/dist/{chunk-5LS7KNAU.js → chunk-IHTDANFB.js} +7 -7
  18. package/dist/{chunk-F5LMTKQD.js → chunk-J3T2WNWC.js} +5 -5
  19. package/dist/{chunk-Q4XWYP5U.js → chunk-JVAG5CHS.js} +140 -112
  20. package/dist/chunk-JVAG5CHS.js.map +1 -0
  21. package/dist/{chunk-UA3V3KXX.js → chunk-KU7HL52F.js} +1 -1
  22. package/dist/chunk-KU7HL52F.js.map +1 -0
  23. package/dist/{chunk-7KNVRRI4.cjs → chunk-LPZHG75D.cjs} +25 -25
  24. package/dist/{chunk-7KNVRRI4.cjs.map → chunk-LPZHG75D.cjs.map} +1 -1
  25. package/dist/{chunk-ZASHVL45.cjs → chunk-MB5RK5WQ.cjs} +3 -3
  26. package/dist/{chunk-ZASHVL45.cjs.map → chunk-MB5RK5WQ.cjs.map} +1 -1
  27. package/dist/{chunk-4EY5JSMK.cjs → chunk-MEVV7FIR.cjs} +5 -5
  28. package/dist/{chunk-4EY5JSMK.cjs.map → chunk-MEVV7FIR.cjs.map} +1 -1
  29. package/dist/{chunk-IMDYBINC.js → chunk-N55XI4LH.js} +4 -4
  30. package/dist/{chunk-RFGXKRRL.js → chunk-NAML3TDW.js} +7 -7
  31. package/dist/{chunk-TRR6XUEP.js → chunk-OJR7KKCI.js} +3 -3
  32. package/dist/{chunk-LXBHYUIN.js → chunk-OZTH6T4W.js} +2 -2
  33. package/dist/{chunk-6VY6PXAN.cjs → chunk-P3IDYJE5.cjs} +33 -33
  34. package/dist/{chunk-6VY6PXAN.cjs.map → chunk-P3IDYJE5.cjs.map} +1 -1
  35. package/dist/{chunk-WGTKYVBK.cjs → chunk-PBEXPLFI.cjs} +12 -12
  36. package/dist/{chunk-WGTKYVBK.cjs.map → chunk-PBEXPLFI.cjs.map} +1 -1
  37. package/dist/{chunk-EUT6SQW7.js → chunk-Q3G5WOER.js} +3 -3
  38. package/dist/{chunk-4JITKV2S.cjs → chunk-REQ2AIEE.cjs} +51 -51
  39. package/dist/{chunk-4JITKV2S.cjs.map → chunk-REQ2AIEE.cjs.map} +1 -1
  40. package/dist/{chunk-4NKKPGDN.js → chunk-RP4TSHMY.js} +2 -2
  41. package/dist/{chunk-GLDXZK76.cjs → chunk-RYEMWKYE.cjs} +7 -7
  42. package/dist/{chunk-GLDXZK76.cjs.map → chunk-RYEMWKYE.cjs.map} +1 -1
  43. package/dist/{chunk-RPHRBZG6.cjs → chunk-TKASQOSM.cjs} +3 -3
  44. package/dist/{chunk-RPHRBZG6.cjs.map → chunk-TKASQOSM.cjs.map} +1 -1
  45. package/dist/{chunk-KCYGLC7Q.js → chunk-V54WTP2E.js} +5 -5
  46. package/dist/{chunk-H3DF7COI.cjs → chunk-VKKVWGFW.cjs} +44 -44
  47. package/dist/{chunk-H3DF7COI.cjs.map → chunk-VKKVWGFW.cjs.map} +1 -1
  48. package/dist/{chunk-XNJZ6A2S.cjs → chunk-WDE7ETA5.cjs} +5 -5
  49. package/dist/{chunk-XNJZ6A2S.cjs.map → chunk-WDE7ETA5.cjs.map} +1 -1
  50. package/dist/{chunk-XOA32PN3.cjs → chunk-WZ6OV7VU.cjs} +22 -22
  51. package/dist/{chunk-XOA32PN3.cjs.map → chunk-WZ6OV7VU.cjs.map} +1 -1
  52. package/dist/{chunk-QARWK4LN.cjs → chunk-XKQJDXDO.cjs} +10 -10
  53. package/dist/{chunk-QARWK4LN.cjs.map → chunk-XKQJDXDO.cjs.map} +1 -1
  54. package/dist/{chunk-FC6I2NWF.js → chunk-XSQSTJ5D.js} +2 -2
  55. package/dist/{chunk-ZIT4TC5R.cjs → chunk-XVSA4565.cjs} +248 -248
  56. package/dist/{chunk-ZIT4TC5R.cjs.map → chunk-XVSA4565.cjs.map} +1 -1
  57. package/dist/components/case-studies/index.cjs +20 -20
  58. package/dist/components/case-studies/index.js +5 -5
  59. package/dist/components/chat/index.cjs +3 -3
  60. package/dist/components/chat/index.js +2 -2
  61. package/dist/components/contact/index.cjs +6 -6
  62. package/dist/components/contact/index.js +5 -5
  63. package/dist/components/docs/index.cjs +9 -9
  64. package/dist/components/docs/index.js +8 -8
  65. package/dist/components/embeds/index.cjs +6 -6
  66. package/dist/components/embeds/index.js +5 -5
  67. package/dist/components/faq/index.cjs +6 -6
  68. package/dist/components/faq/index.js +5 -5
  69. package/dist/components/features/index.cjs +5 -5
  70. package/dist/components/features/index.js +4 -4
  71. package/dist/components/help-center-pages/index.cjs +25 -25
  72. package/dist/components/help-center-pages/index.js +16 -16
  73. package/dist/components/icons/elestio-logo.d.ts +4 -1
  74. package/dist/components/icons/elestio-logo.d.ts.map +1 -1
  75. package/dist/components/icons/index.cjs +2 -2
  76. package/dist/components/icons/index.js +1 -1
  77. package/dist/components/index.cjs +44 -42
  78. package/dist/components/index.cjs.map +1 -1
  79. package/dist/components/index.js +17 -15
  80. package/dist/components/index.js.map +1 -1
  81. package/dist/components/meeting-scheduler/index.cjs +28 -28
  82. package/dist/components/meeting-scheduler/index.js +4 -4
  83. package/dist/components/navigation/index.cjs +10 -8
  84. package/dist/components/navigation/index.cjs.map +1 -1
  85. package/dist/components/navigation/index.d.ts +2 -0
  86. package/dist/components/navigation/index.d.ts.map +1 -1
  87. package/dist/components/navigation/index.js +9 -7
  88. package/dist/components/navigation/mobile-burger-menu.d.ts.map +1 -1
  89. package/dist/components/navigation/navigation-item-badge.d.ts +22 -0
  90. package/dist/components/navigation/navigation-item-badge.d.ts.map +1 -0
  91. package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
  92. package/dist/components/onboarding-guides/index.cjs +8 -8
  93. package/dist/components/onboarding-guides/index.js +7 -7
  94. package/dist/components/tickets/index.cjs +9 -9
  95. package/dist/components/tickets/index.js +8 -8
  96. package/dist/components/ui/index.cjs +5 -5
  97. package/dist/components/ui/index.js +4 -4
  98. package/dist/hooks/index.cjs +3 -3
  99. package/dist/hooks/index.js +2 -2
  100. package/dist/index.cjs +11 -9
  101. package/dist/index.cjs.map +1 -1
  102. package/dist/index.js +10 -8
  103. package/dist/index.js.map +1 -1
  104. package/dist/types/navigation.d.ts +8 -0
  105. package/dist/types/navigation.d.ts.map +1 -1
  106. package/package.json +1 -1
  107. package/src/components/icons/elestio-logo.tsx +4 -1
  108. package/src/components/navigation/index.ts +2 -0
  109. package/src/components/navigation/mobile-burger-menu.tsx +16 -8
  110. package/src/components/navigation/navigation-item-badge.tsx +40 -0
  111. package/src/components/navigation/navigation-sidebar-item.tsx +15 -4
  112. package/src/stories/AppLayout.stories.tsx +1 -0
  113. package/src/types/navigation.ts +8 -0
  114. package/dist/chunk-24T5HZPB.cjs.map +0 -1
  115. package/dist/chunk-Q4XWYP5U.js.map +0 -1
  116. package/dist/chunk-UA3V3KXX.js.map +0 -1
  117. package/dist/chunk-YNW3DQFY.cjs.map +0 -1
  118. /package/dist/{chunk-M23ZPKOK.js.map → chunk-3PSNWOAP.js.map} +0 -0
  119. /package/dist/{chunk-J5TAB64U.js.map → chunk-7I4DGWF5.js.map} +0 -0
  120. /package/dist/{chunk-Z572FXXM.js.map → chunk-EX3YF5UR.js.map} +0 -0
  121. /package/dist/{chunk-U4N65JUW.js.map → chunk-FXEOBJKX.js.map} +0 -0
  122. /package/dist/{chunk-WDJT7NJ5.js.map → chunk-HZ3KIFUW.js.map} +0 -0
  123. /package/dist/{chunk-PC5WWTDM.js.map → chunk-I5ZKHDT6.js.map} +0 -0
  124. /package/dist/{chunk-5LS7KNAU.js.map → chunk-IHTDANFB.js.map} +0 -0
  125. /package/dist/{chunk-F5LMTKQD.js.map → chunk-J3T2WNWC.js.map} +0 -0
  126. /package/dist/{chunk-IMDYBINC.js.map → chunk-N55XI4LH.js.map} +0 -0
  127. /package/dist/{chunk-RFGXKRRL.js.map → chunk-NAML3TDW.js.map} +0 -0
  128. /package/dist/{chunk-TRR6XUEP.js.map → chunk-OJR7KKCI.js.map} +0 -0
  129. /package/dist/{chunk-LXBHYUIN.js.map → chunk-OZTH6T4W.js.map} +0 -0
  130. /package/dist/{chunk-EUT6SQW7.js.map → chunk-Q3G5WOER.js.map} +0 -0
  131. /package/dist/{chunk-4NKKPGDN.js.map → chunk-RP4TSHMY.js.map} +0 -0
  132. /package/dist/{chunk-KCYGLC7Q.js.map → chunk-V54WTP2E.js.map} +0 -0
  133. /package/dist/{chunk-FC6I2NWF.js.map → chunk-XSQSTJ5D.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  useOptionalTicketLive
4
- } from "./chunk-EUT6SQW7.js";
4
+ } from "./chunk-Q3G5WOER.js";
5
5
  import {
6
6
  AppLayoutDrawerContainerContext,
7
7
  AppLayoutDrawerCoordinationContext,
@@ -13,15 +13,16 @@ import {
13
13
  UnreadDot,
14
14
  buildTicketOpenHref,
15
15
  useOptionalNotifications
16
- } from "./chunk-M23ZPKOK.js";
16
+ } from "./chunk-3PSNWOAP.js";
17
17
  import {
18
18
  useFocusTrap,
19
19
  useLocalStorage
20
- } from "./chunk-LXBHYUIN.js";
20
+ } from "./chunk-OZTH6T4W.js";
21
21
  import {
22
22
  OVERLAY_BACKDROP_CLASS,
23
+ Tag,
23
24
  useIsHydrated
24
- } from "./chunk-4NKKPGDN.js";
25
+ } from "./chunk-RP4TSHMY.js";
25
26
  import {
26
27
  useHeaderHeight,
27
28
  useIsomorphicLayoutEffect,
@@ -33,7 +34,7 @@ import {
33
34
  MingoIcon,
34
35
  OpenFrameText,
35
36
  UserIcon
36
- } from "./chunk-UA3V3KXX.js";
37
+ } from "./chunk-KU7HL52F.js";
37
38
  import {
38
39
  BellIcon,
39
40
  Chevrons03LeftIcon,
@@ -893,7 +894,25 @@ function NavigationSidebarHeader({ minimized }) {
893
894
 
894
895
  // src/components/navigation/navigation-sidebar-item.tsx
895
896
  import { cloneElement, memo } from "react";
896
- import { Fragment as Fragment5, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
897
+
898
+ // src/components/navigation/navigation-item-badge.tsx
899
+ import { jsx as jsx10 } from "react/jsx-runtime";
900
+ function NavigationItemBadge({ label, compact = false, className, ...rest }) {
901
+ return /* @__PURE__ */ jsx10(
902
+ Tag,
903
+ {
904
+ as: "span",
905
+ label,
906
+ variant: "warning",
907
+ className: cn("pointer-events-none shrink-0", compact && "h-5 px-[var(--spacing-system-xxs)]", className),
908
+ labelClassName: compact ? "text-badge" : void 0,
909
+ ...rest
910
+ }
911
+ );
912
+ }
913
+
914
+ // src/components/navigation/navigation-sidebar-item.tsx
915
+ import { Fragment as Fragment5, jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
897
916
  var NavigationSidebarItemButton = memo(function NavigationSidebarItemButtonImpl({
898
917
  item,
899
918
  isActive,
@@ -904,6 +923,7 @@ var NavigationSidebarItemButton = memo(function NavigationSidebarItemButtonImpl(
904
923
  }) {
905
924
  const unreadCount = item.unreadCount ?? 0;
906
925
  const hasUnread = unreadCount > 0;
926
+ const name = item.badge ? `${item.label} (${item.badge})` : item.label;
907
927
  const className = cn(
908
928
  // `isolate` scopes the hover layer's negative z-index to this row, so it
909
929
  // paints over the row's own background and under its content instead of
@@ -944,43 +964,46 @@ var NavigationSidebarItemButton = memo(function NavigationSidebarItemButtonImpl(
944
964
  cloneElement(item.icon, {
945
965
  color: isActive && !disabled ? "text-ods-accent" : "text-ods-text-secondary"
946
966
  }),
947
- hasUnread && !showLabel && /* @__PURE__ */ jsx10(UnreadDot, { size: "fixed" })
967
+ hasUnread && !showLabel && /* @__PURE__ */ jsx11(UnreadDot, { size: "fixed" })
948
968
  ] }),
949
- /* @__PURE__ */ jsx10(
969
+ /* @__PURE__ */ jsxs9(
950
970
  "span",
951
971
  {
952
972
  className: cn(
953
- "flex-1 truncate text-left transition-[opacity,margin-left] duration-300 text-h4",
973
+ "flex min-w-0 flex-1 items-center overflow-hidden text-left transition-[opacity,margin-left] duration-300",
954
974
  showLabel ? "ml-[var(--spacing-system-xs)] opacity-100" : "ml-0 opacity-0"
955
975
  ),
956
976
  "aria-hidden": !showLabel,
957
- children: item.label
977
+ children: [
978
+ /* @__PURE__ */ jsx11("span", { className: "min-w-0 truncate text-h4", children: item.label }),
979
+ item.badge && /* @__PURE__ */ jsx11(NavigationItemBadge, { label: item.badge, className: "ml-[var(--spacing-system-xs)] shrink-0" })
980
+ ]
958
981
  }
959
982
  ),
960
- hasUnread && showLabel && /* @__PURE__ */ jsx10("span", { className: "flex size-6 flex-shrink-0 items-center justify-center rounded-md bg-ods-accent p-2", children: /* @__PURE__ */ jsx10("span", { className: "text-ods-text-on-accent text-h5", children: unreadCount > 99 ? "99+" : unreadCount }) })
983
+ hasUnread && showLabel && /* @__PURE__ */ jsx11("span", { className: "flex size-6 flex-shrink-0 items-center justify-center rounded-md bg-ods-accent p-2", children: /* @__PURE__ */ jsx11("span", { className: "text-ods-text-on-accent text-h5", children: unreadCount > 99 ? "99+" : unreadCount }) })
961
984
  ] });
962
985
  const shared = {
963
986
  className,
964
- title: !showLabel ? item.label : void 0,
965
- "aria-label": item.label,
987
+ title: !showLabel ? name : void 0,
988
+ "aria-label": name,
966
989
  "aria-current": isActive ? "page" : void 0
967
990
  };
968
991
  if (disabled || !item.path || item.onClick) {
969
- return /* @__PURE__ */ jsx10("button", { type: "button", onClick: (event) => onClick(item, event), disabled, ...shared, children: content });
992
+ return /* @__PURE__ */ jsx11("button", { type: "button", onClick: (event) => onClick(item, event), disabled, ...shared, children: content });
970
993
  }
971
- return /* @__PURE__ */ jsx10(next_link_default, { href: item.path, onClick: (event) => onClick(item, event), ...shared, children: content });
994
+ return /* @__PURE__ */ jsx11(next_link_default, { href: item.path, onClick: (event) => onClick(item, event), ...shared, children: content });
972
995
  });
973
996
  function NavigationSidebarItemSkeleton({ showLabel }) {
974
997
  return /* @__PURE__ */ jsxs9("div", { className: "flex h-14 w-full items-center justify-start p-[var(--spacing-system-m)]", "aria-hidden": "true", children: [
975
- /* @__PURE__ */ jsx10("div", { className: "relative flex flex-shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx10("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) }),
976
- showLabel && /* @__PURE__ */ jsx10("div", { className: "ml-[var(--spacing-system-xs)] h-4 flex-1 animate-pulse rounded bg-ods-border" })
998
+ /* @__PURE__ */ jsx11("div", { className: "relative flex flex-shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx11("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) }),
999
+ showLabel && /* @__PURE__ */ jsx11("div", { className: "ml-[var(--spacing-system-xs)] h-4 flex-1 animate-pulse rounded bg-ods-border" })
977
1000
  ] });
978
1001
  }
979
1002
 
980
1003
  // src/components/navigation/navigation-sidebar-toggle.tsx
981
- import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
1004
+ import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
982
1005
  function NavigationSidebarToggle({ minimized, showLabel, onToggle }) {
983
- return /* @__PURE__ */ jsx11("div", { className: "border-t border-ods-border", children: /* @__PURE__ */ jsxs10(
1006
+ return /* @__PURE__ */ jsx12("div", { className: "border-t border-ods-border", children: /* @__PURE__ */ jsxs10(
984
1007
  "button",
985
1008
  {
986
1009
  onClick: onToggle,
@@ -994,8 +1017,8 @@ function NavigationSidebarToggle({ minimized, showLabel, onToggle }) {
994
1017
  title: minimized ? "Hide Menu" : void 0,
995
1018
  "aria-label": "Hide Menu",
996
1019
  children: [
997
- /* @__PURE__ */ jsx11("div", { className: "flex flex-shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx11(Chevrons03LeftIcon, { className: "h-6 w-6 rotate-180 text-ods-text-secondary transition-transform duration-300 @[140px]/of-nav-sidebar:rotate-0" }) }),
998
- /* @__PURE__ */ jsx11(
1020
+ /* @__PURE__ */ jsx12("div", { className: "flex flex-shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx12(Chevrons03LeftIcon, { className: "h-6 w-6 rotate-180 text-ods-text-secondary transition-transform duration-300 @[140px]/of-nav-sidebar:rotate-0" }) }),
1021
+ /* @__PURE__ */ jsx12(
999
1022
  "span",
1000
1023
  {
1001
1024
  className: cn(
@@ -1012,7 +1035,7 @@ function NavigationSidebarToggle({ minimized, showLabel, onToggle }) {
1012
1035
  }
1013
1036
 
1014
1037
  // src/components/navigation/navigation-sidebar.tsx
1015
- import { Fragment as Fragment6, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
1038
+ import { Fragment as Fragment6, jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1016
1039
  var MINIMIZED_WIDTH = 56;
1017
1040
  var EXPANDED_WIDTH = 224;
1018
1041
  var STORAGE_KEY = "of.navigationSidebar.minimized";
@@ -1120,7 +1143,7 @@ function NavigationSidebar({ config, disabled = false }) {
1120
1143
  return () => cancelAnimationFrame(id);
1121
1144
  }, [transitionsEnabled]);
1122
1145
  return /* @__PURE__ */ jsxs11(Fragment6, { children: [
1123
- /* @__PURE__ */ jsx12(
1146
+ /* @__PURE__ */ jsx13(
1124
1147
  "div",
1125
1148
  {
1126
1149
  className: cn(
@@ -1133,7 +1156,7 @@ function NavigationSidebar({ config, disabled = false }) {
1133
1156
  "aria-hidden": "true"
1134
1157
  }
1135
1158
  ),
1136
- /* @__PURE__ */ jsx12("div", { className: "hidden h-full w-14 flex-shrink-0 md:block lg:hidden", "aria-hidden": "true" }),
1159
+ /* @__PURE__ */ jsx13("div", { className: "hidden h-full w-14 flex-shrink-0 md:block lg:hidden", "aria-hidden": "true" }),
1137
1160
  /* @__PURE__ */ jsxs11(
1138
1161
  "aside",
1139
1162
  {
@@ -1151,11 +1174,11 @@ function NavigationSidebar({ config, disabled = false }) {
1151
1174
  ),
1152
1175
  "aria-label": "Main navigation sidebar",
1153
1176
  children: [
1154
- /* @__PURE__ */ jsx12(NavigationSidebarHeader, { minimized }),
1177
+ /* @__PURE__ */ jsx13(NavigationSidebarHeader, { minimized }),
1155
1178
  /* @__PURE__ */ jsxs11("div", { className: "flex flex-1 flex-col justify-between overflow-y-auto py-4", children: [
1156
1179
  /* @__PURE__ */ jsxs11("div", { className: "flex flex-col", children: [
1157
1180
  config.topSlot?.({ minimized }),
1158
- /* @__PURE__ */ jsx12("nav", { className: "flex flex-col", "aria-label": "Primary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.primary.map((key) => /* @__PURE__ */ jsx12(NavigationSidebarItemSkeleton, { showLabel }, key)) : primaryItems.map((item) => /* @__PURE__ */ jsx12(
1181
+ /* @__PURE__ */ jsx13("nav", { className: "flex flex-col", "aria-label": "Primary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.primary.map((key) => /* @__PURE__ */ jsx13(NavigationSidebarItemSkeleton, { showLabel }, key)) : primaryItems.map((item) => /* @__PURE__ */ jsx13(
1159
1182
  NavigationSidebarItemButton,
1160
1183
  {
1161
1184
  item,
@@ -1168,7 +1191,7 @@ function NavigationSidebar({ config, disabled = false }) {
1168
1191
  item.id
1169
1192
  )) })
1170
1193
  ] }),
1171
- (loadingRows ? loadingRows.secondary.length > 0 : secondaryItems.length > 0) && /* @__PURE__ */ jsx12("nav", { className: "flex flex-col", "aria-label": "Secondary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.secondary.map((key) => /* @__PURE__ */ jsx12(NavigationSidebarItemSkeleton, { showLabel }, key)) : secondaryItems.map((item) => /* @__PURE__ */ jsx12(
1194
+ (loadingRows ? loadingRows.secondary.length > 0 : secondaryItems.length > 0) && /* @__PURE__ */ jsx13("nav", { className: "flex flex-col", "aria-label": "Secondary navigation", "aria-busy": !!loadingRows, children: loadingRows ? loadingRows.secondary.map((key) => /* @__PURE__ */ jsx13(NavigationSidebarItemSkeleton, { showLabel }, key)) : secondaryItems.map((item) => /* @__PURE__ */ jsx13(
1172
1195
  NavigationSidebarItemButton,
1173
1196
  {
1174
1197
  item,
@@ -1181,7 +1204,7 @@ function NavigationSidebar({ config, disabled = false }) {
1181
1204
  item.id
1182
1205
  )) })
1183
1206
  ] }),
1184
- /* @__PURE__ */ jsx12(NavigationSidebarToggle, { minimized, showLabel, onToggle: handleToggle })
1207
+ /* @__PURE__ */ jsx13(NavigationSidebarToggle, { minimized, showLabel, onToggle: handleToggle })
1185
1208
  ]
1186
1209
  }
1187
1210
  )
@@ -1193,7 +1216,7 @@ import React3 from "react";
1193
1216
 
1194
1217
  // src/components/navigation/header-global-search.tsx
1195
1218
  import React2 from "react";
1196
- import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
1219
+ import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1197
1220
  function HeaderGlobalSearch({
1198
1221
  value = "",
1199
1222
  onChange,
@@ -1233,8 +1256,8 @@ function HeaderGlobalSearch({
1233
1256
  className
1234
1257
  ),
1235
1258
  children: [
1236
- /* @__PURE__ */ jsx13(SearchIcon, { className: "h-6 w-6 shrink-0 text-ods-text-secondary" }),
1237
- /* @__PURE__ */ jsx13(
1259
+ /* @__PURE__ */ jsx14(SearchIcon, { className: "h-6 w-6 shrink-0 text-ods-text-secondary" }),
1260
+ /* @__PURE__ */ jsx14(
1238
1261
  "input",
1239
1262
  {
1240
1263
  type: "text",
@@ -1256,7 +1279,7 @@ function HeaderGlobalSearch({
1256
1279
  }
1257
1280
 
1258
1281
  // src/components/navigation/header-mingo-button.tsx
1259
- import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
1282
+ import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1260
1283
  function HeaderMingoButton({ isActive = false, iconOnly = false, className, ...props }) {
1261
1284
  return /* @__PURE__ */ jsxs13(
1262
1285
  "button",
@@ -1284,11 +1307,11 @@ function HeaderMingoButton({ isActive = false, iconOnly = false, className, ...p
1284
1307
  // Mobile, drawer open: the icon-only button doubles as the close
1285
1308
  // affordance, so swap the Mingo logo for an X. Match the other header
1286
1309
  // icons (e.g. notifications): secondary color, w-4 h-4 → md:w-6 h-6.
1287
- /* @__PURE__ */ jsx14(XmarkIcon, { className: "h-6 w-6 shrink-0 text-ods-text-secondary" })
1310
+ /* @__PURE__ */ jsx15(XmarkIcon, { className: "h-6 w-6 shrink-0 text-ods-text-secondary" })
1288
1311
  ) : (
1289
1312
  // Outer frame follows the button's text color (currentColor); the eyes
1290
1313
  // and corner block are ODS cyan.
1291
- /* @__PURE__ */ jsx14(
1314
+ /* @__PURE__ */ jsx15(
1292
1315
  MingoIcon,
1293
1316
  {
1294
1317
  color: "currentColor",
@@ -1298,14 +1321,14 @@ function HeaderMingoButton({ isActive = false, iconOnly = false, className, ...p
1298
1321
  }
1299
1322
  )
1300
1323
  ),
1301
- !iconOnly && /* @__PURE__ */ jsx14("span", { className: "whitespace-nowrap font-bold tracking-[-0.36px] text-h3", children: "Mingo AI" })
1324
+ !iconOnly && /* @__PURE__ */ jsx15("span", { className: "whitespace-nowrap font-bold tracking-[-0.36px] text-h3", children: "Mingo AI" })
1302
1325
  ]
1303
1326
  }
1304
1327
  );
1305
1328
  }
1306
1329
 
1307
1330
  // src/components/navigation/header-organization-filter.tsx
1308
- import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
1331
+ import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
1309
1332
  function HeaderOrganizationFilter({
1310
1333
  organizations = [],
1311
1334
  selectedOrgId,
@@ -1317,7 +1340,7 @@ function HeaderOrganizationFilter({
1317
1340
  const displayName = selectedOrg?.name || "All Organizations";
1318
1341
  const deviceCount = selectedOrg?.deviceCount ?? totalDeviceCount;
1319
1342
  return /* @__PURE__ */ jsxs14(DropdownMenu, { children: [
1320
- /* @__PURE__ */ jsx15(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs14(
1343
+ /* @__PURE__ */ jsx16(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs14(
1321
1344
  "button",
1322
1345
  {
1323
1346
  className: cn(
@@ -1329,9 +1352,9 @@ function HeaderOrganizationFilter({
1329
1352
  className
1330
1353
  ),
1331
1354
  children: [
1332
- /* @__PURE__ */ jsx15(Filter02Icon, { className: "h-4 w-4 shrink-0 text-ods-text-secondary" }),
1355
+ /* @__PURE__ */ jsx16(Filter02Icon, { className: "h-4 w-4 shrink-0 text-ods-text-secondary" }),
1333
1356
  /* @__PURE__ */ jsxs14("div", { className: "flex min-w-0 flex-col items-start justify-center", children: [
1334
- /* @__PURE__ */ jsx15("span", { className: "truncate text-ods-text-primary text-h5", title: displayName, children: displayName }),
1357
+ /* @__PURE__ */ jsx16("span", { className: "truncate text-ods-text-primary text-h5", title: displayName, children: displayName }),
1335
1358
  deviceCount !== void 0 && /* @__PURE__ */ jsxs14("span", { className: "truncate text-ods-text-secondary text-h6", children: [
1336
1359
  deviceCount.toLocaleString(),
1337
1360
  " Devices"
@@ -1341,14 +1364,14 @@ function HeaderOrganizationFilter({
1341
1364
  }
1342
1365
  ) }),
1343
1366
  /* @__PURE__ */ jsxs14(DropdownMenuContent, { align: "end", className: "min-w-[240px]", children: [
1344
- /* @__PURE__ */ jsx15(DropdownMenuItem, { onClick: () => onOrgChange?.(""), children: "All Organizations" }),
1345
- organizations.map((org) => /* @__PURE__ */ jsx15(DropdownMenuItem, { onClick: () => onOrgChange?.(org.id), children: org.name }, org.id))
1367
+ /* @__PURE__ */ jsx16(DropdownMenuItem, { onClick: () => onOrgChange?.(""), children: "All Organizations" }),
1368
+ organizations.map((org) => /* @__PURE__ */ jsx16(DropdownMenuItem, { onClick: () => onOrgChange?.(org.id), children: org.name }, org.id))
1346
1369
  ] })
1347
1370
  ] });
1348
1371
  }
1349
1372
 
1350
1373
  // src/components/navigation/app-header.tsx
1351
- import { Fragment as Fragment7, jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
1374
+ import { Fragment as Fragment7, jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
1352
1375
  var AppHeader = React3.memo(function AppHeaderImpl({
1353
1376
  showSearch,
1354
1377
  onSearch,
@@ -1380,7 +1403,7 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1380
1403
  }) {
1381
1404
  const isMdUp = useMdUp() ?? false;
1382
1405
  if (loading) {
1383
- return /* @__PURE__ */ jsx16(
1406
+ return /* @__PURE__ */ jsx17(
1384
1407
  AppHeaderSkeleton,
1385
1408
  {
1386
1409
  showSearch,
@@ -1403,19 +1426,19 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1403
1426
  }
1404
1427
  const dimmedClass = disabled ? "pointer-events-none opacity-50" : "";
1405
1428
  const cellDivider = "border-l border-ods-border";
1406
- return /* @__PURE__ */ jsx16(
1429
+ return /* @__PURE__ */ jsx17(
1407
1430
  TopNavigation,
1408
1431
  {
1409
1432
  className: cn("sticky top-0 z-40", className),
1410
1433
  centerBreakpoint: "md",
1411
1434
  leading: (
1412
1435
  // Mobile: Burger Menu Button
1413
- !isMdUp && /* @__PURE__ */ jsx16(
1436
+ !isMdUp && /* @__PURE__ */ jsx17(
1414
1437
  HeaderButton,
1415
1438
  {
1416
1439
  onClick: onToggleMobileMenu,
1417
1440
  isActive: isMobileMenuOpen,
1418
- icon: isMobileMenuOpen ? /* @__PURE__ */ jsx16(XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx16(Menu01Icon, { className: "h-6 w-6" }),
1441
+ icon: isMobileMenuOpen ? /* @__PURE__ */ jsx17(XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx17(Menu01Icon, { className: "h-6 w-6" }),
1419
1442
  "aria-label": isMobileMenuOpen ? "Close menu" : "Open menu",
1420
1443
  "aria-expanded": isMobileMenuOpen,
1421
1444
  className: "border-r border-ods-border"
@@ -1423,7 +1446,7 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1423
1446
  )
1424
1447
  ),
1425
1448
  logo: !isMdUp && /* @__PURE__ */ jsxs15(Fragment7, { children: [
1426
- /* @__PURE__ */ jsx16(
1449
+ /* @__PURE__ */ jsx17(
1427
1450
  OpenFrameLogo,
1428
1451
  {
1429
1452
  className: "h-6 w-6 shrink-0",
@@ -1431,21 +1454,21 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1431
1454
  lowerPathColor: "var(--color-accent-primary)"
1432
1455
  }
1433
1456
  ),
1434
- /* @__PURE__ */ jsx16(OpenFrameText, { textColor: "var(--color-text-primary)", className: "h-4" })
1457
+ /* @__PURE__ */ jsx17(OpenFrameText, { textColor: "var(--color-text-primary)", className: "h-4" })
1435
1458
  ] }),
1436
1459
  logoClassName: "gap-2",
1437
- center: showSearch ? /* @__PURE__ */ jsx16(HeaderGlobalSearch, { onSubmit: onSearch, className: cn("w-full", dimmedClass) }) : void 0,
1460
+ center: showSearch ? /* @__PURE__ */ jsx17(HeaderGlobalSearch, { onSubmit: onSearch, className: cn("w-full", dimmedClass) }) : void 0,
1438
1461
  sideActions: /* @__PURE__ */ jsxs15(Fragment7, { children: [
1439
- showSearch && /* @__PURE__ */ jsx16(
1462
+ showSearch && /* @__PURE__ */ jsx17(
1440
1463
  HeaderButton,
1441
1464
  {
1442
- icon: /* @__PURE__ */ jsx16(SearchIcon, { className: "h-6 w-6" }),
1465
+ icon: /* @__PURE__ */ jsx17(SearchIcon, { className: "h-6 w-6" }),
1443
1466
  "aria-label": "Search",
1444
1467
  className: cn("md:hidden", cellDivider, dimmedClass),
1445
1468
  disabled
1446
1469
  }
1447
1470
  ),
1448
- showOrganizations && /* @__PURE__ */ jsx16(
1471
+ showOrganizations && /* @__PURE__ */ jsx17(
1449
1472
  HeaderOrganizationFilter,
1450
1473
  {
1451
1474
  organizations,
@@ -1454,8 +1477,8 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1454
1477
  className: cn("hidden lg:flex", dimmedClass)
1455
1478
  }
1456
1479
  ),
1457
- showTimeTracker && /* @__PURE__ */ jsx16(TimeTrackerHeaderButton, { disabled, className: cn(cellDivider, dimmedClass) }),
1458
- showNotifications && /* @__PURE__ */ jsx16(
1480
+ showTimeTracker && /* @__PURE__ */ jsx17(TimeTrackerHeaderButton, { disabled, className: cn(cellDivider, dimmedClass) }),
1481
+ showNotifications && /* @__PURE__ */ jsx17(
1459
1482
  NotificationsHeaderButton,
1460
1483
  {
1461
1484
  fallbackUnreadCount: unreadCount,
@@ -1463,7 +1486,7 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1463
1486
  dimmedClass: cn(cellDivider, dimmedClass)
1464
1487
  }
1465
1488
  ),
1466
- showTicketAlerts && /* @__PURE__ */ jsx16(
1489
+ showTicketAlerts && /* @__PURE__ */ jsx17(
1467
1490
  TicketAlertsButton,
1468
1491
  {
1469
1492
  href: ticketAlertsHref ?? "/tickets",
@@ -1473,10 +1496,10 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1473
1496
  }
1474
1497
  ),
1475
1498
  isMdUp && showUser && /* @__PURE__ */ jsxs15(DropdownMenu, { children: [
1476
- /* @__PURE__ */ jsx16(DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx16(
1499
+ /* @__PURE__ */ jsx17(DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx17(
1477
1500
  HeaderButton,
1478
1501
  {
1479
- icon: /* @__PURE__ */ jsx16(
1502
+ icon: /* @__PURE__ */ jsx17(
1480
1503
  SquareAvatar,
1481
1504
  {
1482
1505
  src: userAvatarUrl || void 0,
@@ -1502,7 +1525,7 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1502
1525
  className: "z-[104] w-[280px] overflow-hidden rounded-[6px] border-ods-border bg-ods-bg p-0",
1503
1526
  children: [
1504
1527
  /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2 border-b border-ods-border bg-ods-card p-3", children: [
1505
- /* @__PURE__ */ jsx16(
1528
+ /* @__PURE__ */ jsx17(
1506
1529
  SquareAvatar,
1507
1530
  {
1508
1531
  src: userAvatarUrl || void 0,
@@ -1513,29 +1536,29 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1513
1536
  }
1514
1537
  ),
1515
1538
  /* @__PURE__ */ jsxs15("div", { className: "min-w-0 flex-1", children: [
1516
- userName && /* @__PURE__ */ jsx16("div", { className: "truncate text-ods-text-primary text-h4", children: userName }),
1517
- userEmail && /* @__PURE__ */ jsx16("div", { className: "truncate text-ods-text-secondary text-h6", children: userEmail })
1539
+ userName && /* @__PURE__ */ jsx17("div", { className: "truncate text-ods-text-primary text-h4", children: userName }),
1540
+ userEmail && /* @__PURE__ */ jsx17("div", { className: "truncate text-ods-text-secondary text-h6", children: userEmail })
1518
1541
  ] })
1519
1542
  ] }),
1520
- /* @__PURE__ */ jsx16(
1543
+ /* @__PURE__ */ jsx17(
1521
1544
  DropdownMenuItem,
1522
1545
  {
1523
1546
  onClick: onProfile,
1524
1547
  className: "cursor-pointer rounded-none border-b border-ods-border bg-ods-card px-3 py-3 hover:bg-ods-card/80 focus:bg-ods-card/80",
1525
1548
  children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
1526
- /* @__PURE__ */ jsx16(UserIcon, { className: "h-6 w-6 shrink-0 text-ods-text-primary" }),
1527
- /* @__PURE__ */ jsx16("span", { className: "text-ods-text-primary text-h4", children: "Profile Settings" })
1549
+ /* @__PURE__ */ jsx17(UserIcon, { className: "h-6 w-6 shrink-0 text-ods-text-primary" }),
1550
+ /* @__PURE__ */ jsx17("span", { className: "text-ods-text-primary text-h4", children: "Profile Settings" })
1528
1551
  ] })
1529
1552
  }
1530
1553
  ),
1531
- /* @__PURE__ */ jsx16(
1554
+ /* @__PURE__ */ jsx17(
1532
1555
  DropdownMenuItem,
1533
1556
  {
1534
1557
  onClick: onLogout,
1535
1558
  className: "cursor-pointer rounded-none bg-ods-card px-3 py-3 hover:bg-ods-card/80 focus:bg-ods-card/80",
1536
1559
  children: /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
1537
- /* @__PURE__ */ jsx16(LogOutIcon, { className: "shrink-0 text-ods-error", size: 24 }),
1538
- /* @__PURE__ */ jsx16("span", { className: "text-ods-text-primary text-h4", children: "Log Out" })
1560
+ /* @__PURE__ */ jsx17(LogOutIcon, { className: "shrink-0 text-ods-error", size: 24 }),
1561
+ /* @__PURE__ */ jsx17("span", { className: "text-ods-text-primary text-h4", children: "Log Out" })
1539
1562
  ] })
1540
1563
  }
1541
1564
  )
@@ -1543,7 +1566,7 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1543
1566
  }
1544
1567
  )
1545
1568
  ] }),
1546
- showMingoAI && /* @__PURE__ */ jsx16(
1569
+ showMingoAI && /* @__PURE__ */ jsx17(
1547
1570
  HeaderMingoButton,
1548
1571
  {
1549
1572
  onClick: onMingoAI,
@@ -1562,10 +1585,10 @@ function NotificationsHeaderButton({ fallbackUnreadCount, disabled, dimmedClass
1562
1585
  const hasUnread = (ctx?.unreadCount ?? fallbackUnreadCount) > 0;
1563
1586
  const isActive = ctx?.isOpen ?? false;
1564
1587
  const onClick = ctx?.toggle;
1565
- return /* @__PURE__ */ jsx16(
1588
+ return /* @__PURE__ */ jsx17(
1566
1589
  HeaderButton,
1567
1590
  {
1568
- icon: isActive ? /* @__PURE__ */ jsx16(XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx16(BellIcon, { className: "h-6 w-6" }),
1591
+ icon: isActive ? /* @__PURE__ */ jsx17(XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx17(BellIcon, { className: "h-6 w-6" }),
1569
1592
  showUnreadDot: !isActive && hasUnread,
1570
1593
  "aria-label": isActive ? "Close notifications" : "Notifications",
1571
1594
  onClick,
@@ -1581,12 +1604,12 @@ var CELL_VISIBILITY = {
1581
1604
  "icon-lg": "hidden lg:flex"
1582
1605
  };
1583
1606
  function HeaderCellSkeleton({ className }) {
1584
- return /* @__PURE__ */ jsx16("div", { className: cn("flex h-full w-14 shrink-0 items-center justify-center border-l border-ods-border", className), children: /* @__PURE__ */ jsx16("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) });
1607
+ return /* @__PURE__ */ jsx17("div", { className: cn("flex h-full w-14 shrink-0 items-center justify-center border-l border-ods-border", className), children: /* @__PURE__ */ jsx17("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) });
1585
1608
  }
1586
1609
  function HeaderWideCellSkeleton() {
1587
1610
  return /* @__PURE__ */ jsxs15("div", { className: "flex h-full w-14 shrink-0 items-center justify-center gap-2 border-l border-ods-border md:w-[140px] md:px-4", children: [
1588
- /* @__PURE__ */ jsx16("div", { className: "h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" }),
1589
- /* @__PURE__ */ jsx16("div", { className: "hidden h-5 animate-pulse rounded bg-ods-border md:block md:w-[72px]" })
1611
+ /* @__PURE__ */ jsx17("div", { className: "h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" }),
1612
+ /* @__PURE__ */ jsx17("div", { className: "hidden h-5 animate-pulse rounded bg-ods-border md:block md:w-[72px]" })
1590
1613
  ] });
1591
1614
  }
1592
1615
  function AppHeaderSkeleton({
@@ -1595,7 +1618,7 @@ function AppHeaderSkeleton({
1595
1618
  className
1596
1619
  }) {
1597
1620
  const cells = typeof actionCells === "number" ? Array.from({ length: Math.max(0, actionCells) }, () => "icon") : actionCells;
1598
- return /* @__PURE__ */ jsx16(
1621
+ return /* @__PURE__ */ jsx17(
1599
1622
  TopNavigation,
1600
1623
  {
1601
1624
  className: cn("sticky top-0 z-40", className),
@@ -1603,18 +1626,18 @@ function AppHeaderSkeleton({
1603
1626
  "aria-busy": "true",
1604
1627
  leading: (
1605
1628
  // Burger cell: mobile only, in CSS.
1606
- /* @__PURE__ */ jsx16("div", { className: "flex h-full w-14 shrink-0 items-center justify-center border-r border-ods-border md:hidden", children: /* @__PURE__ */ jsx16("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) })
1629
+ /* @__PURE__ */ jsx17("div", { className: "flex h-full w-14 shrink-0 items-center justify-center border-r border-ods-border md:hidden", children: /* @__PURE__ */ jsx17("div", { className: "h-6 w-6 animate-pulse rounded bg-ods-border" }) })
1607
1630
  ),
1608
1631
  logo: /* @__PURE__ */ jsxs15(Fragment7, { children: [
1609
- /* @__PURE__ */ jsx16("div", { className: "h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" }),
1610
- /* @__PURE__ */ jsx16("div", { className: "h-4 w-24 animate-pulse rounded bg-ods-border" })
1632
+ /* @__PURE__ */ jsx17("div", { className: "h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" }),
1633
+ /* @__PURE__ */ jsx17("div", { className: "h-4 w-24 animate-pulse rounded bg-ods-border" })
1611
1634
  ] }),
1612
1635
  logoClassName: "gap-2 md:hidden",
1613
- center: showSearch ? /* @__PURE__ */ jsx16("div", { className: "h-10 w-full animate-pulse rounded-md bg-ods-border" }) : void 0,
1636
+ center: showSearch ? /* @__PURE__ */ jsx17("div", { className: "h-10 w-full animate-pulse rounded-md bg-ods-border" }) : void 0,
1614
1637
  sideActions: /* @__PURE__ */ jsxs15(Fragment7, { children: [
1615
- showSearch && /* @__PURE__ */ jsx16(HeaderCellSkeleton, { className: "md:hidden" }),
1638
+ showSearch && /* @__PURE__ */ jsx17(HeaderCellSkeleton, { className: "md:hidden" }),
1616
1639
  cells.map(
1617
- (cell, i) => cell === "wide" ? /* @__PURE__ */ jsx16(HeaderWideCellSkeleton, {}, i) : /* @__PURE__ */ jsx16(HeaderCellSkeleton, { className: CELL_VISIBILITY[cell] }, i)
1640
+ (cell, i) => cell === "wide" ? /* @__PURE__ */ jsx17(HeaderWideCellSkeleton, {}, i) : /* @__PURE__ */ jsx17(HeaderCellSkeleton, { className: CELL_VISIBILITY[cell] }, i)
1618
1641
  )
1619
1642
  ] })
1620
1643
  }
@@ -1627,7 +1650,7 @@ import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMem
1627
1650
  // src/components/navigation/mobile-burger-menu.tsx
1628
1651
  import { usePreventScroll as usePreventScroll3 } from "@react-aria/overlays";
1629
1652
  import React4, { useCallback as useCallback2, useRef as useRef4 } from "react";
1630
- import { Fragment as Fragment8, jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
1653
+ import { Fragment as Fragment8, jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
1631
1654
  var HEADER_HEIGHT = 56;
1632
1655
  var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1633
1656
  isOpen,
@@ -1675,29 +1698,33 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1675
1698
  disabled && "cursor-not-allowed opacity-50"
1676
1699
  ),
1677
1700
  "aria-current": isActive ? "page" : void 0,
1701
+ "aria-label": item.badge ? `${item.label} (${item.badge})` : void 0,
1678
1702
  children: [
1679
- item.icon && /* @__PURE__ */ jsx17("div", { className: "flex size-4 flex-shrink-0 items-center justify-center", children: React4.cloneElement(item.icon, {
1703
+ item.icon && /* @__PURE__ */ jsx18("div", { className: "flex size-4 flex-shrink-0 items-center justify-center", children: React4.cloneElement(item.icon, {
1680
1704
  size: 16,
1681
1705
  color: isActive && !disabled ? "var(--color-accent-primary)" : "var(--color-text-secondary)"
1682
1706
  }) }),
1683
- /* @__PURE__ */ jsx17(
1684
- "span",
1685
- {
1686
- className: cn(
1687
- "flex-1 truncate text-left text-h6",
1688
- isActive && !disabled ? "text-ods-accent" : "text-ods-text-primary"
1689
- ),
1690
- children: item.label
1691
- }
1692
- )
1707
+ /* @__PURE__ */ jsxs16("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xxs)]", children: [
1708
+ /* @__PURE__ */ jsx18(
1709
+ "span",
1710
+ {
1711
+ className: cn(
1712
+ "min-w-0 truncate text-left text-h6",
1713
+ isActive && !disabled ? "text-ods-accent" : "text-ods-text-primary"
1714
+ ),
1715
+ children: item.label
1716
+ }
1717
+ ),
1718
+ item.badge && /* @__PURE__ */ jsx18(NavigationItemBadge, { compact: true, label: item.badge })
1719
+ ] })
1693
1720
  ]
1694
1721
  },
1695
1722
  item.id
1696
1723
  );
1697
1724
  };
1698
- const renderNavigationGrid = (items) => /* @__PURE__ */ jsx17("div", { className: "grid grid-cols-2 gap-3", children: items.map((item) => /* @__PURE__ */ jsx17(React4.Fragment, { children: renderNavigationItem(item, true) }, item.id)) });
1725
+ const renderNavigationGrid = (items) => /* @__PURE__ */ jsx18("div", { className: "grid grid-cols-2 gap-3", children: items.map((item) => /* @__PURE__ */ jsx18(React4.Fragment, { children: renderNavigationItem(item, true) }, item.id)) });
1699
1726
  return /* @__PURE__ */ jsxs16(Fragment8, { children: [
1700
- /* @__PURE__ */ jsx17(
1727
+ /* @__PURE__ */ jsx18(
1701
1728
  "div",
1702
1729
  {
1703
1730
  className: cn(
@@ -1711,7 +1738,7 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1711
1738
  "aria-hidden": "true"
1712
1739
  }
1713
1740
  ),
1714
- /* @__PURE__ */ jsx17(
1741
+ /* @__PURE__ */ jsx18(
1715
1742
  "div",
1716
1743
  {
1717
1744
  ref: panelRef,
@@ -1742,7 +1769,7 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1742
1769
  ),
1743
1770
  "aria-disabled": disabled || void 0,
1744
1771
  children: [
1745
- /* @__PURE__ */ jsx17(
1772
+ /* @__PURE__ */ jsx18(
1746
1773
  SquareAvatar,
1747
1774
  {
1748
1775
  src: user.userAvatarUrl || void 0,
@@ -1755,21 +1782,21 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1755
1782
  ),
1756
1783
  /* @__PURE__ */ jsxs16("div", { className: "flex min-w-0 flex-1 flex-col", children: [
1757
1784
  /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2", children: [
1758
- /* @__PURE__ */ jsx17("span", { className: "truncate text-ods-text-primary text-h6", children: user.userName || "User" }),
1759
- user.userRole && /* @__PURE__ */ jsx17("span", { className: "shrink-0 rounded-md border border-ods-border bg-ods-card px-2 py-0.5 uppercase text-ods-text-primary text-h6", children: user.userRole })
1785
+ /* @__PURE__ */ jsx18("span", { className: "truncate text-ods-text-primary text-h6", children: user.userName || "User" }),
1786
+ user.userRole && /* @__PURE__ */ jsx18("span", { className: "shrink-0 rounded-md border border-ods-border bg-ods-card px-2 py-0.5 uppercase text-ods-text-primary text-h6", children: user.userRole })
1760
1787
  ] }),
1761
- user.userEmail && /* @__PURE__ */ jsx17("span", { className: "truncate text-ods-text-secondary text-h6", children: user.userEmail })
1788
+ user.userEmail && /* @__PURE__ */ jsx18("span", { className: "truncate text-ods-text-secondary text-h6", children: user.userEmail })
1762
1789
  ] }),
1763
1790
  /* @__PURE__ */ jsxs16("div", { className: "flex shrink-0 items-center gap-2", children: [
1764
- onSearchUser && /* @__PURE__ */ jsx17(Button, { size: "icon", onClick: onSearchUser, variant: "outline", "aria-label": "Search users", children: /* @__PURE__ */ jsx17(UserSearchIcon, { className: "size-4 text-ods-text-primary" }) }),
1765
- onEditProfile && /* @__PURE__ */ jsx17(Button, { size: "icon", onClick: onEditProfile, variant: "outline", "aria-label": "Edit profile", children: /* @__PURE__ */ jsx17(PenEditIcon, { className: "size-4 text-ods-text-primary" }) })
1791
+ onSearchUser && /* @__PURE__ */ jsx18(Button, { size: "icon", onClick: onSearchUser, variant: "outline", "aria-label": "Search users", children: /* @__PURE__ */ jsx18(UserSearchIcon, { className: "size-4 text-ods-text-primary" }) }),
1792
+ onEditProfile && /* @__PURE__ */ jsx18(Button, { size: "icon", onClick: onEditProfile, variant: "outline", "aria-label": "Edit profile", children: /* @__PURE__ */ jsx18(PenEditIcon, { className: "size-4 text-ods-text-primary" }) })
1766
1793
  ] })
1767
1794
  ]
1768
1795
  }
1769
1796
  ),
1770
1797
  config.topSlot?.({ minimized: false }),
1771
- /* @__PURE__ */ jsx17("nav", { "aria-label": "Primary navigation", children: renderNavigationGrid(primaryItems) }),
1772
- secondaryItems.length > 0 && /* @__PURE__ */ jsx17("nav", { "aria-label": "Secondary navigation", className: "flex flex-col gap-3", children: secondaryItems.map((item) => /* @__PURE__ */ jsx17(React4.Fragment, { children: renderNavigationItem(item, false) }, item.id)) }),
1798
+ /* @__PURE__ */ jsx18("nav", { "aria-label": "Primary navigation", children: renderNavigationGrid(primaryItems) }),
1799
+ secondaryItems.length > 0 && /* @__PURE__ */ jsx18("nav", { "aria-label": "Secondary navigation", className: "flex flex-col gap-3", children: secondaryItems.map((item) => /* @__PURE__ */ jsx18(React4.Fragment, { children: renderNavigationItem(item, false) }, item.id)) }),
1773
1800
  onLogout && /* @__PURE__ */ jsxs16(
1774
1801
  "button",
1775
1802
  {
@@ -1781,8 +1808,8 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1781
1808
  disabled && "cursor-not-allowed opacity-50"
1782
1809
  ),
1783
1810
  children: [
1784
- /* @__PURE__ */ jsx17(Logout02Icon, { className: "size-4 text-ods-error" }),
1785
- /* @__PURE__ */ jsx17("span", { className: "flex-1 text-left text-ods-text-primary text-h6", children: "Log Out" })
1811
+ /* @__PURE__ */ jsx18(Logout02Icon, { className: "size-4 text-ods-error" }),
1812
+ /* @__PURE__ */ jsx18("span", { className: "flex-1 text-left text-ods-text-primary text-h6", children: "Log Out" })
1786
1813
  ]
1787
1814
  }
1788
1815
  )
@@ -1793,7 +1820,7 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1793
1820
  });
1794
1821
 
1795
1822
  // src/components/navigation/app-layout.tsx
1796
- import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
1823
+ import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
1797
1824
  function AppLayout({
1798
1825
  children,
1799
1826
  sidebarConfig,
@@ -1837,11 +1864,11 @@ function AppLayout({
1837
1864
  }),
1838
1865
  []
1839
1866
  );
1840
- return /* @__PURE__ */ jsx18(AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ jsx18(AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ jsxs17("div", { className: cn("flex h-screen flex-col bg-ods-bg", className), children: [
1867
+ return /* @__PURE__ */ jsx19(AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ jsx19(AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ jsxs17("div", { className: cn("flex h-screen flex-col bg-ods-bg", className), children: [
1841
1868
  topBar,
1842
1869
  /* @__PURE__ */ jsxs17("div", { className: "relative flex min-h-0 flex-1", children: [
1843
- /* @__PURE__ */ jsx18(NavigationSidebar, { config: sidebarConfig, disabled }),
1844
- /* @__PURE__ */ jsx18(
1870
+ /* @__PURE__ */ jsx19(NavigationSidebar, { config: sidebarConfig, disabled }),
1871
+ /* @__PURE__ */ jsx19(
1845
1872
  MobileBurgerMenu,
1846
1873
  {
1847
1874
  ...mobileBurgerMenuProps,
@@ -1852,7 +1879,7 @@ function AppLayout({
1852
1879
  }
1853
1880
  ),
1854
1881
  /* @__PURE__ */ jsxs17("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
1855
- /* @__PURE__ */ jsx18(
1882
+ /* @__PURE__ */ jsx19(
1856
1883
  AppHeader,
1857
1884
  {
1858
1885
  ...headerProps,
@@ -1861,9 +1888,9 @@ function AppLayout({
1861
1888
  disabled
1862
1889
  }
1863
1890
  ),
1864
- /* @__PURE__ */ jsx18(NotificationDrawer, {}),
1891
+ /* @__PURE__ */ jsx19(NotificationDrawer, {}),
1865
1892
  /* @__PURE__ */ jsxs17("div", { ref: setDrawerContainer, className: "relative flex flex-1 flex-col overflow-hidden", children: [
1866
- /* @__PURE__ */ jsx18("main", { className: cn("flex-1 overflow-y-auto", mainClassName), children }),
1893
+ /* @__PURE__ */ jsx19("main", { className: cn("flex-1 overflow-y-auto", mainClassName), children }),
1867
1894
  drawer
1868
1895
  ] })
1869
1896
  ] })
@@ -1881,6 +1908,7 @@ export {
1881
1908
  HeaderSkeleton,
1882
1909
  ClientOnlyHeader,
1883
1910
  SlidingSidebar,
1911
+ NavigationItemBadge,
1884
1912
  NAVIGATION_SIDEBAR_WIDTH_VAR,
1885
1913
  NavigationSidebar,
1886
1914
  HeaderGlobalSearch,
@@ -1890,4 +1918,4 @@ export {
1890
1918
  MobileBurgerMenu,
1891
1919
  AppLayout
1892
1920
  };
1893
- //# sourceMappingURL=chunk-Q4XWYP5U.js.map
1921
+ //# sourceMappingURL=chunk-JVAG5CHS.js.map