boreal-ui 0.0.69 → 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.
@@ -267,9 +267,13 @@ const isActiveRecursive = (link, matcher) => {
267
267
  if (matcher(link)) return true;
268
268
  return !!((_a = link.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, matcher)));
269
269
  };
270
- const Sidebar = (props) => {
270
+ const Sidebar = ({
271
+ isLinkActive: consumerIsLinkActive,
272
+ hasActiveChild: consumerHasActiveChild,
273
+ ...props
274
+ }) => {
271
275
  const [pathname] = React.useState(getInitialPath);
272
- const isLinkActive = (link) => {
276
+ const defaultIsLinkActive = (link) => {
273
277
  var _a;
274
278
  if (!link.href) return false;
275
279
  if ((_a = link.children) == null ? void 0 : _a.length) {
@@ -277,20 +281,24 @@ const Sidebar = (props) => {
277
281
  }
278
282
  return normalizePath(link.href) === normalizePath(pathname);
279
283
  };
280
- const hasActiveChild = (link) => {
284
+ const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;
285
+ const defaultHasActiveChild = (link) => {
281
286
  var _a;
282
- 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
+ ));
283
290
  };
291
+ const resolvedHasActiveChild = consumerHasActiveChild ?? defaultHasActiveChild;
284
292
  return /* @__PURE__ */ jsxRuntime.jsx(
285
293
  SidebarBase,
286
294
  {
287
295
  ...props,
288
296
  classMap: classes,
289
- isLinkActive,
290
- hasActiveChild
297
+ isLinkActive: resolvedIsLinkActive,
298
+ hasActiveChild: resolvedHasActiveChild
291
299
  }
292
300
  );
293
301
  };
294
302
  Sidebar.displayName = "Sidebar";
295
303
  exports.Sidebar = Sidebar;
296
- //# sourceMappingURL=Sidebar-BbXkPcQP.cjs.map
304
+ //# sourceMappingURL=Sidebar-BMvvoT9j.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar-BbXkPcQP.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> = (props) => {\r\n const [pathname] = useState(getInitialPath);\r\n\r\n const isLinkActive = (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 hasActiveChild = (link: SidebarLink): boolean =>\r\n !!link.children?.some((child) => isActiveRecursive(child, isLinkActive));\r\n\r\n return (\r\n <SidebarBase\r\n {...props}\r\n classMap={classes}\r\n isLinkActive={isLinkActive}\r\n hasActiveChild={hasActiveChild}\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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"}
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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"}
@@ -266,9 +266,13 @@ const isActiveRecursive = (link, matcher) => {
266
266
  if (matcher(link)) return true;
267
267
  return !!((_a = link.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, matcher)));
268
268
  };
269
- const Sidebar = (props) => {
269
+ const Sidebar = ({
270
+ isLinkActive: consumerIsLinkActive,
271
+ hasActiveChild: consumerHasActiveChild,
272
+ ...props
273
+ }) => {
270
274
  const [pathname] = useState(getInitialPath);
271
- const isLinkActive = (link) => {
275
+ const defaultIsLinkActive = (link) => {
272
276
  var _a;
273
277
  if (!link.href) return false;
274
278
  if ((_a = link.children) == null ? void 0 : _a.length) {
@@ -276,17 +280,21 @@ const Sidebar = (props) => {
276
280
  }
277
281
  return normalizePath(link.href) === normalizePath(pathname);
278
282
  };
279
- const hasActiveChild = (link) => {
283
+ const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;
284
+ const defaultHasActiveChild = (link) => {
280
285
  var _a;
281
- 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
+ ));
282
289
  };
290
+ const resolvedHasActiveChild = consumerHasActiveChild ?? defaultHasActiveChild;
283
291
  return /* @__PURE__ */ jsx(
284
292
  SidebarBase,
285
293
  {
286
294
  ...props,
287
295
  classMap: classes,
288
- isLinkActive,
289
- hasActiveChild
296
+ isLinkActive: resolvedIsLinkActive,
297
+ hasActiveChild: resolvedHasActiveChild
290
298
  }
291
299
  );
292
300
  };
@@ -294,4 +302,4 @@ Sidebar.displayName = "Sidebar";
294
302
  export {
295
303
  Sidebar as S
296
304
  };
297
- //# sourceMappingURL=Sidebar-C7y6lVhN.js.map
305
+ //# sourceMappingURL=Sidebar-PLVBm7te.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar-C7y6lVhN.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> = (props) => {\r\n const [pathname] = useState(getInitialPath);\r\n\r\n const isLinkActive = (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 hasActiveChild = (link: SidebarLink): boolean =>\r\n !!link.children?.some((child) => isActiveRecursive(child, isLinkActive));\r\n\r\n return (\r\n <SidebarBase\r\n {...props}\r\n classMap={classes}\r\n isLinkActive={isLinkActive}\r\n hasActiveChild={hasActiveChild}\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
+ {"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-BbXkPcQP.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-C7y6lVhN.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-BbXkPcQP.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-C7y6lVhN.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(
@@ -301,9 +301,14 @@ const isActiveRecursive = (link2, matcher) => {
301
301
  if (matcher(link2)) return true;
302
302
  return !!((_a = link2.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, matcher)));
303
303
  };
304
- const Sidebar = ({ links, ...rest }) => {
304
+ const Sidebar = ({
305
+ links,
306
+ isLinkActive: consumerIsLinkActive,
307
+ hasActiveChild: consumerHasActiveChild,
308
+ ...rest
309
+ }) => {
305
310
  const pathname = navigationExports.usePathname() || "/";
306
- const isLinkActive = (link2) => {
311
+ const defaultIsLinkActive = (link2) => {
307
312
  var _a;
308
313
  if (!link2.href) return false;
309
314
  if ((_a = link2.children) == null ? void 0 : _a.length) {
@@ -311,18 +316,22 @@ const Sidebar = ({ links, ...rest }) => {
311
316
  }
312
317
  return normalizePath(link2.href) === normalizePath(pathname);
313
318
  };
314
- const hasActiveChild = (link2) => {
319
+ const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;
320
+ const defaultHasActiveChild = (link2) => {
315
321
  var _a;
316
- 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
+ ));
317
325
  };
326
+ const resolvedHasActiveChild = consumerHasActiveChild ?? defaultHasActiveChild;
318
327
  return /* @__PURE__ */ jsx(
319
328
  SidebarBase,
320
329
  {
321
330
  links,
322
331
  classMap: styles,
323
332
  LinkComponent: Link,
324
- isLinkActive,
325
- hasActiveChild,
333
+ isLinkActive: resolvedIsLinkActive,
334
+ hasActiveChild: resolvedHasActiveChild,
326
335
  ...rest
327
336
  }
328
337
  );
@@ -331,4 +340,4 @@ Sidebar.displayName = "Sidebar";
331
340
  export {
332
341
  Sidebar as S
333
342
  };
334
- //# sourceMappingURL=Sidebar-B9myM8yG.js.map
343
+ //# sourceMappingURL=Sidebar-C8QSoGsE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar-B9myM8yG.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> = ({ links, ...rest }) => {\r\n const pathname = usePathname() || \"/\";\r\n\r\n const isLinkActive = (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 hasActiveChild = (link: SidebarLink): boolean =>\r\n !!link.children?.some((child) => isActiveRecursive(child, isLinkActive));\r\n\r\n return (\r\n <SidebarBase\r\n links={links}\r\n classMap={styles}\r\n LinkComponent={Link}\r\n isLinkActive={isLinkActive}\r\n hasActiveChild={hasActiveChild}\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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"}
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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"}
@@ -302,9 +302,14 @@ const isActiveRecursive = (link2, matcher) => {
302
302
  if (matcher(link2)) return true;
303
303
  return !!((_a = link2.children) == null ? void 0 : _a.some((child) => isActiveRecursive(child, matcher)));
304
304
  };
305
- const Sidebar = ({ links, ...rest }) => {
305
+ const Sidebar = ({
306
+ links,
307
+ isLinkActive: consumerIsLinkActive,
308
+ hasActiveChild: consumerHasActiveChild,
309
+ ...rest
310
+ }) => {
306
311
  const pathname = navigation.navigationExports.usePathname() || "/";
307
- const isLinkActive = (link2) => {
312
+ const defaultIsLinkActive = (link2) => {
308
313
  var _a;
309
314
  if (!link2.href) return false;
310
315
  if ((_a = link2.children) == null ? void 0 : _a.length) {
@@ -312,22 +317,26 @@ const Sidebar = ({ links, ...rest }) => {
312
317
  }
313
318
  return normalizePath(link2.href) === normalizePath(pathname);
314
319
  };
315
- const hasActiveChild = (link2) => {
320
+ const resolvedIsLinkActive = consumerIsLinkActive ?? defaultIsLinkActive;
321
+ const defaultHasActiveChild = (link2) => {
316
322
  var _a;
317
- 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
+ ));
318
326
  };
327
+ const resolvedHasActiveChild = consumerHasActiveChild ?? defaultHasActiveChild;
319
328
  return /* @__PURE__ */ require$$2.jsx(
320
329
  SidebarBase,
321
330
  {
322
331
  links,
323
332
  classMap: styles,
324
333
  LinkComponent: link$1.Link,
325
- isLinkActive,
326
- hasActiveChild,
334
+ isLinkActive: resolvedIsLinkActive,
335
+ hasActiveChild: resolvedHasActiveChild,
327
336
  ...rest
328
337
  }
329
338
  );
330
339
  };
331
340
  Sidebar.displayName = "Sidebar";
332
341
  exports.Sidebar = Sidebar;
333
- //# sourceMappingURL=Sidebar-CNKyWz1w.cjs.map
342
+ //# sourceMappingURL=Sidebar-yllRZuSW.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar-CNKyWz1w.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> = ({ links, ...rest }) => {\r\n const pathname = usePathname() || \"/\";\r\n\r\n const isLinkActive = (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 hasActiveChild = (link: SidebarLink): boolean =>\r\n !!link.children?.some((child) => isActiveRecursive(child, isLinkActive));\r\n\r\n return (\r\n <SidebarBase\r\n links={links}\r\n classMap={styles}\r\n LinkComponent={Link}\r\n isLinkActive={isLinkActive}\r\n hasActiveChild={hasActiveChild}\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
+ {"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-CNKyWz1w.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-B9myM8yG.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-CNKyWz1w.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-B9myM8yG.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(