@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.
- package/dist/{component-D5sRm1fq.js → component-D_asjmrt.js} +5 -3
- package/dist/component-D_asjmrt.js.map +1 -0
- package/dist/components/brand/index.d.ts.map +1 -1
- package/dist/components/brand/index.js +11 -5
- package/dist/components/brand/index.js.map +1 -1
- package/dist/components/brand/types.d.ts +2 -0
- package/dist/components/brand/types.d.ts.map +1 -1
- package/dist/icons/index.d.ts +7 -2
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/index.js +7 -2
- package/dist/icons/index.js.map +1 -1
- package/dist/icons/lucide.d.ts +3 -0
- package/dist/icons/lucide.d.ts.map +1 -1
- package/dist/icons/lucide.js +3 -0
- package/dist/icons/lucide.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +126 -125
- package/dist/layout/app-shell.d.ts +7 -0
- package/dist/layout/app-shell.d.ts.map +1 -1
- package/dist/layout/app-shell.js +24 -6
- package/dist/layout/app-shell.js.map +1 -1
- package/dist/layout/core-app-chrome.d.ts.map +1 -1
- package/dist/layout/core-app-chrome.js +8 -5
- package/dist/layout/core-app-chrome.js.map +1 -1
- package/dist/layout/core-app-library-dashboard.d.ts +72 -0
- package/dist/layout/core-app-library-dashboard.d.ts.map +1 -0
- package/dist/layout/core-app-library-dashboard.js +160 -0
- package/dist/layout/core-app-library-dashboard.js.map +1 -0
- package/dist/layout/index.d.ts +2 -0
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +38 -37
- package/dist/layout/index.js.map +1 -1
- package/dist/react/brand/index.d.ts +3 -1
- package/dist/react/brand/index.d.ts.map +1 -1
- package/dist/react/brand.js +19 -13
- package/dist/react/brand.js.map +1 -1
- package/dist/react/layout/core-app-library-dashboard.d.ts +13 -0
- package/dist/react/layout/core-app-library-dashboard.d.ts.map +1 -0
- package/dist/react/layout/core-app-library-dashboard.js +27 -0
- package/dist/react/layout/core-app-library-dashboard.js.map +1 -0
- package/dist/react/layout/index.d.ts +1 -0
- package/dist/react/layout/index.d.ts.map +1 -1
- package/dist/react/layout/index.js +3 -2
- package/dist/react/primitives/alert.d.ts +1 -1
- package/dist/react/primitives/toast.d.ts +1 -1
- package/dist/react/sidebar.js +1 -1
- package/dist/react.js +97 -96
- package/dist/sidebar/component.d.ts.map +1 -1
- package/dist/sidebar/index.js +1 -1
- package/dist/sidebar/types.d.ts +7 -0
- package/dist/sidebar/types.d.ts.map +1 -1
- package/dist/styles/components/brand.css +22 -0
- package/dist/styles/layout.css +577 -0
- package/dist/styles/sidebar.css +26 -0
- package/package.json +11 -1
- package/src/components/brand/index.ts +22 -4
- package/src/components/brand/types.ts +2 -0
- package/src/icons/icons.test.ts +1 -1
- package/src/icons/index.ts +7 -2
- package/src/icons/lucide.ts +4 -0
- package/src/index.ts +2 -0
- package/src/layout/app-shell.test.ts +76 -0
- package/src/layout/app-shell.ts +38 -7
- package/src/layout/core-app-chrome.test.ts +17 -5
- package/src/layout/core-app-chrome.ts +8 -3
- package/src/layout/core-app-library-dashboard.test.ts +397 -0
- package/src/layout/core-app-library-dashboard.ts +519 -0
- package/src/layout/index.ts +18 -0
- package/src/react/brand/index.test.tsx +10 -0
- package/src/react/brand/index.tsx +25 -4
- package/src/react/layout/core-app-chrome.test.tsx +2 -2
- package/src/react/layout/core-app-library-dashboard.test.tsx +42 -0
- package/src/react/layout/core-app-library-dashboard.tsx +56 -0
- package/src/react/layout/index.ts +6 -0
- package/src/sidebar/component.test.ts +21 -1
- package/src/sidebar/component.ts +14 -8
- package/src/sidebar/types.ts +7 -0
- package/src/styles/components/brand.css +22 -0
- package/src/styles/layout.css +577 -0
- package/src/styles/sidebar.css +26 -0
- package/dist/component-D5sRm1fq.js.map +0 -1
|
@@ -121,12 +121,14 @@ var m = class {
|
|
|
121
121
|
let n = document.createElement("div");
|
|
122
122
|
n.classList.add("sidebar__header-row");
|
|
123
123
|
let i = e.href === void 0 ? e.onClick === void 0 ? document.createElement("span") : document.createElement("button") : document.createElement("a");
|
|
124
|
-
i.classList.add("sidebar__brand"), i instanceof HTMLAnchorElement && (i.href = e.href ?? "#", i.setAttribute("aria-label", e.label ?? "CounterMeasure")), i instanceof HTMLButtonElement && (i.type = "button", i.setAttribute("aria-label", e.label ?? "CounterMeasure")), e.onClick !== void 0 && i.addEventListener("click", e.onClick)
|
|
124
|
+
i.classList.add("sidebar__brand"), i instanceof HTMLAnchorElement && (i.href = e.href ?? "#", i.setAttribute("aria-label", e.label ?? "CounterMeasure")), i instanceof HTMLButtonElement && (i.type = "button", i.setAttribute("aria-label", e.label ?? "CounterMeasure")), e.onClick !== void 0 && i.addEventListener("click", e.onClick);
|
|
125
|
+
let a = {
|
|
125
126
|
label: e.label ?? "CounterMeasure",
|
|
126
127
|
markSize: e.markSize ?? 22,
|
|
127
128
|
showWordmark: e.showWordmark ?? !0,
|
|
128
129
|
decorative: e.decorative ?? !1
|
|
129
|
-
}
|
|
130
|
+
};
|
|
131
|
+
e.subtitle !== void 0 && Object.assign(a, { subtitle: e.subtitle }), e.wordmarkCase !== void 0 && Object.assign(a, { wordmarkCase: e.wordmarkCase }), i.appendChild(r(a)), n.appendChild(i), t.appendChild(n), this.aside.appendChild(t);
|
|
130
132
|
}
|
|
131
133
|
renderScope() {
|
|
132
134
|
let e = this.config.scope;
|
|
@@ -386,4 +388,4 @@ var m = class {
|
|
|
386
388
|
//#endregion
|
|
387
389
|
export { m as t };
|
|
388
390
|
|
|
389
|
-
//# sourceMappingURL=component-
|
|
391
|
+
//# sourceMappingURL=component-D_asjmrt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-D_asjmrt.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 const lockupConfig = {\n label: brand.label ?? 'CounterMeasure',\n markSize: brand.markSize ?? 22,\n showWordmark: brand.showWordmark ?? true,\n decorative: brand.decorative ?? false,\n }\n if (brand.subtitle !== undefined) {\n Object.assign(lockupConfig, { subtitle: brand.subtitle })\n }\n if (brand.wordmarkCase !== undefined) {\n Object.assign(lockupConfig, { wordmarkCase: brand.wordmarkCase })\n }\n\n brandEl.appendChild(createBrandLockupElement(lockupConfig))\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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/brand/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,SAAS,CAAA;AAGhB,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,SAAS,CAAA;AAKhB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;CAazB,CAAA;AAmBV,qBAAa,OAAO;IAClB,SAAgB,EAAE,EAAE,aAAa,CAAA;gBAErB,MAAM,GAAE,aAAkB;IAStC,OAAO,IAAI,IAAI;CAGhB;AAED,qBAAa,QAAQ;IACnB,SAAgB,EAAE,EAAE,cAAc,CAAA;IAClC,SAAgB,GAAG,EAAE,aAAa,CAAA;IAClC,OAAO,CAAC,UAAU,CAA+B;gBAErC,MAAM,GAAE,cAAmB;IAuBvC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAgB1C,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,kBAAkB;CAS3B;AAED,qBAAa,WAAW;IACtB,SAAgB,EAAE,EAAE,eAAe,CAAA;gBAEvB,MAAM,GAAE,iBAAsB;IAS1C,OAAO,IAAI,IAAI;CAGhB;AAED,qBAAa,aAAa;IACxB,SAAgB,EAAE,EAAE,eAAe,CAAA;gBAEvB,MAAM,EAAE,mBAAmB;IA6BvC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,kBAAkB;CAS3B;AAED,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,aAAkB,GAAG,aAAa,CAwB1E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,cAAmB,GAAG,aAAa,CAuB5E;AAED,wBAAgB,wBAAwB,CAAC,MAAM,GAAE,iBAAsB,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/brand/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,SAAS,CAAA;AAGhB,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,SAAS,CAAA;AAKhB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;CAazB,CAAA;AAmBV,qBAAa,OAAO;IAClB,SAAgB,EAAE,EAAE,aAAa,CAAA;gBAErB,MAAM,GAAE,aAAkB;IAStC,OAAO,IAAI,IAAI;CAGhB;AAED,qBAAa,QAAQ;IACnB,SAAgB,EAAE,EAAE,cAAc,CAAA;IAClC,SAAgB,GAAG,EAAE,aAAa,CAAA;IAClC,OAAO,CAAC,UAAU,CAA+B;gBAErC,MAAM,GAAE,cAAmB;IAuBvC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAgB1C,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,kBAAkB;CAS3B;AAED,qBAAa,WAAW;IACtB,SAAgB,EAAE,EAAE,eAAe,CAAA;gBAEvB,MAAM,GAAE,iBAAsB;IAS1C,OAAO,IAAI,IAAI;CAGhB;AAED,qBAAa,aAAa;IACxB,SAAgB,EAAE,EAAE,eAAe,CAAA;gBAEvB,MAAM,EAAE,mBAAmB;IA6BvC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,kBAAkB;CAS3B;AAED,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,aAAkB,GAAG,aAAa,CAwB1E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,cAAmB,GAAG,aAAa,CAuB5E;AAED,wBAAgB,wBAAwB,CAAC,MAAM,GAAE,iBAAsB,GAAG,eAAe,CA8CxF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzF;AAED,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAE9E"}
|
|
@@ -117,11 +117,17 @@ function p(t = {}) {
|
|
|
117
117
|
decorative: !0
|
|
118
118
|
})), t.showWordmark !== !1) {
|
|
119
119
|
let e = document.createElement("span");
|
|
120
|
-
e.className = "cmm-brand-
|
|
121
|
-
let t = document.createElement("span");
|
|
122
|
-
t.className = "cmm-brand-lockup__counter", t.textContent = "COUNTER";
|
|
120
|
+
e.className = "cmm-brand-lockup__copy", e.setAttribute("aria-hidden", "true");
|
|
123
121
|
let r = document.createElement("span");
|
|
124
|
-
r.className = "cmm-brand-
|
|
122
|
+
r.className = "cmm-brand-lockup__wordmark";
|
|
123
|
+
let i = t.wordmarkCase ?? "uppercase", a = document.createElement("span");
|
|
124
|
+
a.className = "cmm-brand-lockup__counter", a.textContent = i === "title" ? "Counter" : "COUNTER";
|
|
125
|
+
let o = document.createElement("span");
|
|
126
|
+
if (o.className = "cmm-brand-lockup__measure", o.textContent = i === "title" ? "Measure" : "MEASURE", r.append(a, o), e.appendChild(r), t.subtitle !== void 0) {
|
|
127
|
+
let n = document.createElement("span");
|
|
128
|
+
n.className = "cmm-brand-lockup__subtitle", n.textContent = t.subtitle, e.appendChild(n);
|
|
129
|
+
}
|
|
130
|
+
n.appendChild(e);
|
|
125
131
|
}
|
|
126
132
|
return n;
|
|
127
133
|
}
|
|
@@ -146,7 +152,7 @@ function y(e) {
|
|
|
146
152
|
}
|
|
147
153
|
function b(e) {
|
|
148
154
|
let t = ["cmm-brand-lockup"];
|
|
149
|
-
return e.className && t.push(e.className), t.join(" ");
|
|
155
|
+
return e.wordmarkCase === "title" && t.push("cmm-brand-lockup--title"), e.className && t.push(e.className), t.join(" ");
|
|
150
156
|
}
|
|
151
157
|
function x(e) {
|
|
152
158
|
let t = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/brand/index.ts"],"sourcesContent":["/**\n * CounterMeasure brand helpers and vanilla components\n * @countermeasure/web-components/components/brand\n */\n\nimport {\n type BrandLockupConfig,\n type BrandSize,\n type ConnectorLogoConfig,\n type ConnectorLogoSize,\n type DiamondConfig,\n type WordmarkConfig,\n} from './types'\nimport { resolveContainer, uniqueId } from '../../primitives/utils'\n\nexport type {\n BrandSize,\n BrandLockupConfig,\n ConnectorLogoConfig,\n ConnectorLogoSize,\n DiamondConfig,\n WordmarkConfig,\n WordmarkVariant,\n} from './types'\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\nconst WORDMARK_ASPECT_RATIO = 220 / 32\n\nexport const CONNECTOR_LOGO_PALETTE = {\n Splunk: '#FF6B35',\n Sentinel: '#0078D4',\n Elastic: '#00BFB3',\n CrowdStrike: '#FA0F00',\n Defender: '#0078D4',\n SentinelOne: '#6300E5',\n MISP: '#00897B',\n OpenCTI: '#5C6BC0',\n 'MITRE ATT&CK': '#C8102E',\n 'Palo Alto': '#FA582D',\n 'Carbon Black': '#000000',\n default: '#475569',\n} as const\n\nconst CONNECTOR_LOGO_TONES: Record<keyof typeof CONNECTOR_LOGO_PALETTE, string> = {\n Splunk: 'splunk',\n Sentinel: 'sentinel',\n Elastic: 'elastic',\n CrowdStrike: 'crowdstrike',\n Defender: 'defender',\n SentinelOne: 'sentinelone',\n MISP: 'misp',\n OpenCTI: 'opencti',\n 'MITRE ATT&CK': 'mitre-attack',\n 'Palo Alto': 'palo-alto',\n 'Carbon Black': 'carbon-black',\n default: 'default',\n}\n\nconst BRAND_SIZE_CLASS_VALUES = new Set<number>([16, 20, 24, 32, 48, 64])\n\nexport class Diamond {\n public readonly el: SVGSVGElement\n\n constructor(config: DiamondConfig = {}) {\n this.el = createDiamondSvg(config)\n\n if (config.container !== undefined) {\n const parent = resolveContainer(config.container)\n parent.appendChild(this.el)\n }\n }\n\n destroy(): void {\n this.el.remove()\n }\n}\n\nexport class Wordmark {\n public readonly el: HTMLDivElement\n public readonly svg: SVGSVGElement\n private subtitleEl: HTMLSpanElement | null = null\n\n constructor(config: WordmarkConfig = {}) {\n this.el = document.createElement('div')\n this.el.id = uniqueId('cmm-wordmark')\n this.el.className = buildWordmarkClassName(config)\n this.applyAccessibility(config)\n\n this.svg = createWordmarkSvg(config)\n this.svg.setAttribute('aria-hidden', 'true')\n this.el.appendChild(this.svg)\n\n if (config.subtitle !== undefined) {\n this.subtitleEl = document.createElement('span')\n this.subtitleEl.className = 'cmm-wordmark__subtitle'\n this.subtitleEl.textContent = config.subtitle\n this.el.appendChild(this.subtitleEl)\n }\n\n if (config.container !== undefined) {\n const parent = resolveContainer(config.container)\n parent.appendChild(this.el)\n }\n }\n\n setSubtitle(subtitle: string | null): void {\n if (subtitle === null) {\n this.subtitleEl?.remove()\n this.subtitleEl = null\n return\n }\n\n if (this.subtitleEl === null) {\n this.subtitleEl = document.createElement('span')\n this.subtitleEl.className = 'cmm-wordmark__subtitle'\n this.el.appendChild(this.subtitleEl)\n }\n\n this.subtitleEl.textContent = subtitle\n }\n\n destroy(): void {\n this.el.remove()\n }\n\n private applyAccessibility(config: WordmarkConfig): void {\n if (config.decorative === true) {\n this.el.setAttribute('aria-hidden', 'true')\n return\n }\n\n this.el.setAttribute('role', 'img')\n this.el.setAttribute('aria-label', config.label ?? 'CounterMeasure')\n }\n}\n\nexport class BrandLockup {\n public readonly el: HTMLSpanElement\n\n constructor(config: BrandLockupConfig = {}) {\n this.el = createBrandLockupElement(config)\n\n if (config.container !== undefined) {\n const parent = resolveContainer(config.container)\n parent.appendChild(this.el)\n }\n }\n\n destroy(): void {\n this.el.remove()\n }\n}\n\nexport class ConnectorLogo {\n public readonly el: HTMLSpanElement\n\n constructor(config: ConnectorLogoConfig) {\n this.el = document.createElement('span')\n this.el.id = uniqueId('cmm-connector-logo')\n this.el.className = buildConnectorLogoClassName(config)\n this.applyAccessibility(config)\n\n if (config.src !== undefined) {\n const imageEl = document.createElement('img')\n imageEl.className = 'cmm-connector-logo__asset'\n imageEl.src = config.src\n imageEl.alt = ''\n imageEl.setAttribute('aria-hidden', 'true')\n this.el.appendChild(imageEl)\n } else if (config.svg !== undefined) {\n const assetEl = document.createElement('span')\n assetEl.className = 'cmm-connector-logo__asset'\n assetEl.setAttribute('aria-hidden', 'true')\n assetEl.appendChild(config.svg)\n this.el.appendChild(assetEl)\n } else {\n this.el.textContent = getConnectorLogoInitial(config.name)\n }\n\n if (config.container !== undefined) {\n const parent = resolveContainer(config.container)\n parent.appendChild(this.el)\n }\n }\n\n destroy(): void {\n this.el.remove()\n }\n\n private applyAccessibility(config: ConnectorLogoConfig): void {\n if (config.decorative === true) {\n this.el.setAttribute('aria-hidden', 'true')\n return\n }\n\n this.el.setAttribute('role', 'img')\n this.el.setAttribute('aria-label', config.label ?? `${config.name} connector`)\n }\n}\n\nexport function createDiamondSvg(config: DiamondConfig = {}): SVGSVGElement {\n const size = config.size ?? 24\n const svg = createSvgRoot('0 0 46.64 46.64', size, size)\n svg.id = uniqueId('cmm-diamond')\n svg.classList.add('cmm-diamond')\n\n const sizeClass = getBrandSizeClass('cmm-diamond', size)\n if (sizeClass !== null) {\n svg.classList.add(sizeClass)\n }\n\n if (config.className) {\n svg.classList.add(...splitClassName(config.className))\n }\n\n if (config.decorative === false) {\n svg.setAttribute('role', 'img')\n svg.setAttribute('aria-label', config.label ?? 'CounterMeasure diamond')\n } else {\n svg.setAttribute('aria-hidden', 'true')\n }\n\n appendDiamondRects(svg, 'cmm-diamond__foreground')\n return svg\n}\n\nexport function createWordmarkSvg(config: WordmarkConfig = {}): SVGSVGElement {\n const height = config.size ?? 32\n const width = Math.round(height * WORDMARK_ASPECT_RATIO * 100) / 100\n const svg = createSvgRoot('0 0 220 32', width, height)\n svg.classList.add('cmm-wordmark__svg')\n\n const markGroup = document.createElementNS(SVG_NS, 'g')\n markGroup.setAttribute('transform', 'translate(0,3)')\n appendWordmarkDiamondRects(markGroup)\n svg.appendChild(markGroup)\n\n const textEl = document.createElementNS(SVG_NS, 'text')\n textEl.setAttribute('x', '42')\n textEl.setAttribute('y', '22')\n textEl.setAttribute('class', 'cmm-wordmark__text')\n textEl.setAttribute('font-family', 'Outfit, sans-serif')\n textEl.setAttribute('font-size', '18')\n textEl.setAttribute('font-weight', '600')\n textEl.setAttribute('letter-spacing', '-0.01em')\n textEl.textContent = 'CounterMeasure'\n svg.appendChild(textEl)\n\n return svg\n}\n\nexport function createBrandLockupElement(config: BrandLockupConfig = {}): HTMLSpanElement {\n const el = document.createElement('span')\n el.id = uniqueId('cmm-brand-lockup')\n el.className = buildBrandLockupClassName(config)\n\n if (config.decorative === true) {\n el.setAttribute('aria-hidden', 'true')\n } else {\n el.setAttribute('role', 'img')\n el.setAttribute('aria-label', config.label ?? 'CounterMeasure')\n }\n\n el.appendChild(createDiamondSvg({ size: config.markSize ?? 22, decorative: true }))\n\n if (config.showWordmark !== false) {\n const wordmark = document.createElement('span')\n wordmark.className = 'cmm-brand-lockup__wordmark'\n wordmark.setAttribute('aria-hidden', 'true')\n\n const counter = document.createElement('span')\n counter.className = 'cmm-brand-lockup__counter'\n counter.textContent = 'COUNTER'\n\n const measure = document.createElement('span')\n measure.className = 'cmm-brand-lockup__measure'\n measure.textContent = 'MEASURE'\n\n wordmark.append(counter, measure)\n el.appendChild(wordmark)\n }\n\n return el\n}\n\nexport function getConnectorLogoColor(name: string): string {\n const paletteKey = getConnectorPaletteKey(name)\n return CONNECTOR_LOGO_PALETTE[paletteKey]\n}\n\nexport function getConnectorLogoTone(name: string): string {\n const paletteKey = getConnectorPaletteKey(name)\n return CONNECTOR_LOGO_TONES[paletteKey]\n}\n\nexport function getConnectorLogoInitial(name: string): string {\n const match = name.trim().match(/[A-Za-z0-9]/)\n return match?.[0]?.toUpperCase() ?? 'C'\n}\n\nexport function getBrandSizeClass(prefix: string, size: BrandSize | number): string | null {\n if (BRAND_SIZE_CLASS_VALUES.has(size)) {\n return `${prefix}--${String(size)}`\n }\n\n return null\n}\n\nexport function getConnectorLogoSizeClass(size: ConnectorLogoSize = 32): string {\n return `cmm-connector-logo--${String(size)}`\n}\n\nfunction buildWordmarkClassName(config: WordmarkConfig): string {\n const variant = config.variant ?? 'auto'\n const classes = ['cmm-wordmark', `cmm-wordmark--${variant}`]\n\n if (config.className) {\n classes.push(config.className)\n }\n\n return classes.join(' ')\n}\n\nfunction buildBrandLockupClassName(config: BrandLockupConfig): string {\n const classes = ['cmm-brand-lockup']\n\n if (config.className) {\n classes.push(config.className)\n }\n\n return classes.join(' ')\n}\n\nfunction buildConnectorLogoClassName(config: ConnectorLogoConfig): string {\n const classes = [\n 'cmm-connector-logo',\n getConnectorLogoSizeClass(config.size),\n `cmm-connector-logo--vendor-${getConnectorLogoTone(config.name)}`,\n ]\n\n if (config.src !== undefined || config.svg !== undefined) {\n classes.push('cmm-connector-logo--asset')\n }\n\n if (config.className) {\n classes.push(config.className)\n }\n\n return classes.join(' ')\n}\n\nfunction getConnectorPaletteKey(name: string): keyof typeof CONNECTOR_LOGO_PALETTE {\n const normalizedName = name.trim().toLowerCase()\n\n for (const key of Object.keys(CONNECTOR_LOGO_PALETTE) as Array<\n keyof typeof CONNECTOR_LOGO_PALETTE\n >) {\n if (key.toLowerCase() === normalizedName) {\n return key\n }\n }\n\n return 'default'\n}\n\nfunction createSvgRoot(\n viewBox: string,\n width: BrandSize | number,\n height: BrandSize | number\n): SVGSVGElement {\n const svg = document.createElementNS(SVG_NS, 'svg')\n svg.setAttribute('xmlns', SVG_NS)\n svg.setAttribute('viewBox', viewBox)\n svg.setAttribute('width', String(width))\n svg.setAttribute('height', String(height))\n return svg\n}\n\nfunction appendDiamondRects(svg: SVGSVGElement, foregroundClassName: string): void {\n svg.appendChild(\n createRect('2.62', '16.42', '13.8', '13.8', '0.57', '-13.7 13.56', foregroundClassName)\n )\n svg.appendChild(\n createRect('16.42', '30.22', '13.8', '13.8', '0.57', '-19.42 27.36', 'cmm-diamond__slate')\n )\n svg.appendChild(\n createRect('16.42', '2.62', '13.8', '13.8', '0.57', '0.1 19.28', 'cmm-diamond__orange')\n )\n}\n\nfunction appendWordmarkDiamondRects(group: SVGGElement): void {\n group.appendChild(\n createRect('1.78', '11.16', '9.4', '9.4', '0.4', '-9.32 9.22', 'cmm-wordmark__foreground')\n )\n group.appendChild(\n createRect('11.16', '20.54', '9.4', '9.4', '0.4', '-13.21 18.6', 'cmm-wordmark__slate')\n )\n group.appendChild(\n createRect('11.16', '1.78', '9.4', '9.4', '0.4', '0.07 13.11', 'cmm-wordmark__orange')\n )\n}\n\nfunction createRect(\n x: string,\n y: string,\n width: string,\n height: string,\n rx: string,\n transformTranslate: string,\n className: string\n): SVGRectElement {\n const rect = document.createElementNS(SVG_NS, 'rect')\n rect.setAttribute('x', x)\n rect.setAttribute('y', y)\n rect.setAttribute('width', width)\n rect.setAttribute('height', height)\n rect.setAttribute('rx', rx)\n rect.setAttribute('transform', `translate(${transformTranslate}) rotate(-45)`)\n rect.setAttribute('class', className)\n return rect\n}\n\nfunction splitClassName(className: string): string[] {\n return className.split(/\\s+/).filter(Boolean)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/brand/index.ts"],"sourcesContent":["/**\n * CounterMeasure brand helpers and vanilla components\n * @countermeasure/web-components/components/brand\n */\n\nimport {\n type BrandLockupConfig,\n type BrandSize,\n type ConnectorLogoConfig,\n type ConnectorLogoSize,\n type DiamondConfig,\n type WordmarkConfig,\n} from './types'\nimport { resolveContainer, uniqueId } from '../../primitives/utils'\n\nexport type {\n BrandSize,\n BrandLockupConfig,\n ConnectorLogoConfig,\n ConnectorLogoSize,\n DiamondConfig,\n WordmarkConfig,\n WordmarkVariant,\n} from './types'\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\nconst WORDMARK_ASPECT_RATIO = 220 / 32\n\nexport const CONNECTOR_LOGO_PALETTE = {\n Splunk: '#FF6B35',\n Sentinel: '#0078D4',\n Elastic: '#00BFB3',\n CrowdStrike: '#FA0F00',\n Defender: '#0078D4',\n SentinelOne: '#6300E5',\n MISP: '#00897B',\n OpenCTI: '#5C6BC0',\n 'MITRE ATT&CK': '#C8102E',\n 'Palo Alto': '#FA582D',\n 'Carbon Black': '#000000',\n default: '#475569',\n} as const\n\nconst CONNECTOR_LOGO_TONES: Record<keyof typeof CONNECTOR_LOGO_PALETTE, string> = {\n Splunk: 'splunk',\n Sentinel: 'sentinel',\n Elastic: 'elastic',\n CrowdStrike: 'crowdstrike',\n Defender: 'defender',\n SentinelOne: 'sentinelone',\n MISP: 'misp',\n OpenCTI: 'opencti',\n 'MITRE ATT&CK': 'mitre-attack',\n 'Palo Alto': 'palo-alto',\n 'Carbon Black': 'carbon-black',\n default: 'default',\n}\n\nconst BRAND_SIZE_CLASS_VALUES = new Set<number>([16, 20, 24, 32, 48, 64])\n\nexport class Diamond {\n public readonly el: SVGSVGElement\n\n constructor(config: DiamondConfig = {}) {\n this.el = createDiamondSvg(config)\n\n if (config.container !== undefined) {\n const parent = resolveContainer(config.container)\n parent.appendChild(this.el)\n }\n }\n\n destroy(): void {\n this.el.remove()\n }\n}\n\nexport class Wordmark {\n public readonly el: HTMLDivElement\n public readonly svg: SVGSVGElement\n private subtitleEl: HTMLSpanElement | null = null\n\n constructor(config: WordmarkConfig = {}) {\n this.el = document.createElement('div')\n this.el.id = uniqueId('cmm-wordmark')\n this.el.className = buildWordmarkClassName(config)\n this.applyAccessibility(config)\n\n this.svg = createWordmarkSvg(config)\n this.svg.setAttribute('aria-hidden', 'true')\n this.el.appendChild(this.svg)\n\n if (config.subtitle !== undefined) {\n this.subtitleEl = document.createElement('span')\n this.subtitleEl.className = 'cmm-wordmark__subtitle'\n this.subtitleEl.textContent = config.subtitle\n this.el.appendChild(this.subtitleEl)\n }\n\n if (config.container !== undefined) {\n const parent = resolveContainer(config.container)\n parent.appendChild(this.el)\n }\n }\n\n setSubtitle(subtitle: string | null): void {\n if (subtitle === null) {\n this.subtitleEl?.remove()\n this.subtitleEl = null\n return\n }\n\n if (this.subtitleEl === null) {\n this.subtitleEl = document.createElement('span')\n this.subtitleEl.className = 'cmm-wordmark__subtitle'\n this.el.appendChild(this.subtitleEl)\n }\n\n this.subtitleEl.textContent = subtitle\n }\n\n destroy(): void {\n this.el.remove()\n }\n\n private applyAccessibility(config: WordmarkConfig): void {\n if (config.decorative === true) {\n this.el.setAttribute('aria-hidden', 'true')\n return\n }\n\n this.el.setAttribute('role', 'img')\n this.el.setAttribute('aria-label', config.label ?? 'CounterMeasure')\n }\n}\n\nexport class BrandLockup {\n public readonly el: HTMLSpanElement\n\n constructor(config: BrandLockupConfig = {}) {\n this.el = createBrandLockupElement(config)\n\n if (config.container !== undefined) {\n const parent = resolveContainer(config.container)\n parent.appendChild(this.el)\n }\n }\n\n destroy(): void {\n this.el.remove()\n }\n}\n\nexport class ConnectorLogo {\n public readonly el: HTMLSpanElement\n\n constructor(config: ConnectorLogoConfig) {\n this.el = document.createElement('span')\n this.el.id = uniqueId('cmm-connector-logo')\n this.el.className = buildConnectorLogoClassName(config)\n this.applyAccessibility(config)\n\n if (config.src !== undefined) {\n const imageEl = document.createElement('img')\n imageEl.className = 'cmm-connector-logo__asset'\n imageEl.src = config.src\n imageEl.alt = ''\n imageEl.setAttribute('aria-hidden', 'true')\n this.el.appendChild(imageEl)\n } else if (config.svg !== undefined) {\n const assetEl = document.createElement('span')\n assetEl.className = 'cmm-connector-logo__asset'\n assetEl.setAttribute('aria-hidden', 'true')\n assetEl.appendChild(config.svg)\n this.el.appendChild(assetEl)\n } else {\n this.el.textContent = getConnectorLogoInitial(config.name)\n }\n\n if (config.container !== undefined) {\n const parent = resolveContainer(config.container)\n parent.appendChild(this.el)\n }\n }\n\n destroy(): void {\n this.el.remove()\n }\n\n private applyAccessibility(config: ConnectorLogoConfig): void {\n if (config.decorative === true) {\n this.el.setAttribute('aria-hidden', 'true')\n return\n }\n\n this.el.setAttribute('role', 'img')\n this.el.setAttribute('aria-label', config.label ?? `${config.name} connector`)\n }\n}\n\nexport function createDiamondSvg(config: DiamondConfig = {}): SVGSVGElement {\n const size = config.size ?? 24\n const svg = createSvgRoot('0 0 46.64 46.64', size, size)\n svg.id = uniqueId('cmm-diamond')\n svg.classList.add('cmm-diamond')\n\n const sizeClass = getBrandSizeClass('cmm-diamond', size)\n if (sizeClass !== null) {\n svg.classList.add(sizeClass)\n }\n\n if (config.className) {\n svg.classList.add(...splitClassName(config.className))\n }\n\n if (config.decorative === false) {\n svg.setAttribute('role', 'img')\n svg.setAttribute('aria-label', config.label ?? 'CounterMeasure diamond')\n } else {\n svg.setAttribute('aria-hidden', 'true')\n }\n\n appendDiamondRects(svg, 'cmm-diamond__foreground')\n return svg\n}\n\nexport function createWordmarkSvg(config: WordmarkConfig = {}): SVGSVGElement {\n const height = config.size ?? 32\n const width = Math.round(height * WORDMARK_ASPECT_RATIO * 100) / 100\n const svg = createSvgRoot('0 0 220 32', width, height)\n svg.classList.add('cmm-wordmark__svg')\n\n const markGroup = document.createElementNS(SVG_NS, 'g')\n markGroup.setAttribute('transform', 'translate(0,3)')\n appendWordmarkDiamondRects(markGroup)\n svg.appendChild(markGroup)\n\n const textEl = document.createElementNS(SVG_NS, 'text')\n textEl.setAttribute('x', '42')\n textEl.setAttribute('y', '22')\n textEl.setAttribute('class', 'cmm-wordmark__text')\n textEl.setAttribute('font-family', 'Outfit, sans-serif')\n textEl.setAttribute('font-size', '18')\n textEl.setAttribute('font-weight', '600')\n textEl.setAttribute('letter-spacing', '-0.01em')\n textEl.textContent = 'CounterMeasure'\n svg.appendChild(textEl)\n\n return svg\n}\n\nexport function createBrandLockupElement(config: BrandLockupConfig = {}): HTMLSpanElement {\n const el = document.createElement('span')\n el.id = uniqueId('cmm-brand-lockup')\n el.className = buildBrandLockupClassName(config)\n\n if (config.decorative === true) {\n el.setAttribute('aria-hidden', 'true')\n } else {\n el.setAttribute('role', 'img')\n el.setAttribute('aria-label', config.label ?? 'CounterMeasure')\n }\n\n el.appendChild(createDiamondSvg({ size: config.markSize ?? 22, decorative: true }))\n\n if (config.showWordmark !== false) {\n const copy = document.createElement('span')\n copy.className = 'cmm-brand-lockup__copy'\n copy.setAttribute('aria-hidden', 'true')\n\n const wordmark = document.createElement('span')\n wordmark.className = 'cmm-brand-lockup__wordmark'\n\n const wordmarkCase = config.wordmarkCase ?? 'uppercase'\n\n const counter = document.createElement('span')\n counter.className = 'cmm-brand-lockup__counter'\n counter.textContent = wordmarkCase === 'title' ? 'Counter' : 'COUNTER'\n\n const measure = document.createElement('span')\n measure.className = 'cmm-brand-lockup__measure'\n measure.textContent = wordmarkCase === 'title' ? 'Measure' : 'MEASURE'\n\n wordmark.append(counter, measure)\n copy.appendChild(wordmark)\n\n if (config.subtitle !== undefined) {\n const subtitle = document.createElement('span')\n subtitle.className = 'cmm-brand-lockup__subtitle'\n subtitle.textContent = config.subtitle\n copy.appendChild(subtitle)\n }\n\n el.appendChild(copy)\n }\n\n return el\n}\n\nexport function getConnectorLogoColor(name: string): string {\n const paletteKey = getConnectorPaletteKey(name)\n return CONNECTOR_LOGO_PALETTE[paletteKey]\n}\n\nexport function getConnectorLogoTone(name: string): string {\n const paletteKey = getConnectorPaletteKey(name)\n return CONNECTOR_LOGO_TONES[paletteKey]\n}\n\nexport function getConnectorLogoInitial(name: string): string {\n const match = name.trim().match(/[A-Za-z0-9]/)\n return match?.[0]?.toUpperCase() ?? 'C'\n}\n\nexport function getBrandSizeClass(prefix: string, size: BrandSize | number): string | null {\n if (BRAND_SIZE_CLASS_VALUES.has(size)) {\n return `${prefix}--${String(size)}`\n }\n\n return null\n}\n\nexport function getConnectorLogoSizeClass(size: ConnectorLogoSize = 32): string {\n return `cmm-connector-logo--${String(size)}`\n}\n\nfunction buildWordmarkClassName(config: WordmarkConfig): string {\n const variant = config.variant ?? 'auto'\n const classes = ['cmm-wordmark', `cmm-wordmark--${variant}`]\n\n if (config.className) {\n classes.push(config.className)\n }\n\n return classes.join(' ')\n}\n\nfunction buildBrandLockupClassName(config: BrandLockupConfig): string {\n const classes = ['cmm-brand-lockup']\n\n if (config.wordmarkCase === 'title') {\n classes.push('cmm-brand-lockup--title')\n }\n\n if (config.className) {\n classes.push(config.className)\n }\n\n return classes.join(' ')\n}\n\nfunction buildConnectorLogoClassName(config: ConnectorLogoConfig): string {\n const classes = [\n 'cmm-connector-logo',\n getConnectorLogoSizeClass(config.size),\n `cmm-connector-logo--vendor-${getConnectorLogoTone(config.name)}`,\n ]\n\n if (config.src !== undefined || config.svg !== undefined) {\n classes.push('cmm-connector-logo--asset')\n }\n\n if (config.className) {\n classes.push(config.className)\n }\n\n return classes.join(' ')\n}\n\nfunction getConnectorPaletteKey(name: string): keyof typeof CONNECTOR_LOGO_PALETTE {\n const normalizedName = name.trim().toLowerCase()\n\n for (const key of Object.keys(CONNECTOR_LOGO_PALETTE) as Array<\n keyof typeof CONNECTOR_LOGO_PALETTE\n >) {\n if (key.toLowerCase() === normalizedName) {\n return key\n }\n }\n\n return 'default'\n}\n\nfunction createSvgRoot(\n viewBox: string,\n width: BrandSize | number,\n height: BrandSize | number\n): SVGSVGElement {\n const svg = document.createElementNS(SVG_NS, 'svg')\n svg.setAttribute('xmlns', SVG_NS)\n svg.setAttribute('viewBox', viewBox)\n svg.setAttribute('width', String(width))\n svg.setAttribute('height', String(height))\n return svg\n}\n\nfunction appendDiamondRects(svg: SVGSVGElement, foregroundClassName: string): void {\n svg.appendChild(\n createRect('2.62', '16.42', '13.8', '13.8', '0.57', '-13.7 13.56', foregroundClassName)\n )\n svg.appendChild(\n createRect('16.42', '30.22', '13.8', '13.8', '0.57', '-19.42 27.36', 'cmm-diamond__slate')\n )\n svg.appendChild(\n createRect('16.42', '2.62', '13.8', '13.8', '0.57', '0.1 19.28', 'cmm-diamond__orange')\n )\n}\n\nfunction appendWordmarkDiamondRects(group: SVGGElement): void {\n group.appendChild(\n createRect('1.78', '11.16', '9.4', '9.4', '0.4', '-9.32 9.22', 'cmm-wordmark__foreground')\n )\n group.appendChild(\n createRect('11.16', '20.54', '9.4', '9.4', '0.4', '-13.21 18.6', 'cmm-wordmark__slate')\n )\n group.appendChild(\n createRect('11.16', '1.78', '9.4', '9.4', '0.4', '0.07 13.11', 'cmm-wordmark__orange')\n )\n}\n\nfunction createRect(\n x: string,\n y: string,\n width: string,\n height: string,\n rx: string,\n transformTranslate: string,\n className: string\n): SVGRectElement {\n const rect = document.createElementNS(SVG_NS, 'rect')\n rect.setAttribute('x', x)\n rect.setAttribute('y', y)\n rect.setAttribute('width', width)\n rect.setAttribute('height', height)\n rect.setAttribute('rx', rx)\n rect.setAttribute('transform', `translate(${transformTranslate}) rotate(-45)`)\n rect.setAttribute('class', className)\n return rect\n}\n\nfunction splitClassName(className: string): string[] {\n return className.split(/\\s+/).filter(Boolean)\n}\n"],"mappings":"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"}
|
|
@@ -25,6 +25,8 @@ export interface BrandLockupConfig {
|
|
|
25
25
|
container?: HTMLElement | string;
|
|
26
26
|
markSize?: BrandSize | number;
|
|
27
27
|
label?: string;
|
|
28
|
+
subtitle?: string;
|
|
29
|
+
wordmarkCase?: 'uppercase' | 'title';
|
|
28
30
|
decorative?: boolean;
|
|
29
31
|
showWordmark?: boolean;
|
|
30
32
|
className?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/brand/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;AACnD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AACvD,MAAM,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;AAE3D,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAChC,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAChC,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAChC,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/brand/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;AACnD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AACvD,MAAM,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;AAE3D,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAChC,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAChC,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAChC,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAA;IACpC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
|
package/dist/icons/index.d.ts
CHANGED
|
@@ -29,7 +29,7 @@ export declare const SEMANTIC_ICON_ALIASES: {
|
|
|
29
29
|
readonly 'api-access': "KeyRound";
|
|
30
30
|
readonly authentication: "Lock";
|
|
31
31
|
readonly actors: "Users";
|
|
32
|
-
readonly bell: "
|
|
32
|
+
readonly bell: "Bell";
|
|
33
33
|
readonly capacity: "Gauge";
|
|
34
34
|
readonly 'circle-help': "CircleAlert";
|
|
35
35
|
readonly code: "Code2";
|
|
@@ -40,7 +40,12 @@ export declare const SEMANTIC_ICON_ALIASES: {
|
|
|
40
40
|
readonly integrations: "Plug";
|
|
41
41
|
readonly library: "BookOpen";
|
|
42
42
|
readonly mitre: "Grid3X3";
|
|
43
|
-
readonly
|
|
43
|
+
readonly dark: "Moon";
|
|
44
|
+
readonly light: "Sun";
|
|
45
|
+
readonly midnight: "Monitor";
|
|
46
|
+
readonly monitor: "Monitor";
|
|
47
|
+
readonly moon: "Moon";
|
|
48
|
+
readonly notifications: "Bell";
|
|
44
49
|
readonly passkeys: "KeyRound";
|
|
45
50
|
readonly pipeline: "Workflow";
|
|
46
51
|
readonly platform: "Building2";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAA;AAEjB,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAA;AAEtE,2CAA2C;AAC3C,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAM5C,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAA;AAEjB,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAA;AAEtE,2CAA2C;AAC3C,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAM5C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDiB,CAAA;AAEnD,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,qBAAqB,CAAA;AACjE,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,gBAAgB,CAAA;AACxD,MAAM,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;AAElD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAK9E;AAgKD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAK9C,CAAA;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE9E;AAED,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,UAAU,CAAA;AACjB,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAkC9C,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CA8C9D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAqCvD;AAED,qBAAa,IAAI;IACf,SAAgB,EAAE,EAAE,aAAa,CAAA;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;gBAEzB,OAAO,EAAE,WAAW;IAKhC,QAAQ,IAAI,MAAM;CAGnB"}
|
package/dist/icons/index.js
CHANGED
|
@@ -27,7 +27,7 @@ var a = {
|
|
|
27
27
|
"api-access": "KeyRound",
|
|
28
28
|
authentication: "Lock",
|
|
29
29
|
actors: "Users",
|
|
30
|
-
bell: "
|
|
30
|
+
bell: "Bell",
|
|
31
31
|
capacity: "Gauge",
|
|
32
32
|
"circle-help": "CircleAlert",
|
|
33
33
|
code: "Code2",
|
|
@@ -38,7 +38,12 @@ var a = {
|
|
|
38
38
|
integrations: "Plug",
|
|
39
39
|
library: "BookOpen",
|
|
40
40
|
mitre: "Grid3X3",
|
|
41
|
-
|
|
41
|
+
dark: "Moon",
|
|
42
|
+
light: "Sun",
|
|
43
|
+
midnight: "Monitor",
|
|
44
|
+
monitor: "Monitor",
|
|
45
|
+
moon: "Moon",
|
|
46
|
+
notifications: "Bell",
|
|
42
47
|
passkeys: "KeyRound",
|
|
43
48
|
pipeline: "Workflow",
|
|
44
49
|
platform: "Building2",
|
package/dist/icons/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/icons/index.ts"],"sourcesContent":["/**\n * Icon Set Registry\n *\n * Contains SVG inner content (path data only, no wrapping <svg> tag) for 4 icon\n * styles. All icons target a 24x24 viewBox with stroke=\"currentColor\" and\n * fill=\"none\" unless the set specifies otherwise.\n *\n * Icon sets: Lucide (default), Heroicons, Phosphor, Material.\n */\n\nimport {\n LUCIDE_ICON_NAMES,\n getLucideIconPath,\n getLucideIconSvgInner,\n isLucideIconName,\n type LucideIconName,\n} from './lucide'\n\nexport type IconSet = 'lucide' | 'heroicons' | 'phosphor' | 'material'\n\n/** SVG inner markup keyed by icon name. */\nexport type IconMap = Record<string, string>\n\n// ---------------------------------------------------------------------------\n// Lucide — canonical icons plus semantic aliases for existing consumers.\n// ---------------------------------------------------------------------------\n\nexport const SEMANTIC_ICON_ALIASES = {\n dashboard: 'LayoutGrid',\n visibility: 'Eye',\n detections: 'Shield',\n intel: 'Radar',\n 'threat-actors': 'Users',\n opportunities: 'Lightbulb',\n 'threat-library': 'BookOpen',\n connectors: 'Plug',\n jobs: 'Workflow',\n settings: 'Settings',\n logout: 'LogOut',\n search: 'Search',\n help: 'CircleAlert',\n user: 'Users',\n sound: 'Activity',\n appearance: 'Sun',\n profile: 'Users',\n organization: 'Building2',\n about: 'CircleAlert',\n activity: 'Activity',\n alerts: 'Siren',\n analytics: 'BarChart3',\n api: 'Code2',\n 'api-access': 'KeyRound',\n authentication: 'Lock',\n actors: 'Users',\n bell: 'Siren',\n capacity: 'Gauge',\n 'circle-help': 'CircleAlert',\n code: 'Code2',\n confidence: 'ShieldCheck',\n coverage: 'ShieldCheck',\n docs: 'BookOpen',\n 'intel-reports': 'FileText',\n integrations: 'Plug',\n library: 'BookOpen',\n mitre: 'Grid3X3',\n notifications: 'Siren',\n passkeys: 'KeyRound',\n pipeline: 'Workflow',\n platform: 'Building2',\n reports: 'FileText',\n runners: 'Server',\n telemetry: 'Activity',\n tenants: 'Building2',\n theme: 'Sun',\n topology: 'Network',\n} as const satisfies Record<string, LucideIconName>\n\nexport type SemanticIconName = keyof typeof SEMANTIC_ICON_ALIASES\nexport type IconName = LucideIconName | SemanticIconName\nexport type IconSize = 12 | 14 | 16 | 18 | 20 | 24\n\nexport interface IconOptions {\n name: string\n size?: IconSize\n ariaLabel?: string\n className?: string\n title?: string\n}\n\nexport function resolveLucideIconName(name: string): LucideIconName | undefined {\n if (isLucideIconName(name)) {\n return name\n }\n return SEMANTIC_ICON_ALIASES[name as SemanticIconName]\n}\n\nfunction createLucideIconMap(): IconMap {\n const map: IconMap = {}\n\n for (const iconName of LUCIDE_ICON_NAMES) {\n const inner = getLucideIconSvgInner(iconName)\n if (inner !== undefined) {\n map[iconName] = inner\n }\n }\n\n for (const [alias, canonicalName] of Object.entries(SEMANTIC_ICON_ALIASES)) {\n const inner = getLucideIconSvgInner(canonicalName)\n if (inner !== undefined) {\n map[alias] = inner\n }\n }\n\n return map\n}\n\nconst lucide = createLucideIconMap()\n\n// ---------------------------------------------------------------------------\n// Heroicons — outline style (24x24, stroke-width 1.5)\n// ---------------------------------------------------------------------------\n\nconst heroicons: IconMap = {\n dashboard: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M3.75 6A2.25 2.25 0 0 1 6 3.75h2.25A2.25 2.25 0 0 1 10.5 6v2.25a2.25 2.25 0 0 1-2.25 2.25H6a2.25 2.25 0 0 1-2.25-2.25V6ZM3.75 15.75A2.25 2.25 0 0 1 6 13.5h2.25a2.25 2.25 0 0 1 2.25 2.25V18a2.25 2.25 0 0 1-2.25 2.25H6A2.25 2.25 0 0 1 3.75 18v-2.25ZM13.5 6a2.25 2.25 0 0 1 2.25-2.25H18A2.25 2.25 0 0 1 20.25 6v2.25A2.25 2.25 0 0 1 18 10.5h-2.25a2.25 2.25 0 0 1-2.25-2.25V6ZM13.5 15.75a2.25 2.25 0 0 1 2.25-2.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-2.25a2.25 2.25 0 0 1-2.25-2.25v-2.25Z\"/>`,\n\n visibility: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"/>`,\n\n detections: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z\"/>`,\n\n intel: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 5.625c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125\"/>`,\n\n 'threat-actors': `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm0 4.5a5.25 5.25 0 1 0 0 10.5 5.25 5.25 0 0 0 0-10.5Zm0 3a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z\"/>`,\n\n opportunities: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M12 18v-5.25m0 0a6.01 6.01 0 0 0 1.5-.189m-1.5.189a6.01 6.01 0 0 1-1.5-.189m3.75 7.478a12.06 12.06 0 0 1-4.5 0m3.75 2.383a14.406 14.406 0 0 1-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 1 0-7.517 0c.85.493 1.509 1.333 1.509 2.316V18\"/>`,\n\n 'threat-library': `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25\"/>`,\n\n connectors: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244\"/>`,\n\n jobs: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75 2.25 2.25 0 0 0-.1-.664m-5.8 0A2.251 2.251 0 0 1 13.5 2.25H15a2.25 2.25 0 0 1 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0 1 18 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3 1.5 1.5 3-3.75\"/>`,\n\n settings: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 0 1 0 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 0 1 0-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"/>`,\n\n logout: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9\"/>`,\n\n search: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z\"/>`,\n\n help: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z\"/>`,\n\n user: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z\"/>`,\n\n sound: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M19.114 5.636a9 9 0 0 1 0 12.728M16.463 8.288a5.25 5.25 0 0 1 0 7.424M6.75 8.25l4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.009 9.009 0 0 1 2.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75Z\"/>`,\n\n appearance: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z\"/>`,\n\n profile: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M17.982 18.725A7.488 7.488 0 0 0 12 15.75a7.488 7.488 0 0 0-5.982 2.975m11.963 0a9 9 0 1 0-11.963 0m11.963 0A8.966 8.966 0 0 1 12 21a8.966 8.966 0 0 1-5.982-2.275M15 9.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"/>`,\n\n organization: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z\"/>`,\n\n about: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z\"/>`,\n}\n\n// ---------------------------------------------------------------------------\n// Phosphor — regular style (24x24, stroke-width 1.5)\n// ---------------------------------------------------------------------------\n\nconst phosphor: IconMap = {\n dashboard: `<rect x=\"3\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\" stroke-width=\"1.5\"/><rect x=\"3\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\" stroke-width=\"1.5\"/>`,\n\n visibility: `<path stroke-width=\"1.5\" d=\"M12 5C5.636 5 2 12 2 12s3.636 7 10 7 10-7 10-7-3.636-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\" stroke-width=\"1.5\"/>`,\n\n detections: `<path stroke-width=\"1.5\" d=\"M12 2.5 3 7v6c0 5.25 3.75 10.13 9 11.5 5.25-1.37 9-6.25 9-11.5V7l-9-4.5Z\"/>`,\n\n intel: `<ellipse cx=\"12\" cy=\"6\" rx=\"9\" ry=\"3.5\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M3 6v5.5c0 1.933 4.03 3.5 9 3.5s9-1.567 9-3.5V6\"/><path stroke-width=\"1.5\" d=\"M3 11.5V17c0 1.933 4.03 3.5 9 3.5s9-1.567 9-3.5v-5.5\"/>`,\n\n 'threat-actors': `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><circle cx=\"12\" cy=\"12\" r=\"6\" stroke-width=\"1.5\"/><circle cx=\"12\" cy=\"12\" r=\"2\" stroke-width=\"1.5\"/>`,\n\n opportunities: `<path stroke-width=\"1.5\" d=\"M9 21h6M9 18h6\"/><path stroke-width=\"1.5\" d=\"M15 14c.333-1 1.167-1.833 2-2.5S18.5 9.333 18.5 8a6.5 6.5 0 0 0-13 0c0 1.333.667 2.833 1.5 3.5s1.667 1.5 2 2.5\"/>`,\n\n 'threat-library': `<path stroke-width=\"1.5\" d=\"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v15H6.5A2.5 2.5 0 0 0 4 19.5Zm0 0A2.5 2.5 0 0 0 6.5 22H20\"/><path stroke-width=\"1.5\" d=\"M9 7h6\"/>`,\n\n connectors: `<path stroke-width=\"1.5\" d=\"M12 22v-4M9 8V3M15 8V3\"/><rect x=\"6\" y=\"8\" width=\"12\" height=\"8\" rx=\"2\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M6 18h12\"/>`,\n\n jobs: `<rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M16 4h3a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h3\"/><path stroke-width=\"1.5\" d=\"M9 12h6M9 16h4\"/>`,\n\n settings: `<circle cx=\"12\" cy=\"12\" r=\"3\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M13.7 2h-3.4l-.5 2.7a7 7 0 0 0-1.7 1l-2.6-.9-1.7 3 2.1 1.8a7 7 0 0 0 0 2l-2.1 1.8 1.7 3 2.6-.9a7 7 0 0 0 1.7 1l.5 2.5h3.4l.5-2.5a7 7 0 0 0 1.7-1l2.6.9 1.7-3-2.1-1.8a7 7 0 0 0 0-2l2.1-1.8-1.7-3-2.6.9a7 7 0 0 0-1.7-1L13.7 2Z\"/>`,\n\n logout: `<path stroke-width=\"1.5\" d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><path stroke-width=\"1.5\" d=\"M16 17l5-5-5-5\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" stroke-width=\"1.5\"/>`,\n\n search: `<circle cx=\"11\" cy=\"11\" r=\"7\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"m21 21-4.35-4.35\"/>`,\n\n help: `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"/><circle cx=\"12\" cy=\"17\" r=\"0.5\" fill=\"currentColor\"/>`,\n\n user: `<circle cx=\"12\" cy=\"8\" r=\"4\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M5 20c0-3.5 3.1-6 7-6s7 2.5 7 6\"/>`,\n\n sound: `<path stroke-width=\"1.5\" d=\"M11 5 6 9H2v6h4l5 4V5Z\"/><path stroke-width=\"1.5\" d=\"M15.54 8.46a5 5 0 0 1 0 7.08\"/><path stroke-width=\"1.5\" d=\"M19.07 4.93a10 10 0 0 1 0 14.14\"/>`,\n\n appearance: `<path stroke-width=\"1.5\" d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Z\"/><path stroke-width=\"1.5\" d=\"M12 2v20\" /><path stroke-width=\"1.5\" d=\"M12 2a10 10 0 0 1 0 20\" fill=\"currentColor\" opacity=\"0.15\"/>`,\n\n profile: `<circle cx=\"12\" cy=\"8\" r=\"4\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M20 21v-1a6 6 0 0 0-6-6h-4a6 6 0 0 0-6 6v1\"/>`,\n\n organization: `<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M7 8h10M7 12h7M7 16h5\"/>`,\n\n about: `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M12 16v-4\"/><circle cx=\"12\" cy=\"8\" r=\"0.5\" fill=\"currentColor\"/>`,\n}\n\n// ---------------------------------------------------------------------------\n// Material — symbols outlined style (24x24, stroke-width 2)\n// ---------------------------------------------------------------------------\n\nconst material: IconMap = {\n dashboard: `<path d=\"M3 13h8V3H3v10Zm0 8h8v-6H3v6Zm10 0h8V11h-8v10Zm0-18v6h8V3h-8Z\" fill=\"currentColor\" opacity=\"0.15\"/><path stroke-width=\"1.5\" d=\"M3 13h8V3H3v10Zm0 8h8v-6H3v6Zm10 0h8V11h-8v10Zm0-18v6h8V3h-8Z\"/>`,\n\n visibility: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5Z\"/><circle cx=\"12\" cy=\"12\" r=\"3.5\" stroke-width=\"1.5\"/>`,\n\n detections: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 2 4 5v6.09c0 5.05 3.41 9.76 8 10.91 4.59-1.15 8-5.86 8-10.91V5l-8-3Z\"/>`,\n\n intel: `<ellipse cx=\"12\" cy=\"5.5\" rx=\"8.5\" ry=\"3\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M3.5 5.5v5c0 1.657 3.806 3 8.5 3s8.5-1.343 8.5-3v-5\"/><path stroke-width=\"1.5\" d=\"M3.5 10.5v5c0 1.657 3.806 3 8.5 3s8.5-1.343 8.5-3v-5\"/>`,\n\n 'threat-actors': `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><circle cx=\"12\" cy=\"12\" r=\"6\" stroke-width=\"1.5\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\" stroke-width=\"1.5\"/>`,\n\n opportunities: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 21h6M10 17h4\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 2a7 7 0 0 0-7 7c0 2.38 1.19 4.47 3 5.74V17h8v-2.26c1.81-1.27 3-3.36 3-5.74a7 7 0 0 0-7-7Z\"/>`,\n\n 'threat-library': `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M18 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2Z\"/><path stroke-width=\"1.5\" d=\"M8 7h8M8 11h8M8 15h5\"/>`,\n\n connectors: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6.364-6.364a2.121 2.121 0 0 1 3 0l3.75 3.75a2.121 2.121 0 0 1 0 3L11.25 19.5\"/><path stroke-width=\"1.5\" d=\"M8 8l-4 4M20 12l-4 4M14 6l2-2M12 20l-2 2\"/>`,\n\n jobs: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 2h6v3H9V2ZM5 5h14a1 1 0 0 1 1 1v15a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1Z\"/><path stroke-width=\"1.5\" d=\"M9 12h6M9 16h4\"/>`,\n\n settings: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1V14a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9c.26.604.852.997 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z\"/>`,\n\n logout: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9\"/>`,\n\n search: `<circle cx=\"10.5\" cy=\"10.5\" r=\"7\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" d=\"m21 21-4.95-4.95\"/>`,\n\n help: `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" d=\"M9 9a3 3 0 1 1 3.6 2.94c-.6.12-1.1.54-1.1 1.16v.9\"/><circle cx=\"12\" cy=\"17\" r=\"0.5\" fill=\"currentColor\"/>`,\n\n user: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm-8 9c0-3.5 3.6-6.5 8-6.5s8 3 8 6.5\"/>`,\n\n sound: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 9v6h4l5 5V4L7 9H3Z\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" d=\"M16.5 7.5a6.5 6.5 0 0 1 0 9M19.5 4.5a11 11 0 0 1 0 15\"/>`,\n\n appearance: `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M12 2v20\"/><path d=\"M12 2a10 10 0 0 1 0 20\" fill=\"currentColor\" opacity=\"0.15\"/>`,\n\n profile: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Z\"/><circle cx=\"12\" cy=\"9\" r=\"3\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M6.168 18.849A5.992 5.992 0 0 1 12 15a5.992 5.992 0 0 1 5.832 3.849\"/>`,\n\n organization: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6Z\"/><path stroke-width=\"1.5\" d=\"M14 2v6h6\"/><path stroke-width=\"1.5\" d=\"M8 13h8M8 17h5\"/>`,\n\n about: `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" d=\"M12 16v-4M12 8h.01\"/>`,\n}\n\n// ---------------------------------------------------------------------------\n// Exports\n// ---------------------------------------------------------------------------\n\nexport const ICON_SETS: Record<IconSet, IconMap> = {\n lucide,\n heroicons,\n phosphor,\n material,\n}\n\nexport function getIconSvgInner(set: IconSet, name: string): string | undefined {\n return ICON_SETS[set][name]\n}\n\nexport {\n LUCIDE_ICON_NAMES,\n LUCIDE_ICON_PATHS,\n getLucideIconPath,\n getLucideIconSvgInner,\n isLucideIconName,\n} from './lucide'\nexport type { LucideIconName } from './lucide'\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\nconst DEFAULT_ICON_SIZE: IconSize = 16\nconst ATTRIBUTE_ESCAPE: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n}\n\nfunction escapeAttribute(value: string): string {\n return value.replace(/[&<>\"']/g, char => ATTRIBUTE_ESCAPE[char] ?? char)\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/[&<>]/g, char => ATTRIBUTE_ESCAPE[char] ?? char)\n}\n\nfunction getAccessibleLabel(options: IconOptions): string | undefined {\n return options.ariaLabel ?? options.title\n}\n\nfunction buildIconClassName(size: IconSize, className?: string): string {\n return Array.from(\n new Set([\n 'cmm-icon',\n `icon-${String(size)}`,\n ...(className?.split(/\\s+/).filter(Boolean) ?? []),\n ])\n ).join(' ')\n}\n\nexport function createIcon(options: IconOptions): SVGSVGElement {\n const size = options.size ?? DEFAULT_ICON_SIZE\n const className = buildIconClassName(size, options.className)\n const svg = document.createElementNS(SVG_NS, 'svg')\n const resolvedName = resolveLucideIconName(options.name)\n const path = resolvedName === undefined ? undefined : getLucideIconPath(resolvedName)\n const accessibleLabel = getAccessibleLabel(options)\n\n svg.setAttribute('xmlns', SVG_NS)\n svg.setAttribute('width', String(size))\n svg.setAttribute('height', String(size))\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.setAttribute('focusable', 'false')\n svg.setAttribute('data-icon', options.name)\n\n if (resolvedName !== undefined) {\n svg.setAttribute('data-lucide', resolvedName)\n }\n\n svg.setAttribute('class', className)\n\n if (accessibleLabel !== undefined && accessibleLabel.length > 0) {\n svg.setAttribute('role', 'img')\n svg.setAttribute('aria-label', accessibleLabel)\n } else {\n svg.setAttribute('aria-hidden', 'true')\n }\n\n if (options.title !== undefined && options.title.length > 0) {\n const title = document.createElementNS(SVG_NS, 'title')\n title.textContent = options.title\n svg.appendChild(title)\n }\n\n if (path !== undefined) {\n const pathEl = document.createElementNS(SVG_NS, 'path')\n pathEl.setAttribute('d', path)\n svg.appendChild(pathEl)\n }\n\n return svg\n}\n\nexport function renderIcon(options: IconOptions): string {\n const size = options.size ?? DEFAULT_ICON_SIZE\n const resolvedName = resolveLucideIconName(options.name)\n const inner = resolvedName === undefined ? '' : (getLucideIconSvgInner(resolvedName) ?? '')\n const accessibleLabel = getAccessibleLabel(options)\n const className = buildIconClassName(size, options.className)\n const attrs = [\n `xmlns=\"${SVG_NS}\"`,\n `width=\"${String(size)}\"`,\n `height=\"${String(size)}\"`,\n `class=\"${escapeAttribute(className)}\"`,\n 'viewBox=\"0 0 24 24\"',\n 'fill=\"none\"',\n 'stroke=\"currentColor\"',\n 'stroke-width=\"2\"',\n 'stroke-linecap=\"round\"',\n 'stroke-linejoin=\"round\"',\n 'focusable=\"false\"',\n `data-icon=\"${escapeAttribute(options.name)}\"`,\n ]\n\n if (resolvedName !== undefined) {\n attrs.push(`data-lucide=\"${resolvedName}\"`)\n }\n\n if (accessibleLabel !== undefined && accessibleLabel.length > 0) {\n attrs.push('role=\"img\"', `aria-label=\"${escapeAttribute(accessibleLabel)}\"`)\n } else {\n attrs.push('aria-hidden=\"true\"')\n }\n\n const title =\n options.title !== undefined && options.title.length > 0\n ? `<title>${escapeText(options.title)}</title>`\n : ''\n\n return `<svg ${attrs.join(' ')}>${title}${inner}</svg>`\n}\n\nexport class Icon {\n public readonly el: SVGSVGElement\n private readonly options: IconOptions\n\n constructor(options: IconOptions) {\n this.options = { ...options }\n this.el = createIcon(options)\n }\n\n toString(): string {\n return renderIcon(this.options)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/icons/index.ts"],"sourcesContent":["/**\n * Icon Set Registry\n *\n * Contains SVG inner content (path data only, no wrapping <svg> tag) for 4 icon\n * styles. All icons target a 24x24 viewBox with stroke=\"currentColor\" and\n * fill=\"none\" unless the set specifies otherwise.\n *\n * Icon sets: Lucide (default), Heroicons, Phosphor, Material.\n */\n\nimport {\n LUCIDE_ICON_NAMES,\n getLucideIconPath,\n getLucideIconSvgInner,\n isLucideIconName,\n type LucideIconName,\n} from './lucide'\n\nexport type IconSet = 'lucide' | 'heroicons' | 'phosphor' | 'material'\n\n/** SVG inner markup keyed by icon name. */\nexport type IconMap = Record<string, string>\n\n// ---------------------------------------------------------------------------\n// Lucide — canonical icons plus semantic aliases for existing consumers.\n// ---------------------------------------------------------------------------\n\nexport const SEMANTIC_ICON_ALIASES = {\n dashboard: 'LayoutGrid',\n visibility: 'Eye',\n detections: 'Shield',\n intel: 'Radar',\n 'threat-actors': 'Users',\n opportunities: 'Lightbulb',\n 'threat-library': 'BookOpen',\n connectors: 'Plug',\n jobs: 'Workflow',\n settings: 'Settings',\n logout: 'LogOut',\n search: 'Search',\n help: 'CircleAlert',\n user: 'Users',\n sound: 'Activity',\n appearance: 'Sun',\n profile: 'Users',\n organization: 'Building2',\n about: 'CircleAlert',\n activity: 'Activity',\n alerts: 'Siren',\n analytics: 'BarChart3',\n api: 'Code2',\n 'api-access': 'KeyRound',\n authentication: 'Lock',\n actors: 'Users',\n bell: 'Bell',\n capacity: 'Gauge',\n 'circle-help': 'CircleAlert',\n code: 'Code2',\n confidence: 'ShieldCheck',\n coverage: 'ShieldCheck',\n docs: 'BookOpen',\n 'intel-reports': 'FileText',\n integrations: 'Plug',\n library: 'BookOpen',\n mitre: 'Grid3X3',\n dark: 'Moon',\n light: 'Sun',\n midnight: 'Monitor',\n monitor: 'Monitor',\n moon: 'Moon',\n notifications: 'Bell',\n passkeys: 'KeyRound',\n pipeline: 'Workflow',\n platform: 'Building2',\n reports: 'FileText',\n runners: 'Server',\n telemetry: 'Activity',\n tenants: 'Building2',\n theme: 'Sun',\n topology: 'Network',\n} as const satisfies Record<string, LucideIconName>\n\nexport type SemanticIconName = keyof typeof SEMANTIC_ICON_ALIASES\nexport type IconName = LucideIconName | SemanticIconName\nexport type IconSize = 12 | 14 | 16 | 18 | 20 | 24\n\nexport interface IconOptions {\n name: string\n size?: IconSize\n ariaLabel?: string\n className?: string\n title?: string\n}\n\nexport function resolveLucideIconName(name: string): LucideIconName | undefined {\n if (isLucideIconName(name)) {\n return name\n }\n return SEMANTIC_ICON_ALIASES[name as SemanticIconName]\n}\n\nfunction createLucideIconMap(): IconMap {\n const map: IconMap = {}\n\n for (const iconName of LUCIDE_ICON_NAMES) {\n const inner = getLucideIconSvgInner(iconName)\n if (inner !== undefined) {\n map[iconName] = inner\n }\n }\n\n for (const [alias, canonicalName] of Object.entries(SEMANTIC_ICON_ALIASES)) {\n const inner = getLucideIconSvgInner(canonicalName)\n if (inner !== undefined) {\n map[alias] = inner\n }\n }\n\n return map\n}\n\nconst lucide = createLucideIconMap()\n\n// ---------------------------------------------------------------------------\n// Heroicons — outline style (24x24, stroke-width 1.5)\n// ---------------------------------------------------------------------------\n\nconst heroicons: IconMap = {\n dashboard: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M3.75 6A2.25 2.25 0 0 1 6 3.75h2.25A2.25 2.25 0 0 1 10.5 6v2.25a2.25 2.25 0 0 1-2.25 2.25H6a2.25 2.25 0 0 1-2.25-2.25V6ZM3.75 15.75A2.25 2.25 0 0 1 6 13.5h2.25a2.25 2.25 0 0 1 2.25 2.25V18a2.25 2.25 0 0 1-2.25 2.25H6A2.25 2.25 0 0 1 3.75 18v-2.25ZM13.5 6a2.25 2.25 0 0 1 2.25-2.25H18A2.25 2.25 0 0 1 20.25 6v2.25A2.25 2.25 0 0 1 18 10.5h-2.25a2.25 2.25 0 0 1-2.25-2.25V6ZM13.5 15.75a2.25 2.25 0 0 1 2.25-2.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-2.25a2.25 2.25 0 0 1-2.25-2.25v-2.25Z\"/>`,\n\n visibility: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"/>`,\n\n detections: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z\"/>`,\n\n intel: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 5.625c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125\"/>`,\n\n 'threat-actors': `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm0 4.5a5.25 5.25 0 1 0 0 10.5 5.25 5.25 0 0 0 0-10.5Zm0 3a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z\"/>`,\n\n opportunities: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M12 18v-5.25m0 0a6.01 6.01 0 0 0 1.5-.189m-1.5.189a6.01 6.01 0 0 1-1.5-.189m3.75 7.478a12.06 12.06 0 0 1-4.5 0m3.75 2.383a14.406 14.406 0 0 1-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 1 0-7.517 0c.85.493 1.509 1.333 1.509 2.316V18\"/>`,\n\n 'threat-library': `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25\"/>`,\n\n connectors: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244\"/>`,\n\n jobs: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75 2.25 2.25 0 0 0-.1-.664m-5.8 0A2.251 2.251 0 0 1 13.5 2.25H15a2.25 2.25 0 0 1 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0 1 18 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3 1.5 1.5 3-3.75\"/>`,\n\n settings: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 0 1 0 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 0 1 0-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"/>`,\n\n logout: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9\"/>`,\n\n search: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z\"/>`,\n\n help: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z\"/>`,\n\n user: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z\"/>`,\n\n sound: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M19.114 5.636a9 9 0 0 1 0 12.728M16.463 8.288a5.25 5.25 0 0 1 0 7.424M6.75 8.25l4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.009 9.009 0 0 1 2.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75Z\"/>`,\n\n appearance: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z\"/>`,\n\n profile: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M17.982 18.725A7.488 7.488 0 0 0 12 15.75a7.488 7.488 0 0 0-5.982 2.975m11.963 0a9 9 0 1 0-11.963 0m11.963 0A8.966 8.966 0 0 1 12 21a8.966 8.966 0 0 1-5.982-2.275M15 9.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"/>`,\n\n organization: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z\"/>`,\n\n about: `<path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z\"/>`,\n}\n\n// ---------------------------------------------------------------------------\n// Phosphor — regular style (24x24, stroke-width 1.5)\n// ---------------------------------------------------------------------------\n\nconst phosphor: IconMap = {\n dashboard: `<rect x=\"3\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\" stroke-width=\"1.5\"/><rect x=\"3\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\" stroke-width=\"1.5\"/><rect x=\"13\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\" stroke-width=\"1.5\"/>`,\n\n visibility: `<path stroke-width=\"1.5\" d=\"M12 5C5.636 5 2 12 2 12s3.636 7 10 7 10-7 10-7-3.636-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\" stroke-width=\"1.5\"/>`,\n\n detections: `<path stroke-width=\"1.5\" d=\"M12 2.5 3 7v6c0 5.25 3.75 10.13 9 11.5 5.25-1.37 9-6.25 9-11.5V7l-9-4.5Z\"/>`,\n\n intel: `<ellipse cx=\"12\" cy=\"6\" rx=\"9\" ry=\"3.5\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M3 6v5.5c0 1.933 4.03 3.5 9 3.5s9-1.567 9-3.5V6\"/><path stroke-width=\"1.5\" d=\"M3 11.5V17c0 1.933 4.03 3.5 9 3.5s9-1.567 9-3.5v-5.5\"/>`,\n\n 'threat-actors': `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><circle cx=\"12\" cy=\"12\" r=\"6\" stroke-width=\"1.5\"/><circle cx=\"12\" cy=\"12\" r=\"2\" stroke-width=\"1.5\"/>`,\n\n opportunities: `<path stroke-width=\"1.5\" d=\"M9 21h6M9 18h6\"/><path stroke-width=\"1.5\" d=\"M15 14c.333-1 1.167-1.833 2-2.5S18.5 9.333 18.5 8a6.5 6.5 0 0 0-13 0c0 1.333.667 2.833 1.5 3.5s1.667 1.5 2 2.5\"/>`,\n\n 'threat-library': `<path stroke-width=\"1.5\" d=\"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v15H6.5A2.5 2.5 0 0 0 4 19.5Zm0 0A2.5 2.5 0 0 0 6.5 22H20\"/><path stroke-width=\"1.5\" d=\"M9 7h6\"/>`,\n\n connectors: `<path stroke-width=\"1.5\" d=\"M12 22v-4M9 8V3M15 8V3\"/><rect x=\"6\" y=\"8\" width=\"12\" height=\"8\" rx=\"2\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M6 18h12\"/>`,\n\n jobs: `<rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M16 4h3a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h3\"/><path stroke-width=\"1.5\" d=\"M9 12h6M9 16h4\"/>`,\n\n settings: `<circle cx=\"12\" cy=\"12\" r=\"3\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M13.7 2h-3.4l-.5 2.7a7 7 0 0 0-1.7 1l-2.6-.9-1.7 3 2.1 1.8a7 7 0 0 0 0 2l-2.1 1.8 1.7 3 2.6-.9a7 7 0 0 0 1.7 1l.5 2.5h3.4l.5-2.5a7 7 0 0 0 1.7-1l2.6.9 1.7-3-2.1-1.8a7 7 0 0 0 0-2l2.1-1.8-1.7-3-2.6.9a7 7 0 0 0-1.7-1L13.7 2Z\"/>`,\n\n logout: `<path stroke-width=\"1.5\" d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><path stroke-width=\"1.5\" d=\"M16 17l5-5-5-5\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" stroke-width=\"1.5\"/>`,\n\n search: `<circle cx=\"11\" cy=\"11\" r=\"7\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"m21 21-4.35-4.35\"/>`,\n\n help: `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"/><circle cx=\"12\" cy=\"17\" r=\"0.5\" fill=\"currentColor\"/>`,\n\n user: `<circle cx=\"12\" cy=\"8\" r=\"4\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M5 20c0-3.5 3.1-6 7-6s7 2.5 7 6\"/>`,\n\n sound: `<path stroke-width=\"1.5\" d=\"M11 5 6 9H2v6h4l5 4V5Z\"/><path stroke-width=\"1.5\" d=\"M15.54 8.46a5 5 0 0 1 0 7.08\"/><path stroke-width=\"1.5\" d=\"M19.07 4.93a10 10 0 0 1 0 14.14\"/>`,\n\n appearance: `<path stroke-width=\"1.5\" d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Z\"/><path stroke-width=\"1.5\" d=\"M12 2v20\" /><path stroke-width=\"1.5\" d=\"M12 2a10 10 0 0 1 0 20\" fill=\"currentColor\" opacity=\"0.15\"/>`,\n\n profile: `<circle cx=\"12\" cy=\"8\" r=\"4\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M20 21v-1a6 6 0 0 0-6-6h-4a6 6 0 0 0-6 6v1\"/>`,\n\n organization: `<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M7 8h10M7 12h7M7 16h5\"/>`,\n\n about: `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M12 16v-4\"/><circle cx=\"12\" cy=\"8\" r=\"0.5\" fill=\"currentColor\"/>`,\n}\n\n// ---------------------------------------------------------------------------\n// Material — symbols outlined style (24x24, stroke-width 2)\n// ---------------------------------------------------------------------------\n\nconst material: IconMap = {\n dashboard: `<path d=\"M3 13h8V3H3v10Zm0 8h8v-6H3v6Zm10 0h8V11h-8v10Zm0-18v6h8V3h-8Z\" fill=\"currentColor\" opacity=\"0.15\"/><path stroke-width=\"1.5\" d=\"M3 13h8V3H3v10Zm0 8h8v-6H3v6Zm10 0h8V11h-8v10Zm0-18v6h8V3h-8Z\"/>`,\n\n visibility: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5Z\"/><circle cx=\"12\" cy=\"12\" r=\"3.5\" stroke-width=\"1.5\"/>`,\n\n detections: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 2 4 5v6.09c0 5.05 3.41 9.76 8 10.91 4.59-1.15 8-5.86 8-10.91V5l-8-3Z\"/>`,\n\n intel: `<ellipse cx=\"12\" cy=\"5.5\" rx=\"8.5\" ry=\"3\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M3.5 5.5v5c0 1.657 3.806 3 8.5 3s8.5-1.343 8.5-3v-5\"/><path stroke-width=\"1.5\" d=\"M3.5 10.5v5c0 1.657 3.806 3 8.5 3s8.5-1.343 8.5-3v-5\"/>`,\n\n 'threat-actors': `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><circle cx=\"12\" cy=\"12\" r=\"6\" stroke-width=\"1.5\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\" stroke-width=\"1.5\"/>`,\n\n opportunities: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 21h6M10 17h4\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 2a7 7 0 0 0-7 7c0 2.38 1.19 4.47 3 5.74V17h8v-2.26c1.81-1.27 3-3.36 3-5.74a7 7 0 0 0-7-7Z\"/>`,\n\n 'threat-library': `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M18 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2Z\"/><path stroke-width=\"1.5\" d=\"M8 7h8M8 11h8M8 15h5\"/>`,\n\n connectors: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6.364-6.364a2.121 2.121 0 0 1 3 0l3.75 3.75a2.121 2.121 0 0 1 0 3L11.25 19.5\"/><path stroke-width=\"1.5\" d=\"M8 8l-4 4M20 12l-4 4M14 6l2-2M12 20l-2 2\"/>`,\n\n jobs: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 2h6v3H9V2ZM5 5h14a1 1 0 0 1 1 1v15a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1Z\"/><path stroke-width=\"1.5\" d=\"M9 12h6M9 16h4\"/>`,\n\n settings: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1V14a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9c.26.604.852.997 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z\"/>`,\n\n logout: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9\"/>`,\n\n search: `<circle cx=\"10.5\" cy=\"10.5\" r=\"7\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" d=\"m21 21-4.95-4.95\"/>`,\n\n help: `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" d=\"M9 9a3 3 0 1 1 3.6 2.94c-.6.12-1.1.54-1.1 1.16v.9\"/><circle cx=\"12\" cy=\"17\" r=\"0.5\" fill=\"currentColor\"/>`,\n\n user: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm-8 9c0-3.5 3.6-6.5 8-6.5s8 3 8 6.5\"/>`,\n\n sound: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 9v6h4l5 5V4L7 9H3Z\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" d=\"M16.5 7.5a6.5 6.5 0 0 1 0 9M19.5 4.5a11 11 0 0 1 0 15\"/>`,\n\n appearance: `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M12 2v20\"/><path d=\"M12 2a10 10 0 0 1 0 20\" fill=\"currentColor\" opacity=\"0.15\"/>`,\n\n profile: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Z\"/><circle cx=\"12\" cy=\"9\" r=\"3\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" d=\"M6.168 18.849A5.992 5.992 0 0 1 12 15a5.992 5.992 0 0 1 5.832 3.849\"/>`,\n\n organization: `<path stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6Z\"/><path stroke-width=\"1.5\" d=\"M14 2v6h6\"/><path stroke-width=\"1.5\" d=\"M8 13h8M8 17h5\"/>`,\n\n about: `<circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"1.5\"/><path stroke-width=\"1.5\" stroke-linecap=\"round\" d=\"M12 16v-4M12 8h.01\"/>`,\n}\n\n// ---------------------------------------------------------------------------\n// Exports\n// ---------------------------------------------------------------------------\n\nexport const ICON_SETS: Record<IconSet, IconMap> = {\n lucide,\n heroicons,\n phosphor,\n material,\n}\n\nexport function getIconSvgInner(set: IconSet, name: string): string | undefined {\n return ICON_SETS[set][name]\n}\n\nexport {\n LUCIDE_ICON_NAMES,\n LUCIDE_ICON_PATHS,\n getLucideIconPath,\n getLucideIconSvgInner,\n isLucideIconName,\n} from './lucide'\nexport type { LucideIconName } from './lucide'\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\nconst DEFAULT_ICON_SIZE: IconSize = 16\nconst ATTRIBUTE_ESCAPE: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n}\n\nfunction escapeAttribute(value: string): string {\n return value.replace(/[&<>\"']/g, char => ATTRIBUTE_ESCAPE[char] ?? char)\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/[&<>]/g, char => ATTRIBUTE_ESCAPE[char] ?? char)\n}\n\nfunction getAccessibleLabel(options: IconOptions): string | undefined {\n return options.ariaLabel ?? options.title\n}\n\nfunction buildIconClassName(size: IconSize, className?: string): string {\n return Array.from(\n new Set([\n 'cmm-icon',\n `icon-${String(size)}`,\n ...(className?.split(/\\s+/).filter(Boolean) ?? []),\n ])\n ).join(' ')\n}\n\nexport function createIcon(options: IconOptions): SVGSVGElement {\n const size = options.size ?? DEFAULT_ICON_SIZE\n const className = buildIconClassName(size, options.className)\n const svg = document.createElementNS(SVG_NS, 'svg')\n const resolvedName = resolveLucideIconName(options.name)\n const path = resolvedName === undefined ? undefined : getLucideIconPath(resolvedName)\n const accessibleLabel = getAccessibleLabel(options)\n\n svg.setAttribute('xmlns', SVG_NS)\n svg.setAttribute('width', String(size))\n svg.setAttribute('height', String(size))\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.setAttribute('focusable', 'false')\n svg.setAttribute('data-icon', options.name)\n\n if (resolvedName !== undefined) {\n svg.setAttribute('data-lucide', resolvedName)\n }\n\n svg.setAttribute('class', className)\n\n if (accessibleLabel !== undefined && accessibleLabel.length > 0) {\n svg.setAttribute('role', 'img')\n svg.setAttribute('aria-label', accessibleLabel)\n } else {\n svg.setAttribute('aria-hidden', 'true')\n }\n\n if (options.title !== undefined && options.title.length > 0) {\n const title = document.createElementNS(SVG_NS, 'title')\n title.textContent = options.title\n svg.appendChild(title)\n }\n\n if (path !== undefined) {\n const pathEl = document.createElementNS(SVG_NS, 'path')\n pathEl.setAttribute('d', path)\n svg.appendChild(pathEl)\n }\n\n return svg\n}\n\nexport function renderIcon(options: IconOptions): string {\n const size = options.size ?? DEFAULT_ICON_SIZE\n const resolvedName = resolveLucideIconName(options.name)\n const inner = resolvedName === undefined ? '' : (getLucideIconSvgInner(resolvedName) ?? '')\n const accessibleLabel = getAccessibleLabel(options)\n const className = buildIconClassName(size, options.className)\n const attrs = [\n `xmlns=\"${SVG_NS}\"`,\n `width=\"${String(size)}\"`,\n `height=\"${String(size)}\"`,\n `class=\"${escapeAttribute(className)}\"`,\n 'viewBox=\"0 0 24 24\"',\n 'fill=\"none\"',\n 'stroke=\"currentColor\"',\n 'stroke-width=\"2\"',\n 'stroke-linecap=\"round\"',\n 'stroke-linejoin=\"round\"',\n 'focusable=\"false\"',\n `data-icon=\"${escapeAttribute(options.name)}\"`,\n ]\n\n if (resolvedName !== undefined) {\n attrs.push(`data-lucide=\"${resolvedName}\"`)\n }\n\n if (accessibleLabel !== undefined && accessibleLabel.length > 0) {\n attrs.push('role=\"img\"', `aria-label=\"${escapeAttribute(accessibleLabel)}\"`)\n } else {\n attrs.push('aria-hidden=\"true\"')\n }\n\n const title =\n options.title !== undefined && options.title.length > 0\n ? `<title>${escapeText(options.title)}</title>`\n : ''\n\n return `<svg ${attrs.join(' ')}>${title}${inner}</svg>`\n}\n\nexport class Icon {\n public readonly el: SVGSVGElement\n private readonly options: IconOptions\n\n constructor(options: IconOptions) {\n this.options = { ...options }\n this.el = createIcon(options)\n }\n\n toString(): string {\n return renderIcon(this.options)\n }\n}\n"],"mappings":"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"}
|
package/dist/icons/lucide.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ export declare const LUCIDE_ICON_PATHS: {
|
|
|
26
26
|
readonly BookOpen: "M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2zM22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z";
|
|
27
27
|
readonly BarChart3: "M3 3v18h18M7 16v-5M12 16v-9M17 16v-3";
|
|
28
28
|
readonly Activity: "M22 12h-4l-3 9L9 3l-3 9H2";
|
|
29
|
+
readonly Bell: "M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9M13.73 21a2 2 0 0 1-3.46 0";
|
|
29
30
|
readonly Siren: "M7 18a5 5 0 1 1 10 0M5 21h14M21 12h1M3 12H2M5.6 5.6l-.7-.7M18.4 5.6l.7-.7M11 4h2v3h-2z";
|
|
30
31
|
readonly Users: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75";
|
|
31
32
|
readonly LayoutGrid: "M3 3h7v7H3zM14 3h7v7h-7zM14 14h7v7h-7zM3 14h7v7H3z";
|
|
@@ -33,6 +34,8 @@ export declare const LUCIDE_ICON_PATHS: {
|
|
|
33
34
|
readonly Settings: "M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2zM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z";
|
|
34
35
|
readonly PanelLeftClose: "M3 3h18v18H3zM9 3v18M16 15l-3-3 3-3";
|
|
35
36
|
readonly LogOut: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9";
|
|
37
|
+
readonly Monitor: "M20 3H4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zM8 21h8M12 17v4";
|
|
38
|
+
readonly Moon: "M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9";
|
|
36
39
|
readonly Sun: "M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41M12 7a5 5 0 1 0 0 10 5 5 0 0 0 0-10z";
|
|
37
40
|
readonly ChevronDown: "m6 9 6 6 6-6";
|
|
38
41
|
readonly ChevronRight: "m9 6 6 6-6 6";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucide.d.ts","sourceRoot":"","sources":["../../src/icons/lucide.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"lucide.d.ts","sourceRoot":"","sources":["../../src/icons/lucide.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEpB,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,iBAAiB,CAAA;AAE3D,eAAO,MAAM,iBAAiB,EAAqC,cAAc,EAAE,CAAA;AAEnF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,cAAc,CAErE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGtE"}
|
package/dist/icons/lucide.js
CHANGED
|
@@ -24,6 +24,7 @@ var e = {
|
|
|
24
24
|
BookOpen: "M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2zM22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z",
|
|
25
25
|
BarChart3: "M3 3v18h18M7 16v-5M12 16v-9M17 16v-3",
|
|
26
26
|
Activity: "M22 12h-4l-3 9L9 3l-3 9H2",
|
|
27
|
+
Bell: "M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9M13.73 21a2 2 0 0 1-3.46 0",
|
|
27
28
|
Siren: "M7 18a5 5 0 1 1 10 0M5 21h14M21 12h1M3 12H2M5.6 5.6l-.7-.7M18.4 5.6l.7-.7M11 4h2v3h-2z",
|
|
28
29
|
Users: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75",
|
|
29
30
|
LayoutGrid: "M3 3h7v7H3zM14 3h7v7h-7zM14 14h7v7h-7zM3 14h7v7H3z",
|
|
@@ -31,6 +32,8 @@ var e = {
|
|
|
31
32
|
Settings: "M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2zM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z",
|
|
32
33
|
PanelLeftClose: "M3 3h18v18H3zM9 3v18M16 15l-3-3 3-3",
|
|
33
34
|
LogOut: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9",
|
|
35
|
+
Monitor: "M20 3H4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zM8 21h8M12 17v4",
|
|
36
|
+
Moon: "M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9",
|
|
34
37
|
Sun: "M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41M12 7a5 5 0 1 0 0 10 5 5 0 0 0 0-10z",
|
|
35
38
|
ChevronDown: "m6 9 6 6 6-6",
|
|
36
39
|
ChevronRight: "m9 6 6 6-6 6",
|