boreal-ui 0.0.68 → 0.0.70

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.
@@ -109,7 +109,7 @@ const SidebarBase = ({
109
109
  id: buttonId,
110
110
  className: classNames.combineClassNames(
111
111
  classMap.link,
112
- (isOpen || containsActiveChild) && classMap.active
112
+ (isActive || isOpen || containsActiveChild) && classMap.active
113
113
  ),
114
114
  onClick: () => toggleItem(label),
115
115
  "aria-expanded": isOpen,
@@ -256,28 +256,49 @@ const classes = {
256
256
  };
257
257
  const normalizePath = (p) => p.endsWith("/") && p.length > 1 ? p.slice(0, -1) : p;
258
258
  const getInitialPath = () => typeof window !== "undefined" ? window.location.pathname || "/" : "/";
259
+ const isDescendantPath = (parentPath, currentPath) => {
260
+ const parent = normalizePath(parentPath);
261
+ const current = normalizePath(currentPath);
262
+ if (parent === "/") return current === "/";
263
+ return current === parent || current.startsWith(`${parent}/`);
264
+ };
259
265
  const isActiveRecursive = (link, matcher) => {
260
266
  var _a;
261
267
  if (matcher(link)) return true;
262
268
  return !!((_a = link.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, matcher)));
263
269
  };
264
- const Sidebar = (props) => {
270
+ const Sidebar = ({
271
+ isLinkActive: consumerIsLinkActive,
272
+ hasActiveChild: consumerHasActiveChild,
273
+ ...props
274
+ }) => {
265
275
  const [pathname] = React.useState(getInitialPath);
266
- const isLinkActive = (link) => !!link.href && normalizePath(link.href) === normalizePath(pathname);
267
- const hasActiveChild = (link) => {
276
+ const defaultIsLinkActive = (link) => {
277
+ var _a;
278
+ if (!link.href) return false;
279
+ if ((_a = link.children) == null ? void 0 : _a.length) {
280
+ return isDescendantPath(link.href, pathname);
281
+ }
282
+ return normalizePath(link.href) === normalizePath(pathname);
283
+ };
284
+ const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;
285
+ const defaultHasActiveChild = (link) => {
268
286
  var _a;
269
- return !!((_a = link.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, isLinkActive)));
287
+ return !!((_a = link.children) == null ? void 0 : _a.some(
288
+ (child) => isActiveRecursive(child, resolvedIsLinkActive)
289
+ ));
270
290
  };
291
+ const resolvedHasActiveChild = consumerHasActiveChild ?? defaultHasActiveChild;
271
292
  return /* @__PURE__ */ jsxRuntime.jsx(
272
293
  SidebarBase,
273
294
  {
274
295
  ...props,
275
296
  classMap: classes,
276
- isLinkActive,
277
- hasActiveChild
297
+ isLinkActive: resolvedIsLinkActive,
298
+ hasActiveChild: resolvedHasActiveChild
278
299
  }
279
300
  );
280
301
  };
281
302
  Sidebar.displayName = "Sidebar";
282
303
  exports.Sidebar = Sidebar;
283
- //# sourceMappingURL=Sidebar-DMR5T81x.cjs.map
304
+ //# sourceMappingURL=Sidebar-BMvvoT9j.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar-BMvvoT9j.cjs","sources":["../../src/components/Sidebar/SidebarBase.tsx","../../src/components/Sidebar/core/Sidebar.tsx"],"sourcesContent":["import React, { useState, useMemo, useRef, useEffect } from \"react\";\r\nimport { combineClassNames } from \"@/utils/classNames\";\r\nimport {\r\n getDefaultRounding,\r\n getDefaultShadow,\r\n getDefaultTheme,\r\n} from \"@/config/boreal-style-config\";\r\nimport { capitalize } from \"@/utils/capitalize\";\r\nimport { ChevronDownIcon } from \"@/Icons\";\r\nimport { BaseSidebarProps, SidebarLink } from \"./Sidebar.types\";\r\n\r\nconst SidebarBase: React.FC<BaseSidebarProps> = ({\r\n links,\r\n classMap,\r\n LinkComponent = \"a\",\r\n isLinkActive,\r\n hasActiveChild,\r\n theme = getDefaultTheme(),\r\n rounding = getDefaultRounding(),\r\n shadow = getDefaultShadow(),\r\n state = \"\",\r\n showFooter = false,\r\n footerLinks,\r\n footerVersion,\r\n outline = false,\r\n className = \"\",\r\n \"data-testid\": testId = \"sidebar\",\r\n ariaLabel = \"Sidebar navigation\",\r\n ...rest\r\n}) => {\r\n const [openItems, setOpenItems] = useState<Record<string, boolean>>({});\r\n\r\n const idsRef = useRef<Record<string, string>>({});\r\n const seqRef = useRef(0);\r\n\r\n const idFor = (label: string) => {\r\n if (!idsRef.current[label]) {\r\n const slug = label\r\n .toLowerCase()\r\n .replace(/\\s+/g, \"-\")\r\n .replace(/[^a-z0-9_-]/g, \"\");\r\n idsRef.current[label] = `${testId}-section-${slug}-${seqRef.current++}`;\r\n }\r\n return idsRef.current[label];\r\n };\r\n\r\n useEffect(() => {\r\n const next: Record<string, boolean> = {};\r\n\r\n const walk = (nodes: SidebarLink[]): boolean => {\r\n for (const node of nodes) {\r\n if (node.children?.length) {\r\n const childIsActive =\r\n hasActiveChild?.(node) ??\r\n node.children.some(\r\n (child) =>\r\n (isLinkActive?.(child) ?? false) ||\r\n (!!child.children?.length && walk(child.children)),\r\n );\r\n\r\n if (childIsActive) {\r\n next[node.label] = true;\r\n }\r\n }\r\n }\r\n\r\n return nodes.some(\r\n (node) =>\r\n (isLinkActive?.(node) ?? false) ||\r\n (!!node.children?.length && walk(node.children)),\r\n );\r\n };\r\n\r\n walk(links);\r\n setOpenItems((prev) => ({ ...prev, ...next }));\r\n }, [links, isLinkActive, hasActiveChild]);\r\n\r\n const toggleItem = (key: string) =>\r\n setOpenItems((prev) => ({ ...prev, [key]: !prev[key] }));\r\n\r\n const containerClasses = useMemo(\r\n () =>\r\n combineClassNames(\r\n classMap.wrapper,\r\n className,\r\n classMap[theme],\r\n classMap[state],\r\n shadow && classMap[`shadow${capitalize(shadow)}`],\r\n rounding && classMap[`round${capitalize(rounding)}`],\r\n outline && classMap.outline,\r\n ),\r\n [classMap, className, theme, state, outline, rounding, shadow],\r\n );\r\n\r\n const renderLinks = (items: SidebarLink[], isChild = false) => (\r\n <ul\r\n className={combineClassNames(\r\n classMap.list,\r\n isChild && classMap.childList,\r\n )}\r\n data-testid={`${testId}-list`}\r\n >\r\n {items.map(({ label, href, children, icon }, idx) => {\r\n const key = `${label}-${idx}`;\r\n const link: SidebarLink = { label, href, children, icon };\r\n\r\n const isActive = isLinkActive?.(link) ?? false;\r\n const containsActiveChild =\r\n hasActiveChild?.(link) ??\r\n !!children?.some(\r\n (child) =>\r\n (isLinkActive?.(child) ?? false) ||\r\n (child.children?.length && (hasActiveChild?.(child) ?? false)),\r\n );\r\n\r\n const isOpen = !!openItems[label];\r\n const sectionId = idFor(label);\r\n const buttonId = `${sectionId}-button`;\r\n const panelId = `${sectionId}-panel`;\r\n\r\n return (\r\n <li\r\n key={key}\r\n className={classMap.item}\r\n data-testid={`${testId}-listItem`}\r\n >\r\n {children && children.length > 0 ? (\r\n <>\r\n <button\r\n type=\"button\"\r\n id={buttonId}\r\n className={combineClassNames(\r\n classMap.link,\r\n (isActive || isOpen || containsActiveChild) &&\r\n classMap.active,\r\n )}\r\n onClick={() => toggleItem(label)}\r\n aria-expanded={isOpen}\r\n aria-controls={panelId}\r\n data-testid={`${testId}-expandItemButton`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n <span data-testid={`${testId}-expandItemLabel`}>{label}</span>\r\n <ChevronDownIcon\r\n className={combineClassNames(\r\n classMap.chevron,\r\n isOpen && classMap.chevronOpen,\r\n )}\r\n aria-hidden=\"true\"\r\n focusable={false}\r\n data-testid={`${testId}-expandIcon`}\r\n />\r\n </button>\r\n\r\n <div\r\n id={panelId}\r\n className={combineClassNames(\r\n classMap.submenu,\r\n isOpen && classMap.submenuOpen,\r\n )}\r\n role=\"group\"\r\n aria-labelledby={buttonId}\r\n hidden={!isOpen}\r\n data-testid={`${testId}-subMenu`}\r\n >\r\n {renderLinks(children, true)}\r\n </div>\r\n </>\r\n ) : href ? (\r\n <LinkComponent\r\n href={href}\r\n className={combineClassNames(\r\n classMap.link,\r\n isChild && classMap.childLink,\r\n isActive && classMap.active,\r\n )}\r\n aria-current={isActive ? \"page\" : undefined}\r\n data-testid={`${testId}-sidebarLink`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n {label}\r\n </LinkComponent>\r\n ) : (\r\n <span\r\n className={combineClassNames(\r\n classMap.link,\r\n isChild && classMap.childLink,\r\n )}\r\n data-testid={`${testId}-sidebarLabel`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n {label}\r\n </span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n );\r\n\r\n return (\r\n <nav\r\n className={containerClasses}\r\n aria-label={ariaLabel}\r\n data-testid={testId}\r\n {...rest}\r\n >\r\n <div className={classMap.nav}>{renderLinks(links)}</div>\r\n\r\n {showFooter && (\r\n <footer className={classMap.footer} data-testid={`${testId}-footer`}>\r\n {footerLinks?.map(({ label, href }, i) => (\r\n <LinkComponent\r\n key={`${label}-${i}`}\r\n href={href}\r\n className={classMap.footerLink}\r\n data-testid={`${testId}-footerLink`}\r\n >\r\n {label}\r\n </LinkComponent>\r\n ))}\r\n {footerVersion && (\r\n <span\r\n className={classMap.footerVersion}\r\n data-testid={`${testId}-footerVersion`}\r\n >\r\n {footerVersion}\r\n </span>\r\n )}\r\n </footer>\r\n )}\r\n </nav>\r\n );\r\n};\r\n\r\nSidebarBase.displayName = \"SidebarBase\";\r\nexport default SidebarBase;\r\n","import React, { useState } from \"react\";\r\nimport SidebarBase from \"../SidebarBase\";\r\nimport \"./Sidebar.scss\";\r\nimport { SidebarLink, SidebarProps } from \"../Sidebar.types\";\r\n\r\nconst classes = {\r\n wrapper: \"sidebar\",\r\n nav: \"sidebar_nav\",\r\n list: \"sidebar_list\",\r\n childList: \"sidebar_child_list\",\r\n item: \"sidebar_item\",\r\n link: \"sidebar_link\",\r\n childLink: \"sidebar_child_link\",\r\n active: \"sidebar_active\",\r\n icon: \"sidebar_icon\",\r\n\r\n footer: \"sidebar_footer\",\r\n footerLink: \"sidebar_footer_link\",\r\n footerVersion: \"sidebar_footer_version\",\r\n\r\n chevron: \"sidebar_chevron\",\r\n chevronOpen: \"sidebar_chevron_open\",\r\n\r\n submenu: \"sidebar_submenu\",\r\n submenuOpen: \"sidebar_submenu_open\",\r\n\r\n outline: \"sidebar_outline\",\r\n\r\n primary: \"sidebar_primary\",\r\n secondary: \"sidebar_secondary\",\r\n tertiary: \"sidebar_tertiary\",\r\n quaternary: \"sidebar_quaternary\",\r\n\r\n success: \"sidebar_success\",\r\n error: \"sidebar_error\",\r\n warning: \"sidebar_warning\",\r\n\r\n clear: \"sidebar_clear\",\r\n\r\n shadowNone: \"sidebar_shadow-None\",\r\n shadowLight: \"sidebar_shadow-Light\",\r\n shadowMedium: \"sidebar_shadow-Medium\",\r\n shadowStrong: \"sidebar_shadow-Strong\",\r\n shadowIntense: \"sidebar_shadow-Intense\",\r\n\r\n roundNone: \"sidebar_round-None\",\r\n roundSmall: \"sidebar_round-Small\",\r\n roundMedium: \"sidebar_round-Medium\",\r\n roundLarge: \"sidebar_round-Large\",\r\n};\r\n\r\nconst normalizePath = (p: string) =>\r\n p.endsWith(\"/\") && p.length > 1 ? p.slice(0, -1) : p;\r\n\r\nconst getInitialPath = () =>\r\n typeof window !== \"undefined\" ? window.location.pathname || \"/\" : \"/\";\r\n\r\nconst isDescendantPath = (parentPath: string, currentPath: string): boolean => {\r\n const parent = normalizePath(parentPath);\r\n const current = normalizePath(currentPath);\r\n\r\n if (parent === \"/\") return current === \"/\";\r\n return current === parent || current.startsWith(`${parent}/`);\r\n};\r\n\r\nconst isActiveRecursive = (\r\n link: SidebarLink,\r\n matcher: (link: SidebarLink) => boolean,\r\n): boolean => {\r\n if (matcher(link)) return true;\r\n return !!link.children?.some((child) => isActiveRecursive(child, matcher));\r\n};\r\n\r\nconst Sidebar: React.FC<SidebarProps> = ({\r\n isLinkActive: consumerIsLinkActive,\r\n hasActiveChild: consumerHasActiveChild,\r\n ...props\r\n}) => {\r\n const [pathname] = useState(getInitialPath);\r\n\r\n const defaultIsLinkActive = (link: SidebarLink): boolean => {\r\n if (!link.href) return false;\r\n\r\n if (link.children?.length) {\r\n return isDescendantPath(link.href, pathname);\r\n }\r\n\r\n return normalizePath(link.href) === normalizePath(pathname);\r\n };\r\n\r\n const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;\r\n\r\n const defaultHasActiveChild = (link: SidebarLink): boolean =>\r\n !!link.children?.some((child) =>\r\n isActiveRecursive(child, resolvedIsLinkActive),\r\n );\r\n\r\n const resolvedHasActiveChild =\r\n consumerHasActiveChild ?? defaultHasActiveChild;\r\n\r\n return (\r\n <SidebarBase\r\n {...props}\r\n classMap={classes}\r\n isLinkActive={resolvedIsLinkActive}\r\n hasActiveChild={resolvedHasActiveChild}\r\n />\r\n );\r\n};\r\n\r\nSidebar.displayName = \"Sidebar\";\r\nexport default Sidebar;\r\n"],"names":["getDefaultTheme","getDefaultRounding","getDefaultShadow","useState","useRef","useEffect","_a","useMemo","combineClassNames","capitalize","jsx","jsxs","Fragment","ChevronDownIcon"],"mappings":"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"}
@@ -108,7 +108,7 @@ const SidebarBase = ({
108
108
  id: buttonId,
109
109
  className: combineClassNames(
110
110
  classMap.link,
111
- (isOpen || containsActiveChild) && classMap.active
111
+ (isActive || isOpen || containsActiveChild) && classMap.active
112
112
  ),
113
113
  onClick: () => toggleItem(label),
114
114
  "aria-expanded": isOpen,
@@ -255,25 +255,46 @@ const classes = {
255
255
  };
256
256
  const normalizePath = (p) => p.endsWith("/") && p.length > 1 ? p.slice(0, -1) : p;
257
257
  const getInitialPath = () => typeof window !== "undefined" ? window.location.pathname || "/" : "/";
258
+ const isDescendantPath = (parentPath, currentPath) => {
259
+ const parent = normalizePath(parentPath);
260
+ const current = normalizePath(currentPath);
261
+ if (parent === "/") return current === "/";
262
+ return current === parent || current.startsWith(`${parent}/`);
263
+ };
258
264
  const isActiveRecursive = (link, matcher) => {
259
265
  var _a;
260
266
  if (matcher(link)) return true;
261
267
  return !!((_a = link.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, matcher)));
262
268
  };
263
- const Sidebar = (props) => {
269
+ const Sidebar = ({
270
+ isLinkActive: consumerIsLinkActive,
271
+ hasActiveChild: consumerHasActiveChild,
272
+ ...props
273
+ }) => {
264
274
  const [pathname] = useState(getInitialPath);
265
- const isLinkActive = (link) => !!link.href && normalizePath(link.href) === normalizePath(pathname);
266
- const hasActiveChild = (link) => {
275
+ const defaultIsLinkActive = (link) => {
276
+ var _a;
277
+ if (!link.href) return false;
278
+ if ((_a = link.children) == null ? void 0 : _a.length) {
279
+ return isDescendantPath(link.href, pathname);
280
+ }
281
+ return normalizePath(link.href) === normalizePath(pathname);
282
+ };
283
+ const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;
284
+ const defaultHasActiveChild = (link) => {
267
285
  var _a;
268
- return !!((_a = link.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, isLinkActive)));
286
+ return !!((_a = link.children) == null ? void 0 : _a.some(
287
+ (child) => isActiveRecursive(child, resolvedIsLinkActive)
288
+ ));
269
289
  };
290
+ const resolvedHasActiveChild = consumerHasActiveChild ?? defaultHasActiveChild;
270
291
  return /* @__PURE__ */ jsx(
271
292
  SidebarBase,
272
293
  {
273
294
  ...props,
274
295
  classMap: classes,
275
- isLinkActive,
276
- hasActiveChild
296
+ isLinkActive: resolvedIsLinkActive,
297
+ hasActiveChild: resolvedHasActiveChild
277
298
  }
278
299
  );
279
300
  };
@@ -281,4 +302,4 @@ Sidebar.displayName = "Sidebar";
281
302
  export {
282
303
  Sidebar as S
283
304
  };
284
- //# sourceMappingURL=Sidebar-DiQvQvqa.js.map
305
+ //# sourceMappingURL=Sidebar-PLVBm7te.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar-PLVBm7te.js","sources":["../../src/components/Sidebar/SidebarBase.tsx","../../src/components/Sidebar/core/Sidebar.tsx"],"sourcesContent":["import React, { useState, useMemo, useRef, useEffect } from \"react\";\r\nimport { combineClassNames } from \"@/utils/classNames\";\r\nimport {\r\n getDefaultRounding,\r\n getDefaultShadow,\r\n getDefaultTheme,\r\n} from \"@/config/boreal-style-config\";\r\nimport { capitalize } from \"@/utils/capitalize\";\r\nimport { ChevronDownIcon } from \"@/Icons\";\r\nimport { BaseSidebarProps, SidebarLink } from \"./Sidebar.types\";\r\n\r\nconst SidebarBase: React.FC<BaseSidebarProps> = ({\r\n links,\r\n classMap,\r\n LinkComponent = \"a\",\r\n isLinkActive,\r\n hasActiveChild,\r\n theme = getDefaultTheme(),\r\n rounding = getDefaultRounding(),\r\n shadow = getDefaultShadow(),\r\n state = \"\",\r\n showFooter = false,\r\n footerLinks,\r\n footerVersion,\r\n outline = false,\r\n className = \"\",\r\n \"data-testid\": testId = \"sidebar\",\r\n ariaLabel = \"Sidebar navigation\",\r\n ...rest\r\n}) => {\r\n const [openItems, setOpenItems] = useState<Record<string, boolean>>({});\r\n\r\n const idsRef = useRef<Record<string, string>>({});\r\n const seqRef = useRef(0);\r\n\r\n const idFor = (label: string) => {\r\n if (!idsRef.current[label]) {\r\n const slug = label\r\n .toLowerCase()\r\n .replace(/\\s+/g, \"-\")\r\n .replace(/[^a-z0-9_-]/g, \"\");\r\n idsRef.current[label] = `${testId}-section-${slug}-${seqRef.current++}`;\r\n }\r\n return idsRef.current[label];\r\n };\r\n\r\n useEffect(() => {\r\n const next: Record<string, boolean> = {};\r\n\r\n const walk = (nodes: SidebarLink[]): boolean => {\r\n for (const node of nodes) {\r\n if (node.children?.length) {\r\n const childIsActive =\r\n hasActiveChild?.(node) ??\r\n node.children.some(\r\n (child) =>\r\n (isLinkActive?.(child) ?? false) ||\r\n (!!child.children?.length && walk(child.children)),\r\n );\r\n\r\n if (childIsActive) {\r\n next[node.label] = true;\r\n }\r\n }\r\n }\r\n\r\n return nodes.some(\r\n (node) =>\r\n (isLinkActive?.(node) ?? false) ||\r\n (!!node.children?.length && walk(node.children)),\r\n );\r\n };\r\n\r\n walk(links);\r\n setOpenItems((prev) => ({ ...prev, ...next }));\r\n }, [links, isLinkActive, hasActiveChild]);\r\n\r\n const toggleItem = (key: string) =>\r\n setOpenItems((prev) => ({ ...prev, [key]: !prev[key] }));\r\n\r\n const containerClasses = useMemo(\r\n () =>\r\n combineClassNames(\r\n classMap.wrapper,\r\n className,\r\n classMap[theme],\r\n classMap[state],\r\n shadow && classMap[`shadow${capitalize(shadow)}`],\r\n rounding && classMap[`round${capitalize(rounding)}`],\r\n outline && classMap.outline,\r\n ),\r\n [classMap, className, theme, state, outline, rounding, shadow],\r\n );\r\n\r\n const renderLinks = (items: SidebarLink[], isChild = false) => (\r\n <ul\r\n className={combineClassNames(\r\n classMap.list,\r\n isChild && classMap.childList,\r\n )}\r\n data-testid={`${testId}-list`}\r\n >\r\n {items.map(({ label, href, children, icon }, idx) => {\r\n const key = `${label}-${idx}`;\r\n const link: SidebarLink = { label, href, children, icon };\r\n\r\n const isActive = isLinkActive?.(link) ?? false;\r\n const containsActiveChild =\r\n hasActiveChild?.(link) ??\r\n !!children?.some(\r\n (child) =>\r\n (isLinkActive?.(child) ?? false) ||\r\n (child.children?.length && (hasActiveChild?.(child) ?? false)),\r\n );\r\n\r\n const isOpen = !!openItems[label];\r\n const sectionId = idFor(label);\r\n const buttonId = `${sectionId}-button`;\r\n const panelId = `${sectionId}-panel`;\r\n\r\n return (\r\n <li\r\n key={key}\r\n className={classMap.item}\r\n data-testid={`${testId}-listItem`}\r\n >\r\n {children && children.length > 0 ? (\r\n <>\r\n <button\r\n type=\"button\"\r\n id={buttonId}\r\n className={combineClassNames(\r\n classMap.link,\r\n (isActive || isOpen || containsActiveChild) &&\r\n classMap.active,\r\n )}\r\n onClick={() => toggleItem(label)}\r\n aria-expanded={isOpen}\r\n aria-controls={panelId}\r\n data-testid={`${testId}-expandItemButton`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n <span data-testid={`${testId}-expandItemLabel`}>{label}</span>\r\n <ChevronDownIcon\r\n className={combineClassNames(\r\n classMap.chevron,\r\n isOpen && classMap.chevronOpen,\r\n )}\r\n aria-hidden=\"true\"\r\n focusable={false}\r\n data-testid={`${testId}-expandIcon`}\r\n />\r\n </button>\r\n\r\n <div\r\n id={panelId}\r\n className={combineClassNames(\r\n classMap.submenu,\r\n isOpen && classMap.submenuOpen,\r\n )}\r\n role=\"group\"\r\n aria-labelledby={buttonId}\r\n hidden={!isOpen}\r\n data-testid={`${testId}-subMenu`}\r\n >\r\n {renderLinks(children, true)}\r\n </div>\r\n </>\r\n ) : href ? (\r\n <LinkComponent\r\n href={href}\r\n className={combineClassNames(\r\n classMap.link,\r\n isChild && classMap.childLink,\r\n isActive && classMap.active,\r\n )}\r\n aria-current={isActive ? \"page\" : undefined}\r\n data-testid={`${testId}-sidebarLink`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n {label}\r\n </LinkComponent>\r\n ) : (\r\n <span\r\n className={combineClassNames(\r\n classMap.link,\r\n isChild && classMap.childLink,\r\n )}\r\n data-testid={`${testId}-sidebarLabel`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n {label}\r\n </span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n );\r\n\r\n return (\r\n <nav\r\n className={containerClasses}\r\n aria-label={ariaLabel}\r\n data-testid={testId}\r\n {...rest}\r\n >\r\n <div className={classMap.nav}>{renderLinks(links)}</div>\r\n\r\n {showFooter && (\r\n <footer className={classMap.footer} data-testid={`${testId}-footer`}>\r\n {footerLinks?.map(({ label, href }, i) => (\r\n <LinkComponent\r\n key={`${label}-${i}`}\r\n href={href}\r\n className={classMap.footerLink}\r\n data-testid={`${testId}-footerLink`}\r\n >\r\n {label}\r\n </LinkComponent>\r\n ))}\r\n {footerVersion && (\r\n <span\r\n className={classMap.footerVersion}\r\n data-testid={`${testId}-footerVersion`}\r\n >\r\n {footerVersion}\r\n </span>\r\n )}\r\n </footer>\r\n )}\r\n </nav>\r\n );\r\n};\r\n\r\nSidebarBase.displayName = \"SidebarBase\";\r\nexport default SidebarBase;\r\n","import React, { useState } from \"react\";\r\nimport SidebarBase from \"../SidebarBase\";\r\nimport \"./Sidebar.scss\";\r\nimport { SidebarLink, SidebarProps } from \"../Sidebar.types\";\r\n\r\nconst classes = {\r\n wrapper: \"sidebar\",\r\n nav: \"sidebar_nav\",\r\n list: \"sidebar_list\",\r\n childList: \"sidebar_child_list\",\r\n item: \"sidebar_item\",\r\n link: \"sidebar_link\",\r\n childLink: \"sidebar_child_link\",\r\n active: \"sidebar_active\",\r\n icon: \"sidebar_icon\",\r\n\r\n footer: \"sidebar_footer\",\r\n footerLink: \"sidebar_footer_link\",\r\n footerVersion: \"sidebar_footer_version\",\r\n\r\n chevron: \"sidebar_chevron\",\r\n chevronOpen: \"sidebar_chevron_open\",\r\n\r\n submenu: \"sidebar_submenu\",\r\n submenuOpen: \"sidebar_submenu_open\",\r\n\r\n outline: \"sidebar_outline\",\r\n\r\n primary: \"sidebar_primary\",\r\n secondary: \"sidebar_secondary\",\r\n tertiary: \"sidebar_tertiary\",\r\n quaternary: \"sidebar_quaternary\",\r\n\r\n success: \"sidebar_success\",\r\n error: \"sidebar_error\",\r\n warning: \"sidebar_warning\",\r\n\r\n clear: \"sidebar_clear\",\r\n\r\n shadowNone: \"sidebar_shadow-None\",\r\n shadowLight: \"sidebar_shadow-Light\",\r\n shadowMedium: \"sidebar_shadow-Medium\",\r\n shadowStrong: \"sidebar_shadow-Strong\",\r\n shadowIntense: \"sidebar_shadow-Intense\",\r\n\r\n roundNone: \"sidebar_round-None\",\r\n roundSmall: \"sidebar_round-Small\",\r\n roundMedium: \"sidebar_round-Medium\",\r\n roundLarge: \"sidebar_round-Large\",\r\n};\r\n\r\nconst normalizePath = (p: string) =>\r\n p.endsWith(\"/\") && p.length > 1 ? p.slice(0, -1) : p;\r\n\r\nconst getInitialPath = () =>\r\n typeof window !== \"undefined\" ? window.location.pathname || \"/\" : \"/\";\r\n\r\nconst isDescendantPath = (parentPath: string, currentPath: string): boolean => {\r\n const parent = normalizePath(parentPath);\r\n const current = normalizePath(currentPath);\r\n\r\n if (parent === \"/\") return current === \"/\";\r\n return current === parent || current.startsWith(`${parent}/`);\r\n};\r\n\r\nconst isActiveRecursive = (\r\n link: SidebarLink,\r\n matcher: (link: SidebarLink) => boolean,\r\n): boolean => {\r\n if (matcher(link)) return true;\r\n return !!link.children?.some((child) => isActiveRecursive(child, matcher));\r\n};\r\n\r\nconst Sidebar: React.FC<SidebarProps> = ({\r\n isLinkActive: consumerIsLinkActive,\r\n hasActiveChild: consumerHasActiveChild,\r\n ...props\r\n}) => {\r\n const [pathname] = useState(getInitialPath);\r\n\r\n const defaultIsLinkActive = (link: SidebarLink): boolean => {\r\n if (!link.href) return false;\r\n\r\n if (link.children?.length) {\r\n return isDescendantPath(link.href, pathname);\r\n }\r\n\r\n return normalizePath(link.href) === normalizePath(pathname);\r\n };\r\n\r\n const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;\r\n\r\n const defaultHasActiveChild = (link: SidebarLink): boolean =>\r\n !!link.children?.some((child) =>\r\n isActiveRecursive(child, resolvedIsLinkActive),\r\n );\r\n\r\n const resolvedHasActiveChild =\r\n consumerHasActiveChild ?? defaultHasActiveChild;\r\n\r\n return (\r\n <SidebarBase\r\n {...props}\r\n classMap={classes}\r\n isLinkActive={resolvedIsLinkActive}\r\n hasActiveChild={resolvedHasActiveChild}\r\n />\r\n );\r\n};\r\n\r\nSidebar.displayName = \"Sidebar\";\r\nexport default Sidebar;\r\n"],"names":["_a"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
- const Sidebar = require("./Sidebar-DMR5T81x.cjs");
2
+ const Sidebar = require("./Sidebar-BMvvoT9j.cjs");
3
3
  module.exports = Sidebar.Sidebar;
4
4
  //# sourceMappingURL=Sidebar.cjs.js.map
@@ -1,4 +1,4 @@
1
- import { S } from "./Sidebar-DiQvQvqa.js";
1
+ import { S } from "./Sidebar-PLVBm7te.js";
2
2
  export {
3
3
  S as default
4
4
  };
@@ -53,7 +53,7 @@ const MetricBox = require("./MetricBox-DVo4UUQv.cjs");
53
53
  const EmptyState = require("./EmptyState-P-MSItCX.cjs");
54
54
  const CommandPalette = require("./CommandPalette-Cv79G0W9.cjs");
55
55
  const NotificationCenter = require("./NotificationCenter-DfOOEt9N.cjs");
56
- const Sidebar = require("./Sidebar-DMR5T81x.cjs");
56
+ const Sidebar = require("./Sidebar-BMvvoT9j.cjs");
57
57
  const Card = require("./Card-DRM65kM-.cjs");
58
58
  const Avatar = require("./Avatar-DOg8W9yf.cjs");
59
59
  const ChipGroupBase = React.forwardRef(
@@ -52,7 +52,7 @@ import { M as M4 } from "./MetricBox-CPug-nxo.js";
52
52
  import { E } from "./EmptyState-Cp3ocTQX.js";
53
53
  import { C as C4 } from "./CommandPalette-BcPsaNIk.js";
54
54
  import { N as N2 } from "./NotificationCenter-DLCzWNve.js";
55
- import { S as S7 } from "./Sidebar-DiQvQvqa.js";
55
+ import { S as S7 } from "./Sidebar-PLVBm7te.js";
56
56
  import { C as C5 } from "./Card-BjLC4t0w.js";
57
57
  import { A as A2 } from "./Avatar-BM8AwOB6.js";
58
58
  const ChipGroupBase = forwardRef(
@@ -110,7 +110,7 @@ const SidebarBase = ({
110
110
  id: buttonId,
111
111
  className: combineClassNames(
112
112
  classMap.link,
113
- (isOpen || containsActiveChild) && classMap.active
113
+ (isActive || isOpen || containsActiveChild) && classMap.active
114
114
  ),
115
115
  onClick: () => toggleItem(label),
116
116
  "aria-expanded": isOpen,
@@ -290,26 +290,48 @@ const styles = {
290
290
  footerVersion
291
291
  };
292
292
  const normalizePath = (p) => p.endsWith("/") && p.length > 1 ? p.slice(0, -1) : p;
293
+ const isDescendantPath = (parentPath, currentPath) => {
294
+ const parent = normalizePath(parentPath);
295
+ const current = normalizePath(currentPath);
296
+ if (parent === "/") return current === "/";
297
+ return current === parent || current.startsWith(`${parent}/`);
298
+ };
293
299
  const isActiveRecursive = (link2, matcher) => {
294
300
  var _a;
295
301
  if (matcher(link2)) return true;
296
302
  return !!((_a = link2.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, matcher)));
297
303
  };
298
- const Sidebar = ({ links, ...rest }) => {
304
+ const Sidebar = ({
305
+ links,
306
+ isLinkActive: consumerIsLinkActive,
307
+ hasActiveChild: consumerHasActiveChild,
308
+ ...rest
309
+ }) => {
299
310
  const pathname = navigationExports.usePathname() || "/";
300
- const isLinkActive = (link2) => !!link2.href && normalizePath(link2.href) === normalizePath(pathname);
301
- const hasActiveChild = (link2) => {
311
+ const defaultIsLinkActive = (link2) => {
312
+ var _a;
313
+ if (!link2.href) return false;
314
+ if ((_a = link2.children) == null ? void 0 : _a.length) {
315
+ return isDescendantPath(link2.href, pathname);
316
+ }
317
+ return normalizePath(link2.href) === normalizePath(pathname);
318
+ };
319
+ const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;
320
+ const defaultHasActiveChild = (link2) => {
302
321
  var _a;
303
- return !!((_a = link2.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, isLinkActive)));
322
+ return !!((_a = link2.children) == null ? void 0 : _a.some(
323
+ (child) => isActiveRecursive(child, resolvedIsLinkActive)
324
+ ));
304
325
  };
326
+ const resolvedHasActiveChild = consumerHasActiveChild ?? defaultHasActiveChild;
305
327
  return /* @__PURE__ */ jsx(
306
328
  SidebarBase,
307
329
  {
308
330
  links,
309
331
  classMap: styles,
310
332
  LinkComponent: Link,
311
- isLinkActive,
312
- hasActiveChild,
333
+ isLinkActive: resolvedIsLinkActive,
334
+ hasActiveChild: resolvedHasActiveChild,
313
335
  ...rest
314
336
  }
315
337
  );
@@ -318,4 +340,4 @@ Sidebar.displayName = "Sidebar";
318
340
  export {
319
341
  Sidebar as S
320
342
  };
321
- //# sourceMappingURL=Sidebar-HqR8uzt4.js.map
343
+ //# sourceMappingURL=Sidebar-C8QSoGsE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar-C8QSoGsE.js","sources":["../../src/components/Sidebar/SidebarBase.tsx","../../src/components/Sidebar/next/Sidebar.tsx"],"sourcesContent":["import React, { useState, useMemo, useRef, useEffect } from \"react\";\r\nimport { combineClassNames } from \"@/utils/classNames\";\r\nimport {\r\n getDefaultRounding,\r\n getDefaultShadow,\r\n getDefaultTheme,\r\n} from \"@/config/boreal-style-config\";\r\nimport { capitalize } from \"@/utils/capitalize\";\r\nimport { ChevronDownIcon } from \"@/Icons\";\r\nimport { BaseSidebarProps, SidebarLink } from \"./Sidebar.types\";\r\n\r\nconst SidebarBase: React.FC<BaseSidebarProps> = ({\r\n links,\r\n classMap,\r\n LinkComponent = \"a\",\r\n isLinkActive,\r\n hasActiveChild,\r\n theme = getDefaultTheme(),\r\n rounding = getDefaultRounding(),\r\n shadow = getDefaultShadow(),\r\n state = \"\",\r\n showFooter = false,\r\n footerLinks,\r\n footerVersion,\r\n outline = false,\r\n className = \"\",\r\n \"data-testid\": testId = \"sidebar\",\r\n ariaLabel = \"Sidebar navigation\",\r\n ...rest\r\n}) => {\r\n const [openItems, setOpenItems] = useState<Record<string, boolean>>({});\r\n\r\n const idsRef = useRef<Record<string, string>>({});\r\n const seqRef = useRef(0);\r\n\r\n const idFor = (label: string) => {\r\n if (!idsRef.current[label]) {\r\n const slug = label\r\n .toLowerCase()\r\n .replace(/\\s+/g, \"-\")\r\n .replace(/[^a-z0-9_-]/g, \"\");\r\n idsRef.current[label] = `${testId}-section-${slug}-${seqRef.current++}`;\r\n }\r\n return idsRef.current[label];\r\n };\r\n\r\n useEffect(() => {\r\n const next: Record<string, boolean> = {};\r\n\r\n const walk = (nodes: SidebarLink[]): boolean => {\r\n for (const node of nodes) {\r\n if (node.children?.length) {\r\n const childIsActive =\r\n hasActiveChild?.(node) ??\r\n node.children.some(\r\n (child) =>\r\n (isLinkActive?.(child) ?? false) ||\r\n (!!child.children?.length && walk(child.children)),\r\n );\r\n\r\n if (childIsActive) {\r\n next[node.label] = true;\r\n }\r\n }\r\n }\r\n\r\n return nodes.some(\r\n (node) =>\r\n (isLinkActive?.(node) ?? false) ||\r\n (!!node.children?.length && walk(node.children)),\r\n );\r\n };\r\n\r\n walk(links);\r\n setOpenItems((prev) => ({ ...prev, ...next }));\r\n }, [links, isLinkActive, hasActiveChild]);\r\n\r\n const toggleItem = (key: string) =>\r\n setOpenItems((prev) => ({ ...prev, [key]: !prev[key] }));\r\n\r\n const containerClasses = useMemo(\r\n () =>\r\n combineClassNames(\r\n classMap.wrapper,\r\n className,\r\n classMap[theme],\r\n classMap[state],\r\n shadow && classMap[`shadow${capitalize(shadow)}`],\r\n rounding && classMap[`round${capitalize(rounding)}`],\r\n outline && classMap.outline,\r\n ),\r\n [classMap, className, theme, state, outline, rounding, shadow],\r\n );\r\n\r\n const renderLinks = (items: SidebarLink[], isChild = false) => (\r\n <ul\r\n className={combineClassNames(\r\n classMap.list,\r\n isChild && classMap.childList,\r\n )}\r\n data-testid={`${testId}-list`}\r\n >\r\n {items.map(({ label, href, children, icon }, idx) => {\r\n const key = `${label}-${idx}`;\r\n const link: SidebarLink = { label, href, children, icon };\r\n\r\n const isActive = isLinkActive?.(link) ?? false;\r\n const containsActiveChild =\r\n hasActiveChild?.(link) ??\r\n !!children?.some(\r\n (child) =>\r\n (isLinkActive?.(child) ?? false) ||\r\n (child.children?.length && (hasActiveChild?.(child) ?? false)),\r\n );\r\n\r\n const isOpen = !!openItems[label];\r\n const sectionId = idFor(label);\r\n const buttonId = `${sectionId}-button`;\r\n const panelId = `${sectionId}-panel`;\r\n\r\n return (\r\n <li\r\n key={key}\r\n className={classMap.item}\r\n data-testid={`${testId}-listItem`}\r\n >\r\n {children && children.length > 0 ? (\r\n <>\r\n <button\r\n type=\"button\"\r\n id={buttonId}\r\n className={combineClassNames(\r\n classMap.link,\r\n (isActive || isOpen || containsActiveChild) &&\r\n classMap.active,\r\n )}\r\n onClick={() => toggleItem(label)}\r\n aria-expanded={isOpen}\r\n aria-controls={panelId}\r\n data-testid={`${testId}-expandItemButton`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n <span data-testid={`${testId}-expandItemLabel`}>{label}</span>\r\n <ChevronDownIcon\r\n className={combineClassNames(\r\n classMap.chevron,\r\n isOpen && classMap.chevronOpen,\r\n )}\r\n aria-hidden=\"true\"\r\n focusable={false}\r\n data-testid={`${testId}-expandIcon`}\r\n />\r\n </button>\r\n\r\n <div\r\n id={panelId}\r\n className={combineClassNames(\r\n classMap.submenu,\r\n isOpen && classMap.submenuOpen,\r\n )}\r\n role=\"group\"\r\n aria-labelledby={buttonId}\r\n hidden={!isOpen}\r\n data-testid={`${testId}-subMenu`}\r\n >\r\n {renderLinks(children, true)}\r\n </div>\r\n </>\r\n ) : href ? (\r\n <LinkComponent\r\n href={href}\r\n className={combineClassNames(\r\n classMap.link,\r\n isChild && classMap.childLink,\r\n isActive && classMap.active,\r\n )}\r\n aria-current={isActive ? \"page\" : undefined}\r\n data-testid={`${testId}-sidebarLink`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n {label}\r\n </LinkComponent>\r\n ) : (\r\n <span\r\n className={combineClassNames(\r\n classMap.link,\r\n isChild && classMap.childLink,\r\n )}\r\n data-testid={`${testId}-sidebarLabel`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n {label}\r\n </span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n );\r\n\r\n return (\r\n <nav\r\n className={containerClasses}\r\n aria-label={ariaLabel}\r\n data-testid={testId}\r\n {...rest}\r\n >\r\n <div className={classMap.nav}>{renderLinks(links)}</div>\r\n\r\n {showFooter && (\r\n <footer className={classMap.footer} data-testid={`${testId}-footer`}>\r\n {footerLinks?.map(({ label, href }, i) => (\r\n <LinkComponent\r\n key={`${label}-${i}`}\r\n href={href}\r\n className={classMap.footerLink}\r\n data-testid={`${testId}-footerLink`}\r\n >\r\n {label}\r\n </LinkComponent>\r\n ))}\r\n {footerVersion && (\r\n <span\r\n className={classMap.footerVersion}\r\n data-testid={`${testId}-footerVersion`}\r\n >\r\n {footerVersion}\r\n </span>\r\n )}\r\n </footer>\r\n )}\r\n </nav>\r\n );\r\n};\r\n\r\nSidebarBase.displayName = \"SidebarBase\";\r\nexport default SidebarBase;\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport Link from \"next/link\";\r\nimport { usePathname } from \"next/navigation\";\r\nimport SidebarBase from \"../SidebarBase\";\r\nimport styles from \"./Sidebar.module.scss\";\r\nimport { SidebarLink, SidebarProps } from \"../Sidebar.types\";\r\n\r\nconst normalizePath = (p: string) =>\r\n p.endsWith(\"/\") && p.length > 1 ? p.slice(0, -1) : p;\r\n\r\nconst isDescendantPath = (parentPath: string, currentPath: string): boolean => {\r\n const parent = normalizePath(parentPath);\r\n const current = normalizePath(currentPath);\r\n\r\n if (parent === \"/\") return current === \"/\";\r\n return current === parent || current.startsWith(`${parent}/`);\r\n};\r\n\r\nconst isActiveRecursive = (\r\n link: SidebarLink,\r\n matcher: (link: SidebarLink) => boolean,\r\n): boolean => {\r\n if (matcher(link)) return true;\r\n return !!link.children?.some((child) => isActiveRecursive(child, matcher));\r\n};\r\n\r\nconst Sidebar: React.FC<SidebarProps> = ({\r\n links,\r\n isLinkActive: consumerIsLinkActive,\r\n hasActiveChild: consumerHasActiveChild,\r\n ...rest\r\n}) => {\r\n const pathname = usePathname() || \"/\";\r\n\r\n const defaultIsLinkActive = (link: SidebarLink): boolean => {\r\n if (!link.href) return false;\r\n\r\n if (link.children?.length) {\r\n return isDescendantPath(link.href, pathname);\r\n }\r\n\r\n return normalizePath(link.href) === normalizePath(pathname);\r\n };\r\n\r\n const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;\r\n\r\n const defaultHasActiveChild = (link: SidebarLink): boolean =>\r\n !!link.children?.some((child) =>\r\n isActiveRecursive(child, resolvedIsLinkActive),\r\n );\r\n\r\n const resolvedHasActiveChild =\r\n consumerHasActiveChild ?? defaultHasActiveChild;\r\n\r\n return (\r\n <SidebarBase\r\n links={links}\r\n classMap={styles}\r\n LinkComponent={Link}\r\n isLinkActive={resolvedIsLinkActive}\r\n hasActiveChild={resolvedHasActiveChild}\r\n {...rest}\r\n />\r\n );\r\n};\r\n\r\nSidebar.displayName = \"Sidebar\";\r\nexport default Sidebar;\r\n"],"names":["footerVersion","outline","_a","icon","link","usePathname"],"mappings":"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"}
@@ -111,7 +111,7 @@ const SidebarBase = ({
111
111
  id: buttonId,
112
112
  className: classNames.combineClassNames(
113
113
  classMap.link,
114
- (isOpen || containsActiveChild) && classMap.active
114
+ (isActive || isOpen || containsActiveChild) && classMap.active
115
115
  ),
116
116
  onClick: () => toggleItem(label),
117
117
  "aria-expanded": isOpen,
@@ -291,30 +291,52 @@ const styles = {
291
291
  footerVersion
292
292
  };
293
293
  const normalizePath = (p) => p.endsWith("/") && p.length > 1 ? p.slice(0, -1) : p;
294
+ const isDescendantPath = (parentPath, currentPath) => {
295
+ const parent = normalizePath(parentPath);
296
+ const current = normalizePath(currentPath);
297
+ if (parent === "/") return current === "/";
298
+ return current === parent || current.startsWith(`${parent}/`);
299
+ };
294
300
  const isActiveRecursive = (link2, matcher) => {
295
301
  var _a;
296
302
  if (matcher(link2)) return true;
297
303
  return !!((_a = link2.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, matcher)));
298
304
  };
299
- const Sidebar = ({ links, ...rest }) => {
305
+ const Sidebar = ({
306
+ links,
307
+ isLinkActive: consumerIsLinkActive,
308
+ hasActiveChild: consumerHasActiveChild,
309
+ ...rest
310
+ }) => {
300
311
  const pathname = navigation.navigationExports.usePathname() || "/";
301
- const isLinkActive = (link2) => !!link2.href && normalizePath(link2.href) === normalizePath(pathname);
302
- const hasActiveChild = (link2) => {
312
+ const defaultIsLinkActive = (link2) => {
313
+ var _a;
314
+ if (!link2.href) return false;
315
+ if ((_a = link2.children) == null ? void 0 : _a.length) {
316
+ return isDescendantPath(link2.href, pathname);
317
+ }
318
+ return normalizePath(link2.href) === normalizePath(pathname);
319
+ };
320
+ const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;
321
+ const defaultHasActiveChild = (link2) => {
303
322
  var _a;
304
- return !!((_a = link2.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, isLinkActive)));
323
+ return !!((_a = link2.children) == null ? void 0 : _a.some(
324
+ (child) => isActiveRecursive(child, resolvedIsLinkActive)
325
+ ));
305
326
  };
327
+ const resolvedHasActiveChild = consumerHasActiveChild ?? defaultHasActiveChild;
306
328
  return /* @__PURE__ */ require$$2.jsx(
307
329
  SidebarBase,
308
330
  {
309
331
  links,
310
332
  classMap: styles,
311
333
  LinkComponent: link$1.Link,
312
- isLinkActive,
313
- hasActiveChild,
334
+ isLinkActive: resolvedIsLinkActive,
335
+ hasActiveChild: resolvedHasActiveChild,
314
336
  ...rest
315
337
  }
316
338
  );
317
339
  };
318
340
  Sidebar.displayName = "Sidebar";
319
341
  exports.Sidebar = Sidebar;
320
- //# sourceMappingURL=Sidebar-DbzIKbwL.cjs.map
342
+ //# sourceMappingURL=Sidebar-yllRZuSW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar-yllRZuSW.cjs","sources":["../../src/components/Sidebar/SidebarBase.tsx","../../src/components/Sidebar/next/Sidebar.tsx"],"sourcesContent":["import React, { useState, useMemo, useRef, useEffect } from \"react\";\r\nimport { combineClassNames } from \"@/utils/classNames\";\r\nimport {\r\n getDefaultRounding,\r\n getDefaultShadow,\r\n getDefaultTheme,\r\n} from \"@/config/boreal-style-config\";\r\nimport { capitalize } from \"@/utils/capitalize\";\r\nimport { ChevronDownIcon } from \"@/Icons\";\r\nimport { BaseSidebarProps, SidebarLink } from \"./Sidebar.types\";\r\n\r\nconst SidebarBase: React.FC<BaseSidebarProps> = ({\r\n links,\r\n classMap,\r\n LinkComponent = \"a\",\r\n isLinkActive,\r\n hasActiveChild,\r\n theme = getDefaultTheme(),\r\n rounding = getDefaultRounding(),\r\n shadow = getDefaultShadow(),\r\n state = \"\",\r\n showFooter = false,\r\n footerLinks,\r\n footerVersion,\r\n outline = false,\r\n className = \"\",\r\n \"data-testid\": testId = \"sidebar\",\r\n ariaLabel = \"Sidebar navigation\",\r\n ...rest\r\n}) => {\r\n const [openItems, setOpenItems] = useState<Record<string, boolean>>({});\r\n\r\n const idsRef = useRef<Record<string, string>>({});\r\n const seqRef = useRef(0);\r\n\r\n const idFor = (label: string) => {\r\n if (!idsRef.current[label]) {\r\n const slug = label\r\n .toLowerCase()\r\n .replace(/\\s+/g, \"-\")\r\n .replace(/[^a-z0-9_-]/g, \"\");\r\n idsRef.current[label] = `${testId}-section-${slug}-${seqRef.current++}`;\r\n }\r\n return idsRef.current[label];\r\n };\r\n\r\n useEffect(() => {\r\n const next: Record<string, boolean> = {};\r\n\r\n const walk = (nodes: SidebarLink[]): boolean => {\r\n for (const node of nodes) {\r\n if (node.children?.length) {\r\n const childIsActive =\r\n hasActiveChild?.(node) ??\r\n node.children.some(\r\n (child) =>\r\n (isLinkActive?.(child) ?? false) ||\r\n (!!child.children?.length && walk(child.children)),\r\n );\r\n\r\n if (childIsActive) {\r\n next[node.label] = true;\r\n }\r\n }\r\n }\r\n\r\n return nodes.some(\r\n (node) =>\r\n (isLinkActive?.(node) ?? false) ||\r\n (!!node.children?.length && walk(node.children)),\r\n );\r\n };\r\n\r\n walk(links);\r\n setOpenItems((prev) => ({ ...prev, ...next }));\r\n }, [links, isLinkActive, hasActiveChild]);\r\n\r\n const toggleItem = (key: string) =>\r\n setOpenItems((prev) => ({ ...prev, [key]: !prev[key] }));\r\n\r\n const containerClasses = useMemo(\r\n () =>\r\n combineClassNames(\r\n classMap.wrapper,\r\n className,\r\n classMap[theme],\r\n classMap[state],\r\n shadow && classMap[`shadow${capitalize(shadow)}`],\r\n rounding && classMap[`round${capitalize(rounding)}`],\r\n outline && classMap.outline,\r\n ),\r\n [classMap, className, theme, state, outline, rounding, shadow],\r\n );\r\n\r\n const renderLinks = (items: SidebarLink[], isChild = false) => (\r\n <ul\r\n className={combineClassNames(\r\n classMap.list,\r\n isChild && classMap.childList,\r\n )}\r\n data-testid={`${testId}-list`}\r\n >\r\n {items.map(({ label, href, children, icon }, idx) => {\r\n const key = `${label}-${idx}`;\r\n const link: SidebarLink = { label, href, children, icon };\r\n\r\n const isActive = isLinkActive?.(link) ?? false;\r\n const containsActiveChild =\r\n hasActiveChild?.(link) ??\r\n !!children?.some(\r\n (child) =>\r\n (isLinkActive?.(child) ?? false) ||\r\n (child.children?.length && (hasActiveChild?.(child) ?? false)),\r\n );\r\n\r\n const isOpen = !!openItems[label];\r\n const sectionId = idFor(label);\r\n const buttonId = `${sectionId}-button`;\r\n const panelId = `${sectionId}-panel`;\r\n\r\n return (\r\n <li\r\n key={key}\r\n className={classMap.item}\r\n data-testid={`${testId}-listItem`}\r\n >\r\n {children && children.length > 0 ? (\r\n <>\r\n <button\r\n type=\"button\"\r\n id={buttonId}\r\n className={combineClassNames(\r\n classMap.link,\r\n (isActive || isOpen || containsActiveChild) &&\r\n classMap.active,\r\n )}\r\n onClick={() => toggleItem(label)}\r\n aria-expanded={isOpen}\r\n aria-controls={panelId}\r\n data-testid={`${testId}-expandItemButton`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n <span data-testid={`${testId}-expandItemLabel`}>{label}</span>\r\n <ChevronDownIcon\r\n className={combineClassNames(\r\n classMap.chevron,\r\n isOpen && classMap.chevronOpen,\r\n )}\r\n aria-hidden=\"true\"\r\n focusable={false}\r\n data-testid={`${testId}-expandIcon`}\r\n />\r\n </button>\r\n\r\n <div\r\n id={panelId}\r\n className={combineClassNames(\r\n classMap.submenu,\r\n isOpen && classMap.submenuOpen,\r\n )}\r\n role=\"group\"\r\n aria-labelledby={buttonId}\r\n hidden={!isOpen}\r\n data-testid={`${testId}-subMenu`}\r\n >\r\n {renderLinks(children, true)}\r\n </div>\r\n </>\r\n ) : href ? (\r\n <LinkComponent\r\n href={href}\r\n className={combineClassNames(\r\n classMap.link,\r\n isChild && classMap.childLink,\r\n isActive && classMap.active,\r\n )}\r\n aria-current={isActive ? \"page\" : undefined}\r\n data-testid={`${testId}-sidebarLink`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n {label}\r\n </LinkComponent>\r\n ) : (\r\n <span\r\n className={combineClassNames(\r\n classMap.link,\r\n isChild && classMap.childLink,\r\n )}\r\n data-testid={`${testId}-sidebarLabel`}\r\n >\r\n {icon && <span className={classMap.icon}>{icon}</span>}\r\n {label}\r\n </span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n );\r\n\r\n return (\r\n <nav\r\n className={containerClasses}\r\n aria-label={ariaLabel}\r\n data-testid={testId}\r\n {...rest}\r\n >\r\n <div className={classMap.nav}>{renderLinks(links)}</div>\r\n\r\n {showFooter && (\r\n <footer className={classMap.footer} data-testid={`${testId}-footer`}>\r\n {footerLinks?.map(({ label, href }, i) => (\r\n <LinkComponent\r\n key={`${label}-${i}`}\r\n href={href}\r\n className={classMap.footerLink}\r\n data-testid={`${testId}-footerLink`}\r\n >\r\n {label}\r\n </LinkComponent>\r\n ))}\r\n {footerVersion && (\r\n <span\r\n className={classMap.footerVersion}\r\n data-testid={`${testId}-footerVersion`}\r\n >\r\n {footerVersion}\r\n </span>\r\n )}\r\n </footer>\r\n )}\r\n </nav>\r\n );\r\n};\r\n\r\nSidebarBase.displayName = \"SidebarBase\";\r\nexport default SidebarBase;\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport Link from \"next/link\";\r\nimport { usePathname } from \"next/navigation\";\r\nimport SidebarBase from \"../SidebarBase\";\r\nimport styles from \"./Sidebar.module.scss\";\r\nimport { SidebarLink, SidebarProps } from \"../Sidebar.types\";\r\n\r\nconst normalizePath = (p: string) =>\r\n p.endsWith(\"/\") && p.length > 1 ? p.slice(0, -1) : p;\r\n\r\nconst isDescendantPath = (parentPath: string, currentPath: string): boolean => {\r\n const parent = normalizePath(parentPath);\r\n const current = normalizePath(currentPath);\r\n\r\n if (parent === \"/\") return current === \"/\";\r\n return current === parent || current.startsWith(`${parent}/`);\r\n};\r\n\r\nconst isActiveRecursive = (\r\n link: SidebarLink,\r\n matcher: (link: SidebarLink) => boolean,\r\n): boolean => {\r\n if (matcher(link)) return true;\r\n return !!link.children?.some((child) => isActiveRecursive(child, matcher));\r\n};\r\n\r\nconst Sidebar: React.FC<SidebarProps> = ({\r\n links,\r\n isLinkActive: consumerIsLinkActive,\r\n hasActiveChild: consumerHasActiveChild,\r\n ...rest\r\n}) => {\r\n const pathname = usePathname() || \"/\";\r\n\r\n const defaultIsLinkActive = (link: SidebarLink): boolean => {\r\n if (!link.href) return false;\r\n\r\n if (link.children?.length) {\r\n return isDescendantPath(link.href, pathname);\r\n }\r\n\r\n return normalizePath(link.href) === normalizePath(pathname);\r\n };\r\n\r\n const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;\r\n\r\n const defaultHasActiveChild = (link: SidebarLink): boolean =>\r\n !!link.children?.some((child) =>\r\n isActiveRecursive(child, resolvedIsLinkActive),\r\n );\r\n\r\n const resolvedHasActiveChild =\r\n consumerHasActiveChild ?? defaultHasActiveChild;\r\n\r\n return (\r\n <SidebarBase\r\n links={links}\r\n classMap={styles}\r\n LinkComponent={Link}\r\n isLinkActive={resolvedIsLinkActive}\r\n hasActiveChild={resolvedHasActiveChild}\r\n {...rest}\r\n />\r\n );\r\n};\r\n\r\nSidebar.displayName = \"Sidebar\";\r\nexport default Sidebar;\r\n"],"names":["getDefaultTheme","getDefaultRounding","getDefaultShadow","footerVersion","outline","useState","useRef","useEffect","_a","useMemo","combineClassNames","capitalize","jsx","icon","link","jsxs","Fragment","ChevronDownIcon","usePathname","Link"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
- const Sidebar = require("./Sidebar-DbzIKbwL.cjs");
2
+ const Sidebar = require("./Sidebar-yllRZuSW.cjs");
3
3
  module.exports = Sidebar.Sidebar;
4
4
  //# sourceMappingURL=Sidebar.cjs.js.map
@@ -1,4 +1,4 @@
1
- import { S } from "./Sidebar-HqR8uzt4.js";
1
+ import { S } from "./Sidebar-C8QSoGsE.js";
2
2
  export {
3
3
  S as default
4
4
  };
@@ -53,7 +53,7 @@ const MetricBox = require("./MetricBox-B2-l8cVO.cjs");
53
53
  const EmptyState = require("./EmptyState-DEXnMGP_.cjs");
54
54
  const CommandPalette = require("./CommandPalette-B-qhSIcP.cjs");
55
55
  const NotificationCenter = require("./NotificationCenter-COZtpamq.cjs");
56
- const Sidebar = require("./Sidebar-DbzIKbwL.cjs");
56
+ const Sidebar = require("./Sidebar-yllRZuSW.cjs");
57
57
  const Card = require("./Card-WoaRWnDq.cjs");
58
58
  const Avatar = require("./Avatar-aNqEuazN.cjs");
59
59
  const ChipGroupBase = React.forwardRef(
@@ -52,7 +52,7 @@ import { M as M4 } from "./MetricBox-CKKlOQGM.js";
52
52
  import { E } from "./EmptyState-C9ZcLwdE.js";
53
53
  import { C as C4 } from "./CommandPalette-CLe5dspX.js";
54
54
  import { N as N2 } from "./NotificationCenter-Bo2NcO55.js";
55
- import { S as S7 } from "./Sidebar-HqR8uzt4.js";
55
+ import { S as S7 } from "./Sidebar-C8QSoGsE.js";
56
56
  import { C as C5 } from "./Card-B_J1YknX.js";
57
57
  import { A as A2 } from "./Avatar-D3l1T_H7.js";
58
58
  const ChipGroupBase = forwardRef(