@countermeasure-platform/web-components 1.3.5 → 1.3.6-dev.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/{component-D5sRm1fq.js → component-D_asjmrt.js} +5 -3
  2. package/dist/component-D_asjmrt.js.map +1 -0
  3. package/dist/components/brand/index.d.ts.map +1 -1
  4. package/dist/components/brand/index.js +11 -5
  5. package/dist/components/brand/index.js.map +1 -1
  6. package/dist/components/brand/types.d.ts +2 -0
  7. package/dist/components/brand/types.d.ts.map +1 -1
  8. package/dist/icons/index.d.ts +7 -2
  9. package/dist/icons/index.d.ts.map +1 -1
  10. package/dist/icons/index.js +7 -2
  11. package/dist/icons/index.js.map +1 -1
  12. package/dist/icons/lucide.d.ts +3 -0
  13. package/dist/icons/lucide.d.ts.map +1 -1
  14. package/dist/icons/lucide.js +3 -0
  15. package/dist/icons/lucide.js.map +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +126 -125
  19. package/dist/layout/app-shell.d.ts +7 -0
  20. package/dist/layout/app-shell.d.ts.map +1 -1
  21. package/dist/layout/app-shell.js +24 -6
  22. package/dist/layout/app-shell.js.map +1 -1
  23. package/dist/layout/core-app-chrome.d.ts.map +1 -1
  24. package/dist/layout/core-app-chrome.js +8 -5
  25. package/dist/layout/core-app-chrome.js.map +1 -1
  26. package/dist/layout/core-app-library-dashboard.d.ts +72 -0
  27. package/dist/layout/core-app-library-dashboard.d.ts.map +1 -0
  28. package/dist/layout/core-app-library-dashboard.js +160 -0
  29. package/dist/layout/core-app-library-dashboard.js.map +1 -0
  30. package/dist/layout/index.d.ts +2 -0
  31. package/dist/layout/index.d.ts.map +1 -1
  32. package/dist/layout/index.js +38 -37
  33. package/dist/layout/index.js.map +1 -1
  34. package/dist/react/brand/index.d.ts +3 -1
  35. package/dist/react/brand/index.d.ts.map +1 -1
  36. package/dist/react/brand.js +19 -13
  37. package/dist/react/brand.js.map +1 -1
  38. package/dist/react/layout/core-app-library-dashboard.d.ts +13 -0
  39. package/dist/react/layout/core-app-library-dashboard.d.ts.map +1 -0
  40. package/dist/react/layout/core-app-library-dashboard.js +27 -0
  41. package/dist/react/layout/core-app-library-dashboard.js.map +1 -0
  42. package/dist/react/layout/index.d.ts +1 -0
  43. package/dist/react/layout/index.d.ts.map +1 -1
  44. package/dist/react/layout/index.js +3 -2
  45. package/dist/react/primitives/alert.d.ts +1 -1
  46. package/dist/react/primitives/toast.d.ts +1 -1
  47. package/dist/react/sidebar.js +1 -1
  48. package/dist/react.js +97 -96
  49. package/dist/sidebar/component.d.ts.map +1 -1
  50. package/dist/sidebar/index.js +1 -1
  51. package/dist/sidebar/types.d.ts +7 -0
  52. package/dist/sidebar/types.d.ts.map +1 -1
  53. package/dist/styles/components/brand.css +22 -0
  54. package/dist/styles/layout.css +577 -0
  55. package/dist/styles/sidebar.css +26 -0
  56. package/package.json +11 -1
  57. package/src/components/brand/index.ts +22 -4
  58. package/src/components/brand/types.ts +2 -0
  59. package/src/icons/icons.test.ts +1 -1
  60. package/src/icons/index.ts +7 -2
  61. package/src/icons/lucide.ts +4 -0
  62. package/src/index.ts +2 -0
  63. package/src/layout/app-shell.test.ts +76 -0
  64. package/src/layout/app-shell.ts +38 -7
  65. package/src/layout/core-app-chrome.test.ts +17 -5
  66. package/src/layout/core-app-chrome.ts +8 -3
  67. package/src/layout/core-app-library-dashboard.test.ts +397 -0
  68. package/src/layout/core-app-library-dashboard.ts +519 -0
  69. package/src/layout/index.ts +18 -0
  70. package/src/react/brand/index.test.tsx +10 -0
  71. package/src/react/brand/index.tsx +25 -4
  72. package/src/react/layout/core-app-chrome.test.tsx +2 -2
  73. package/src/react/layout/core-app-library-dashboard.test.tsx +42 -0
  74. package/src/react/layout/core-app-library-dashboard.tsx +56 -0
  75. package/src/react/layout/index.ts +6 -0
  76. package/src/sidebar/component.test.ts +21 -1
  77. package/src/sidebar/component.ts +14 -8
  78. package/src/sidebar/types.ts +7 -0
  79. package/src/styles/components/brand.css +22 -0
  80. package/src/styles/layout.css +577 -0
  81. package/src/styles/sidebar.css +26 -0
  82. package/dist/component-D5sRm1fq.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"component-D5sRm1fq.js","names":[],"sources":["../src/sidebar/component.ts"],"sourcesContent":["/**\n * SidebarComponent - Programmatic sidebar with sections, badges, and footer\n * @countermeasure/web-components/sidebar/component\n *\n * Builds the sidebar DOM from a config object and owns the common app-shell\n * behavior expected by CounterMeasure product surfaces: active route state,\n * persisted collapse, mobile drawer state, keyboard navigation, tenant/scope\n * selection, badges, and footer account chrome.\n */\n\nimport { createBrandLockupElement } from '../components/brand'\nimport { getIconSvgInner, type IconSet } from '../icons/index'\nimport { resolveContainer } from '../primitives/utils'\nimport { setSafeIconHtml } from '../utils/sanitize'\nimport {\n type SidebarBadgeConfig,\n type SidebarBadgeTone,\n type SidebarComponentConfig,\n type SidebarNavItem,\n type SidebarSection,\n} from './types'\n\nconst DEFAULT_MOBILE_BREAKPOINT = 900\nconst FALLBACK_URL_BASE = 'http://localhost/'\n\ninterface NormalizedBadge {\n label: string\n title?: string\n tone: SidebarBadgeTone\n visible: boolean\n dot: boolean\n}\n\nfunction toSidebarVariantClassName(variant: string): string {\n const normalized = variant\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n return `sidebar--${normalized || 'app'}`\n}\n\nfunction toInitials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean)\n\n if (words.length >= 2) {\n return `${words[0]?.charAt(0) ?? ''}${words[words.length - 1]?.charAt(0) ?? ''}`.toUpperCase()\n }\n\n return name.slice(0, 2).toUpperCase()\n}\n\nfunction canUseStorage(): boolean {\n try {\n return typeof window !== 'undefined' && window.localStorage !== undefined\n } catch {\n return false\n }\n}\n\nfunction toPathname(value: string): string {\n try {\n return new URL(value, FALLBACK_URL_BASE).pathname\n } catch {\n return value.split(/[?#]/, 1)[0] ?? value\n }\n}\n\nfunction isMobileViewport(breakpoint: number): boolean {\n return typeof window !== 'undefined' && window.innerWidth <= breakpoint\n}\n\nfunction normalizeBadge(\n badge: number | SidebarBadgeConfig | undefined,\n fallbackTone: SidebarBadgeTone | undefined\n): NormalizedBadge | null {\n if (badge === undefined) {\n return null\n }\n\n if (typeof badge === 'number') {\n return {\n label: badge > 0 ? String(badge) : '',\n tone: fallbackTone ?? 'primary',\n visible: badge > 0,\n dot: badge > 0,\n }\n }\n\n const label = badge.label\n const normalized: NormalizedBadge = {\n label,\n tone: badge.tone ?? fallbackTone ?? 'primary',\n visible: label.length > 0 || badge.dot === true,\n dot: badge.dot ?? label.length > 0,\n }\n if (badge.title !== undefined) {\n normalized.title = badge.title\n }\n return normalized\n}\n\n/** Create an SVG element populated with icon content from the registry. */\nfunction createIconSvg(\n iconSet: IconSet,\n name: string,\n className = 'sidebar__item-icon'\n): SVGElement {\n const svgNs = 'http://www.w3.org/2000/svg'\n const svg = document.createElementNS(svgNs, 'svg')\n svg.setAttribute('xmlns', svgNs)\n svg.setAttribute('width', '16')\n svg.setAttribute('height', '16')\n svg.setAttribute('viewBox', '0 0 24 24')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '2')\n svg.setAttribute('stroke-linecap', 'round')\n svg.setAttribute('stroke-linejoin', 'round')\n svg.classList.add(className)\n svg.setAttribute('data-icon', name)\n svg.setAttribute('aria-hidden', 'true')\n\n const inner = getIconSvgInner(iconSet, name)\n if (inner) {\n setSafeIconHtml(svg, inner)\n }\n\n return svg\n}\n\nfunction appendElements(\n parent: HTMLElement,\n elementOrElements?: HTMLElement | HTMLElement[]\n): void {\n if (elementOrElements === undefined) {\n return\n }\n\n const elements = Array.isArray(elementOrElements) ? elementOrElements : [elementOrElements]\n for (const element of elements) {\n parent.appendChild(element)\n }\n}\n\nexport class SidebarComponent {\n private readonly container: HTMLElement\n private readonly aside: HTMLElement\n private readonly config: SidebarComponentConfig\n private readonly iconSet: IconSet\n private readonly variant: string\n private readonly cleanupFns: (() => void)[] = []\n private collapseButton: HTMLButtonElement | null = null\n private backdrop: HTMLElement | null = null\n\n constructor(config: SidebarComponentConfig) {\n this.config = config\n this.container = resolveContainer(config.container)\n this.iconSet = config.iconSet ?? 'lucide'\n this.variant = config.variant ?? 'app'\n\n this.aside = document.createElement('aside')\n this.aside.classList.add('sidebar', toSidebarVariantClassName(this.variant))\n if (this.variant === 'threat-library' || this.variant === 'cm') {\n this.aside.classList.add('sidebar--product')\n }\n this.aside.setAttribute('data-sidebar', this.variant)\n this.aside.setAttribute('data-open', String(config.open === true))\n this.aside.setAttribute('aria-label', 'Primary navigation')\n\n if (this.resolveInitialCollapsed()) {\n this.aside.classList.add('sidebar--collapsed')\n }\n\n this.render()\n this.container.appendChild(this.aside)\n\n if (config.mobileBackdrop === true) {\n this.renderBackdrop()\n }\n\n this.setupBehavior()\n }\n\n private render(): void {\n if (this.config.collapsible === true) {\n this.renderCollapseButton()\n }\n\n this.renderHeader()\n this.renderScope()\n\n const body = document.createElement('nav')\n body.classList.add('sidebar__body')\n body.setAttribute('aria-label', 'Primary')\n\n appendElements(body, this.config.beforeNav)\n\n for (const section of this.config.sections) {\n body.appendChild(this.buildSection(section))\n }\n\n appendElements(body, this.config.afterNav)\n\n this.aside.appendChild(body)\n this.renderFooter()\n\n if (this.config.activeItemId !== undefined) {\n this.setActive(this.config.activeItemId)\n }\n }\n\n private buildSection(section: SidebarSection): HTMLElement {\n const sectionEl = document.createElement('div')\n sectionEl.classList.add('sidebar__section')\n sectionEl.setAttribute('data-section-id', section.id)\n\n const collapsible = section.collapsible === true\n const expanded = section.defaultExpanded !== false\n\n if (collapsible && section.label) {\n sectionEl.classList.add('sidebar__section--collapsible')\n if (expanded) sectionEl.classList.add('sidebar__section--expanded')\n\n const header = document.createElement('button')\n header.type = 'button'\n header.classList.add('sidebar__group-header')\n header.setAttribute('aria-expanded', String(expanded))\n header.setAttribute('aria-controls', `sidebar-group-${section.id}`)\n\n if (section.icon) {\n header.appendChild(createIconSvg(this.iconSet, section.icon))\n }\n\n const labelSpan = document.createElement('span')\n labelSpan.classList.add('sidebar__group-label')\n labelSpan.textContent = section.label\n header.appendChild(labelSpan)\n\n const chevron = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n chevron.setAttribute('class', 'sidebar__group-chevron')\n chevron.setAttribute('viewBox', '0 0 24 24')\n chevron.setAttribute('width', '14')\n chevron.setAttribute('height', '14')\n chevron.setAttribute('fill', 'none')\n chevron.setAttribute('stroke', 'currentColor')\n chevron.setAttribute('stroke-width', '2')\n chevron.setAttribute('stroke-linecap', 'round')\n chevron.setAttribute('stroke-linejoin', 'round')\n chevron.setAttribute('aria-hidden', 'true')\n const chevronPath = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n chevronPath.setAttribute('d', 'm6 9 6 6 6-6')\n chevron.appendChild(chevronPath)\n header.appendChild(chevron)\n\n header.addEventListener('click', () => {\n const nowExpanded = sectionEl.classList.toggle('sidebar__section--expanded')\n header.setAttribute('aria-expanded', String(nowExpanded))\n })\n\n sectionEl.appendChild(header)\n } else if (section.label) {\n const labelEl = document.createElement('div')\n labelEl.classList.add('sidebar__section-label')\n labelEl.textContent = section.label\n sectionEl.appendChild(labelEl)\n }\n\n const itemsWrap = document.createElement('div')\n itemsWrap.classList.add('sidebar__items')\n itemsWrap.id = `sidebar-group-${section.id}`\n\n for (const item of section.items) {\n itemsWrap.appendChild(this.buildItem(item))\n }\n\n sectionEl.appendChild(itemsWrap)\n return sectionEl\n }\n\n private buildItem(item: SidebarNavItem): HTMLElement {\n const disabled = item.disabled === true\n const element =\n item.href !== undefined && !disabled\n ? document.createElement('a')\n : disabled\n ? document.createElement('span')\n : document.createElement('button')\n\n element.classList.add('sidebar__item')\n element.setAttribute('data-item-id', item.id)\n element.setAttribute('data-nav-item', '')\n element.setAttribute('title', item.tooltip ?? item.label)\n\n if (item.ariaLabel !== undefined) {\n element.setAttribute('aria-label', item.ariaLabel)\n }\n\n if (disabled) {\n element.setAttribute('aria-disabled', 'true')\n element.setAttribute('role', 'link')\n element.setAttribute('tabindex', '-1')\n element.classList.add('sidebar__item--disabled')\n } else if (element instanceof HTMLAnchorElement) {\n element.href = item.href ?? '#'\n if (item.target !== undefined) {\n element.target = item.target\n }\n if (item.rel !== undefined) {\n element.rel = item.rel\n } else if (item.target === '_blank') {\n element.rel = 'noreferrer noopener'\n }\n } else if (element instanceof HTMLButtonElement) {\n element.type = 'button'\n }\n\n if (this.isItemActive(item)) {\n element.classList.add('sidebar__item--active')\n element.setAttribute('aria-current', 'page')\n }\n\n if (item.icon) {\n element.appendChild(createIconSvg(this.iconSet, item.icon))\n }\n\n const label = document.createElement('span')\n label.classList.add('sidebar__item-label')\n label.textContent = item.label\n element.appendChild(label)\n\n if (item.tag !== undefined) {\n const tag = document.createElement('span')\n tag.classList.add('sidebar__tag')\n tag.textContent = item.tag\n element.appendChild(tag)\n }\n\n const badge = normalizeBadge(item.badge, item.badgeTone)\n if (badge?.visible === true) {\n this.applyBadge(element, item.id, badge)\n }\n\n if (!disabled) {\n element.addEventListener('click', event => {\n this.config.onNavigate?.(item)\n item.onClick?.(event)\n\n if (this.config.closeOnNavigate !== false && this.isOpen()) {\n this.setOpen(false)\n }\n })\n }\n\n return element\n }\n\n private renderHeader(): void {\n const brand = this.config.brand\n if (brand === undefined) {\n return\n }\n\n const header = document.createElement('div')\n header.classList.add('sidebar__header')\n\n const row = document.createElement('div')\n row.classList.add('sidebar__header-row')\n\n const brandEl =\n brand.href !== undefined\n ? document.createElement('a')\n : brand.onClick !== undefined\n ? document.createElement('button')\n : document.createElement('span')\n\n brandEl.classList.add('sidebar__brand')\n\n if (brandEl instanceof HTMLAnchorElement) {\n brandEl.href = brand.href ?? '#'\n brandEl.setAttribute('aria-label', brand.label ?? 'CounterMeasure')\n }\n\n if (brandEl instanceof HTMLButtonElement) {\n brandEl.type = 'button'\n brandEl.setAttribute('aria-label', brand.label ?? 'CounterMeasure')\n }\n\n if (brand.onClick !== undefined) {\n brandEl.addEventListener('click', brand.onClick)\n }\n\n brandEl.appendChild(\n createBrandLockupElement({\n label: brand.label ?? 'CounterMeasure',\n markSize: brand.markSize ?? 22,\n showWordmark: brand.showWordmark ?? true,\n decorative: brand.decorative ?? false,\n })\n )\n\n row.appendChild(brandEl)\n header.appendChild(row)\n this.aside.appendChild(header)\n }\n\n private renderScope(): void {\n const scope = this.config.scope\n if (scope === undefined || scope.options.length === 0) {\n return\n }\n\n const activeOption =\n scope.options.find(option => option.id === scope.value) ?? scope.options[0] ?? null\n const root = document.createElement('div')\n root.classList.add('sidebar__scope')\n\n const trigger = document.createElement('button')\n trigger.type = 'button'\n trigger.classList.add('sidebar__scope-trigger')\n trigger.setAttribute('aria-haspopup', 'listbox')\n trigger.setAttribute('aria-expanded', 'false')\n trigger.setAttribute('title', activeOption?.label ?? scope.placeholder ?? 'Select scope')\n\n if (scope.icon !== undefined) {\n trigger.appendChild(createIconSvg(this.iconSet, scope.icon, 'sidebar__scope-icon'))\n }\n\n const copy = document.createElement('span')\n copy.classList.add('sidebar__scope-copy')\n\n if (scope.label !== undefined) {\n const eyebrow = document.createElement('span')\n eyebrow.classList.add('sidebar__scope-label')\n eyebrow.textContent = scope.label\n copy.appendChild(eyebrow)\n }\n\n const current = document.createElement('span')\n current.classList.add('sidebar__scope-current')\n current.textContent = activeOption?.label ?? scope.placeholder ?? 'Select scope'\n copy.appendChild(current)\n trigger.appendChild(copy)\n\n const chevron = createIconSvg(this.iconSet, 'chevron-down', 'sidebar__scope-chevron')\n trigger.appendChild(chevron)\n\n const menu = document.createElement('div')\n menu.classList.add('sidebar__scope-menu')\n menu.setAttribute('role', 'listbox')\n menu.hidden = true\n\n const setOpen = (open: boolean): void => {\n trigger.setAttribute('aria-expanded', String(open))\n menu.hidden = !open\n }\n\n for (const option of scope.options) {\n const optionButton = document.createElement('button')\n optionButton.type = 'button'\n optionButton.classList.add('sidebar__scope-option')\n optionButton.setAttribute('role', 'option')\n optionButton.setAttribute('data-option-id', option.id)\n optionButton.setAttribute('aria-selected', String(option.id === activeOption?.id))\n\n if (option.disabled === true) {\n optionButton.disabled = true\n }\n\n if (option.status !== undefined) {\n const dot = document.createElement('span')\n dot.classList.add('sidebar__scope-dot', `sidebar__scope-dot--${option.status}`)\n optionButton.appendChild(dot)\n }\n\n const label = document.createElement('span')\n label.classList.add('sidebar__scope-option-label')\n label.textContent = option.label\n optionButton.appendChild(label)\n\n const check = createIconSvg(this.iconSet, 'check', 'sidebar__scope-check')\n optionButton.appendChild(check)\n\n optionButton.addEventListener('click', () => {\n current.textContent = option.label\n trigger.setAttribute('title', option.label)\n menu.querySelectorAll<HTMLElement>('[role=\"option\"]').forEach(item => {\n item.setAttribute(\n 'aria-selected',\n String(item.getAttribute('data-option-id') === option.id)\n )\n })\n setOpen(false)\n scope.onChange?.(option)\n })\n\n menu.appendChild(optionButton)\n }\n\n trigger.addEventListener('click', () => {\n setOpen(menu.hidden === true)\n })\n\n const closeOnOutsidePointer = (event: PointerEvent): void => {\n if (!root.contains(event.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener('pointerdown', closeOnOutsidePointer)\n this.cleanupFns.push(() => {\n document.removeEventListener('pointerdown', closeOnOutsidePointer)\n })\n\n root.appendChild(trigger)\n root.appendChild(menu)\n this.aside.appendChild(root)\n }\n\n private renderCollapseButton(): void {\n const button = document.createElement('button')\n button.type = 'button'\n button.classList.add('sidebar__collapse-btn', 'sidebar__collapse-btn--edge')\n button.setAttribute('data-sidebar-toggle', '')\n\n if (this.config.collapseButtonVisible === true) {\n button.setAttribute('data-visible', 'true')\n }\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('aria-hidden', 'true')\n svg.setAttribute('viewBox', '0 0 24 24')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '2')\n svg.setAttribute('stroke-linecap', 'round')\n svg.setAttribute('stroke-linejoin', 'round')\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n svg.appendChild(path)\n button.appendChild(svg)\n\n button.addEventListener('click', () => {\n this.toggleCollapse()\n })\n\n this.collapseButton = button\n this.updateCollapseButton()\n this.aside.appendChild(button)\n }\n\n private renderFooter(): void {\n const hasUser = this.config.user !== undefined\n const hasActions =\n this.config.footerActions !== undefined && this.config.footerActions.length > 0\n\n if (!hasUser && !hasActions) {\n return\n }\n\n const footer = document.createElement('div')\n footer.classList.add('sidebar__footer')\n\n const footerBar = document.createElement('div')\n footerBar.classList.add('sidebar__footer-bar')\n\n if (hasUser && this.config.user) {\n const user = this.config.user\n const userEl =\n user.onClick !== undefined\n ? document.createElement('button')\n : document.createElement('span')\n userEl.classList.add('sidebar__user-trigger', 'sidebar__footer-user')\n\n const userClick = user.onClick\n if (userEl instanceof HTMLButtonElement && userClick !== undefined) {\n userEl.type = 'button'\n userEl.setAttribute('aria-label', user.label ?? `User menu for ${user.name}`)\n userEl.addEventListener('click', userClick)\n }\n\n const avatar = document.createElement('span')\n avatar.classList.add('sidebar__avatar', 'sidebar__footer-avatar')\n\n if (user.avatarUrl !== undefined) {\n const image = document.createElement('img')\n image.src = user.avatarUrl\n image.alt = ''\n avatar.appendChild(image)\n } else {\n avatar.textContent = user.initials ?? toInitials(user.name)\n }\n\n if (user.presence !== undefined && user.presence !== 'offline') {\n const presence = document.createElement('span')\n presence.classList.add('sidebar__presence', `sidebar__presence--${user.presence}`)\n presence.setAttribute('aria-hidden', 'true')\n avatar.appendChild(presence)\n }\n\n const details = document.createElement('span')\n details.classList.add('sidebar__user-details')\n\n const nameSpan = document.createElement('span')\n nameSpan.classList.add('sidebar__user-name', 'sidebar__footer-name')\n nameSpan.textContent = user.name\n details.appendChild(nameSpan)\n\n if (user.detail !== undefined) {\n const detail = document.createElement('span')\n detail.classList.add('sidebar__user-status')\n detail.textContent = user.detail\n details.appendChild(detail)\n }\n\n userEl.appendChild(avatar)\n userEl.appendChild(details)\n footerBar.appendChild(userEl)\n }\n\n if (hasActions && this.config.footerActions) {\n const iconsSpan = document.createElement('span')\n iconsSpan.classList.add('sidebar__footer-icons')\n\n for (const action of this.config.footerActions) {\n const button = document.createElement('button')\n button.type = 'button'\n button.classList.add('sidebar__footer-icon')\n if (action.danger === true) {\n button.classList.add('sidebar__footer-icon--danger')\n }\n button.setAttribute('aria-label', action.label)\n button.setAttribute('title', action.label)\n\n const icon = createIconSvg(this.iconSet, action.icon)\n button.appendChild(icon)\n\n if (action.onClick) {\n const handler = action.onClick\n button.addEventListener('click', () => {\n handler()\n })\n }\n\n iconsSpan.appendChild(button)\n }\n\n footerBar.appendChild(iconsSpan)\n }\n\n footer.appendChild(footerBar)\n this.aside.appendChild(footer)\n }\n\n private renderBackdrop(): void {\n const backdrop = document.createElement('button')\n backdrop.type = 'button'\n backdrop.classList.add('sidebar__backdrop')\n backdrop.setAttribute('data-sidebar-backdrop', this.variant)\n backdrop.setAttribute('data-visible', String(this.isOpen()))\n backdrop.setAttribute('aria-label', 'Close sidebar')\n backdrop.addEventListener('click', () => {\n this.setOpen(false)\n })\n this.backdrop = backdrop\n this.container.appendChild(backdrop)\n }\n\n private setupBehavior(): void {\n this.setupKeyboardNavigation()\n this.setupMobileToggles()\n\n const handleEscape = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n if (this.isOpen()) {\n this.setOpen(false)\n }\n this.closeScopeMenus()\n }\n }\n document.addEventListener('keydown', handleEscape)\n this.cleanupFns.push(() => {\n document.removeEventListener('keydown', handleEscape)\n })\n\n const handleResize = (): void => {\n if (isMobileViewport(this.getMobileBreakpoint())) {\n this.setOpen(false)\n }\n }\n window.addEventListener('resize', handleResize)\n this.cleanupFns.push(() => {\n window.removeEventListener('resize', handleResize)\n })\n }\n\n private setupKeyboardNavigation(): void {\n const handler = (event: KeyboardEvent): void => {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return\n\n const items = Array.from(\n this.aside.querySelectorAll<HTMLElement>('[data-nav-item]:not([aria-disabled=\"true\"])')\n ).filter(item => !item.hidden && item.offsetParent !== null)\n\n if (items.length === 0) return\n\n const currentIndex = items.indexOf(document.activeElement as HTMLElement)\n if (currentIndex === -1) return\n\n event.preventDefault()\n const nextIndex =\n event.key === 'ArrowDown'\n ? (currentIndex + 1) % items.length\n : (currentIndex - 1 + items.length) % items.length\n items[nextIndex]?.focus()\n }\n\n this.aside.addEventListener('keydown', handler)\n this.cleanupFns.push(() => {\n this.aside.removeEventListener('keydown', handler)\n })\n }\n\n private setupMobileToggles(): void {\n const toggles = Array.from(\n document.querySelectorAll<HTMLButtonElement>('[data-sidebar-mobile-toggle]')\n ).filter(toggle => {\n const target = toggle.getAttribute('data-sidebar-mobile-toggle')\n return target === null || target === '' || target === this.variant\n })\n\n for (const toggle of toggles) {\n const handler = (): void => {\n this.setOpen(!this.isOpen())\n }\n toggle.addEventListener('click', handler)\n this.cleanupFns.push(() => {\n toggle.removeEventListener('click', handler)\n })\n }\n }\n\n /** Mark a nav item as active, removing active state from all others. */\n setActive(itemId: string): void {\n this.config.activeItemId = itemId\n this.aside.querySelectorAll<HTMLElement>('.sidebar__item').forEach(el => {\n el.classList.remove('sidebar__item--active')\n el.removeAttribute('aria-current')\n })\n\n const target = Array.from(this.aside.querySelectorAll<HTMLElement>('[data-item-id]')).find(\n item => item.getAttribute('data-item-id') === itemId\n )\n if (target) {\n target.classList.add('sidebar__item--active')\n target.setAttribute('aria-current', 'page')\n }\n }\n\n /** Recompute active route state from a supplied pathname or the current location. */\n setPathname(pathname: string | undefined): void {\n if (pathname === undefined) {\n delete this.config.pathname\n } else {\n this.config.pathname = pathname\n }\n delete this.config.activeItemId\n this.syncActiveRouteState()\n }\n\n /** Update the badge count for a nav item (empty string when count is 0). */\n updateBadge(itemId: string, count: number, tone?: SidebarBadgeTone): void {\n const item = Array.from(this.aside.querySelectorAll<HTMLElement>('[data-item-id]')).find(\n element => element.getAttribute('data-item-id') === itemId\n )\n\n if (!item) {\n return\n }\n\n this.applyBadge(\n item,\n itemId,\n normalizeBadge(\n count,\n tone ?? (item.getAttribute('data-badge-tone') as SidebarBadgeTone | null) ?? undefined\n )\n )\n }\n\n /** Toggle the sidebar between collapsed and expanded states. */\n toggleCollapse(): void {\n this.setCollapsed(!this.isCollapsed())\n }\n\n /** Collapse the sidebar. */\n collapse(): void {\n this.setCollapsed(true)\n }\n\n /** Expand the sidebar. */\n expand(): void {\n this.setCollapsed(false)\n }\n\n /** Set the mobile open state reflected by the shared CSS contract. */\n setOpen(open: boolean): void {\n const wasOpen = this.isOpen()\n this.aside.setAttribute('data-open', String(open))\n this.backdrop?.setAttribute('data-visible', String(open))\n\n if (wasOpen !== open) {\n this.config.onOpenChange?.(open)\n }\n }\n\n /** Remove the sidebar from the DOM. */\n destroy(): void {\n for (const cleanup of this.cleanupFns.splice(0)) {\n cleanup()\n }\n this.backdrop?.remove()\n this.aside.remove()\n }\n\n private applyBadge(item: HTMLElement, itemId: string, badge: NormalizedBadge | null): void {\n if (badge === null) {\n return\n }\n\n let badgeEl = item.querySelector<HTMLElement>(`[data-badge=\"${itemId}\"]`)\n if (badgeEl === null) {\n badgeEl = document.createElement('span')\n badgeEl.classList.add('sidebar__badge')\n badgeEl.setAttribute('data-badge', itemId)\n item.appendChild(badgeEl)\n }\n\n badgeEl.className = `sidebar__badge sidebar__badge--${badge.tone}`\n badgeEl.textContent = badge.label\n if (badge.title !== undefined) {\n badgeEl.setAttribute('title', badge.title)\n } else {\n badgeEl.removeAttribute('title')\n }\n\n item.setAttribute('data-badge-visible', String(badge.visible))\n item.setAttribute('data-badge-dot', String(badge.dot))\n item.setAttribute('data-badge-tone', badge.tone)\n }\n\n private setCollapsed(collapsed: boolean): void {\n const wasCollapsed = this.isCollapsed()\n this.aside.classList.toggle('sidebar--collapsed', collapsed)\n this.persistCollapsed(collapsed)\n this.updateCollapseButton()\n\n if (wasCollapsed !== collapsed) {\n this.config.onCollapse?.(collapsed)\n }\n }\n\n private isCollapsed(): boolean {\n return this.aside.classList.contains('sidebar--collapsed')\n }\n\n private isOpen(): boolean {\n return this.aside.getAttribute('data-open') === 'true'\n }\n\n private getMobileBreakpoint(): number {\n return this.config.mobileBreakpoint ?? DEFAULT_MOBILE_BREAKPOINT\n }\n\n private resolveInitialCollapsed(): boolean {\n if (this.config.storageKey && this.config.persistCollapsed !== false && canUseStorage()) {\n try {\n if (!isMobileViewport(this.getMobileBreakpoint())) {\n return window.localStorage.getItem(this.config.storageKey) === 'true'\n }\n } catch {\n return this.config.collapsed === true\n }\n }\n\n return this.config.collapsed === true\n }\n\n private persistCollapsed(collapsed: boolean): void {\n if (!this.config.storageKey || this.config.persistCollapsed === false || !canUseStorage()) {\n return\n }\n\n try {\n window.localStorage.setItem(this.config.storageKey, String(collapsed))\n } catch {\n // Collapse state remains applied in memory when storage is unavailable.\n }\n }\n\n private getCurrentPathname(): string | null {\n if (this.config.pathname !== undefined) {\n return toPathname(this.config.pathname)\n }\n\n if (typeof window === 'undefined') {\n return null\n }\n\n return window.location.pathname\n }\n\n private isItemActive(item: SidebarNavItem): boolean {\n if (item.active === true || item.id === this.config.activeItemId) {\n return true\n }\n\n const pathname = this.getCurrentPathname()\n if (pathname === null) {\n return false\n }\n\n const matcher = item.activeMatch\n\n if (typeof matcher === 'function') {\n return matcher(pathname, item)\n }\n\n if (matcher instanceof RegExp) {\n return matcher.test(pathname)\n }\n\n if (typeof matcher === 'string' && matcher !== 'exact' && matcher !== 'prefix') {\n return pathname === matcher || pathname.startsWith(`${matcher.replace(/\\/$/, '')}/`)\n }\n\n if (item.href === undefined) {\n return false\n }\n\n try {\n const baseUrl = typeof window === 'undefined' ? FALLBACK_URL_BASE : window.location.href\n const hrefPathname = new URL(item.href, baseUrl).pathname\n if (matcher === 'exact' || item.end === true) {\n return pathname === hrefPathname\n }\n return pathname === hrefPathname || pathname.startsWith(`${hrefPathname.replace(/\\/$/, '')}/`)\n } catch {\n return false\n }\n }\n\n private syncActiveRouteState(): void {\n this.aside.querySelectorAll<HTMLElement>('.sidebar__item').forEach(el => {\n el.classList.remove('sidebar__item--active')\n el.removeAttribute('aria-current')\n })\n\n const active = Array.from(this.aside.querySelectorAll<HTMLElement>('[data-item-id]')).find(\n element => {\n const itemId = element.getAttribute('data-item-id')\n const item = this.config.sections\n .flatMap(section => section.items)\n .find(candidate => candidate.id === itemId)\n return item === undefined ? false : this.isItemActive(item)\n }\n )\n\n if (active !== undefined) {\n active.classList.add('sidebar__item--active')\n active.setAttribute('aria-current', 'page')\n }\n }\n\n private closeScopeMenus(): void {\n this.aside.querySelectorAll<HTMLElement>('.sidebar__scope-menu').forEach(menu => {\n menu.hidden = true\n })\n this.aside.querySelectorAll<HTMLElement>('.sidebar__scope-trigger').forEach(trigger => {\n trigger.setAttribute('aria-expanded', 'false')\n })\n }\n\n private updateCollapseButton(): void {\n if (this.collapseButton === null) {\n return\n }\n\n const isCollapsed = this.isCollapsed()\n const label = isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'\n this.collapseButton.setAttribute('aria-label', label)\n this.collapseButton.setAttribute('aria-expanded', String(!isCollapsed))\n this.collapseButton.setAttribute('title', label)\n this.collapseButton.setAttribute('data-collapsed', String(isCollapsed))\n this.collapseButton\n .querySelector('path')\n ?.setAttribute('d', isCollapsed ? 'm9 18 6-6-6-6' : 'm15 18-6-6 6-6')\n }\n}\n"],"mappings":"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"}