@dloizides/ui-nav 1.17.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -122,10 +122,31 @@ function isFilterActive(query) {
122
122
  }
123
123
 
124
124
  // src/isRouteActive.ts
125
- function isRouteActive(pathname, route) {
125
+ function isRouteActive(pathname, route, exact = false) {
126
+ if (exact) return pathname === route;
126
127
  if (route === "/") return pathname === "/";
127
128
  return pathname === route || pathname.startsWith(`${route}/`);
128
129
  }
130
+ function leafRoutes(items) {
131
+ return items.flatMap((item) => {
132
+ const children = item.children ?? [];
133
+ const isGroup = children.length > 0;
134
+ return isGroup ? leafRoutes(children) : [{ route: item.route, exact: item.exact === true }];
135
+ });
136
+ }
137
+ function resolveActiveRoute(items, pathname) {
138
+ let winner;
139
+ let winnerLength = -1;
140
+ for (const leaf of leafRoutes(items)) {
141
+ const matches = isRouteActive(pathname, leaf.route, leaf.exact);
142
+ const isLonger = leaf.route.length > winnerLength;
143
+ if (matches && isLonger) {
144
+ winner = leaf.route;
145
+ winnerLength = leaf.route.length;
146
+ }
147
+ }
148
+ return winner;
149
+ }
129
150
  var ACTIVE_BORDER_RADIUS = 4;
130
151
  var ACTIVE_ACCENT_WIDTH = 3;
131
152
  var NAV_ROW_RADIUS = 8;
@@ -503,6 +524,7 @@ var NavExpandableItem = ({
503
524
  expandHint,
504
525
  collapseHint,
505
526
  renderChevron,
527
+ activeRoute,
506
528
  depth = 0
507
529
  }) => {
508
530
  const [expanded, setExpanded] = useState(() => hasActiveDescendant(item, pathname));
@@ -516,7 +538,7 @@ var NavExpandableItem = ({
516
538
  const onHoverOut = useCallback(() => setHovered(false), []);
517
539
  const indent = depth * BASE_INDENT;
518
540
  const hasChildren = Array.isArray(item.children) && item.children.length > 0;
519
- const isActive = isRouteActive(pathname, item.route);
541
+ const isActive = activeRoute !== void 0 ? item.route === activeRoute : isRouteActive(pathname, item.route, item.exact === true);
520
542
  const isSectionHeader = hasChildren && depth === 0;
521
543
  const activeAccentStyle = useMemo(
522
544
  () => ({ borderLeftWidth: ACTIVE_ACCENT_WIDTH, borderLeftColor: primaryColor }),
@@ -604,6 +626,7 @@ var NavExpandableItem = ({
604
626
  /* @__PURE__ */ jsx(Collapse, { open: expanded, children: /* @__PURE__ */ jsx(View, { style: expandableStyles.childrenContainer, children: item.children?.map((child) => /* @__PURE__ */ jsx(
605
627
  NavExpandableItem,
606
628
  {
629
+ activeRoute,
607
630
  collapseHint,
608
631
  depth: depth + 1,
609
632
  expandHint,
@@ -754,6 +777,7 @@ var Sidebar = ({
754
777
  const showPaletteTrigger = paletteTrigger !== void 0 && !isInlineAffordance;
755
778
  const visibleItems = showInlineSearch ? filterNavItems(items, query) : items;
756
779
  const showEmpty = showInlineSearch && isFilterActive(query) && visibleItems.length === 0;
780
+ const activeRoute = resolveActiveRoute(items, pathname);
757
781
  return /* @__PURE__ */ jsxs(
758
782
  View,
759
783
  {
@@ -791,6 +815,7 @@ var Sidebar = ({
791
815
  showEmpty && search !== void 0 ? /* @__PURE__ */ jsx(Text, { style: [navStyles.sidebarEmpty, { color: colors.textSecondary }], testID: "sidebar-search-empty", children: search.emptyText }) : visibleItems.map((item) => /* @__PURE__ */ jsx(
792
816
  NavExpandableItem,
793
817
  {
818
+ activeRoute,
794
819
  collapseHint,
795
820
  expandHint,
796
821
  item,
@@ -1043,6 +1068,7 @@ var NavBarLink = ({
1043
1068
  };
1044
1069
  var TEXT_ON_PRIMARY3 = "#ffffff";
1045
1070
  var NO_ACTIVE_ROUTE = "";
1071
+ var OVERFLOW_MENU_MIN_WIDTH = 200;
1046
1072
  var NavOverflowMenu = ({
1047
1073
  items,
1048
1074
  pathname,
@@ -1055,7 +1081,7 @@ var NavOverflowMenu = ({
1055
1081
  }) => {
1056
1082
  const options = useMemo(() => items.map((item) => ({ label: item.label, value: item.route })), [items]);
1057
1083
  const activeRoute = useMemo(
1058
- () => items.find((item) => isRouteActive(pathname, item.route))?.route ?? NO_ACTIVE_ROUTE,
1084
+ () => resolveActiveRoute(items, pathname) ?? NO_ACTIVE_ROUTE,
1059
1085
  [items, pathname]
1060
1086
  );
1061
1087
  const optionTestID = useMemo(() => {
@@ -1070,6 +1096,7 @@ var NavOverflowMenu = ({
1070
1096
  {
1071
1097
  accessibilityHint: hint,
1072
1098
  accessibilityLabel: label,
1099
+ menuMinWidth: OVERFLOW_MENU_MIN_WIDTH,
1073
1100
  optionTestID,
1074
1101
  options,
1075
1102
  testID,
@@ -1188,6 +1215,7 @@ var NavBarInner = ({
1188
1215
  },
1189
1216
  [onNavigate]
1190
1217
  );
1218
+ const activeRoute = resolveActiveRoute(items, pathname);
1191
1219
  const linkColors = useMemo(
1192
1220
  () => ({
1193
1221
  rest: colors.textSecondary,
@@ -1235,7 +1263,7 @@ var NavBarInner = ({
1235
1263
  collapsed,
1236
1264
  colors: linkColors,
1237
1265
  iconSize: NAV_ICON_SIZE,
1238
- isActive: isRouteActive(pathname, item.route),
1266
+ isActive: item.route === activeRoute,
1239
1267
  item,
1240
1268
  navigateHint,
1241
1269
  reducedMotion,
@@ -1597,6 +1625,7 @@ var CollapsedRail = ({
1597
1625
  const { theme } = useUi();
1598
1626
  const colors = theme.colors;
1599
1627
  const primaryColor = theme.palette.primary["500"];
1628
+ const activeRoute = resolveActiveRoute(items, pathname);
1600
1629
  return /* @__PURE__ */ jsxs(
1601
1630
  View,
1602
1631
  {
@@ -1611,7 +1640,7 @@ var CollapsedRail = ({
1611
1640
  children: [
1612
1641
  header !== void 0 ? /* @__PURE__ */ jsx(View, { style: collapsedRailStyles.slot, children: renderTextSlot(header, { color: colors.text }) }) : null,
1613
1642
  items.map((item) => {
1614
- const active = isRouteActive(pathname, item.route);
1643
+ const active = item.route === activeRoute;
1615
1644
  const iconColor = active ? primaryColor : colors.textSecondary;
1616
1645
  return /* @__PURE__ */ jsx(
1617
1646
  FocusableTouchable,
@@ -1739,6 +1768,7 @@ var PillNav = ({
1739
1768
  const colors = theme.colors;
1740
1769
  const primaryColor = theme.palette.primary["500"];
1741
1770
  if (items.length < minItems) return null;
1771
+ const activeRoute = resolveActiveRoute(items, pathname);
1742
1772
  return /* @__PURE__ */ jsx(
1743
1773
  View,
1744
1774
  {
@@ -1747,7 +1777,7 @@ var PillNav = ({
1747
1777
  role: "navigation",
1748
1778
  style: [pillNavStyles.container, containerStyle],
1749
1779
  children: items.map((item) => {
1750
- const active = isRouteActive(pathname, item.route);
1780
+ const active = item.route === activeRoute;
1751
1781
  const textColor = active ? TEXT_ON_PRIMARY4 : colors.textSecondary;
1752
1782
  const pillStyle = active ? { backgroundColor: primaryColor } : { backgroundColor: colors.surfaceElevated };
1753
1783
  return /* @__PURE__ */ jsxs(
@@ -2005,6 +2035,6 @@ function accessibleNavItems(user, table, translate) {
2005
2035
  return roleRoutesToNavItems(resolveAccessibleRoutes(user, table), translate);
2006
2036
  }
2007
2037
 
2008
- export { ACTIVE_BORDER_RADIUS, ACTIVE_TINT_OPACITY, APP_SHELL_SUFFIX, AppShell, BASE_INDENT, CHEVRON_ICON_SIZE, CollapsedRail, CommandPalette, CommandPaletteTrigger, DEFAULT_COLLAPSED_RAIL_MAX, DEFAULT_SEARCH_BREAKPOINT, DarkModeControl, HOVER_TINT_OPACITY, NAV_ICON_SIZE, NAV_LINK_GAP, NAV_ROW_RADIUS, NAV_TEST_IDS, Nav, NavBar, NavExpandableItem, NavOverflowMenu, NavShell, PillNav, RAIL_FULL_BREAKPOINT, Sidebar, SidebarChevron, SidebarSearch, Topbar, accessibleNavItems, collapsedRailStyles, darkModeStyles, expandableStyles, filterCommands, filterNavItems, isFilterActive, isRouteActive, navStyles, pillNavStyles, resolveContentMaxWidth, resolveRailMode, resolveSearchAffordance, roleRoutesToNavItems, searchTokens, useCommandPaletteHotkey, useContentMaxWidth };
2038
+ export { ACTIVE_BORDER_RADIUS, ACTIVE_TINT_OPACITY, APP_SHELL_SUFFIX, AppShell, BASE_INDENT, CHEVRON_ICON_SIZE, CollapsedRail, CommandPalette, CommandPaletteTrigger, DEFAULT_COLLAPSED_RAIL_MAX, DEFAULT_SEARCH_BREAKPOINT, DarkModeControl, HOVER_TINT_OPACITY, NAV_ICON_SIZE, NAV_LINK_GAP, NAV_ROW_RADIUS, NAV_TEST_IDS, Nav, NavBar, NavExpandableItem, NavOverflowMenu, NavShell, PillNav, RAIL_FULL_BREAKPOINT, Sidebar, SidebarChevron, SidebarSearch, Topbar, accessibleNavItems, collapsedRailStyles, darkModeStyles, expandableStyles, filterCommands, filterNavItems, isFilterActive, isRouteActive, navStyles, pillNavStyles, resolveActiveRoute, resolveContentMaxWidth, resolveRailMode, resolveSearchAffordance, roleRoutesToNavItems, searchTokens, useCommandPaletteHotkey, useContentMaxWidth };
2009
2039
  //# sourceMappingURL=index.mjs.map
2010
2040
  //# sourceMappingURL=index.mjs.map