@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/CHANGELOG.md +43 -0
- package/dist/index.d.mts +75 -37
- package/dist/index.d.ts +75 -37
- package/dist/index.js +37 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +37 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
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
|
|
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:
|
|
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 =
|
|
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 =
|
|
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
|