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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/{component-D5sRm1fq.js → component-D_asjmrt.js} +5 -3
  2. package/dist/component-D_asjmrt.js.map +1 -0
  3. package/dist/components/brand/index.d.ts.map +1 -1
  4. package/dist/components/brand/index.js +11 -5
  5. package/dist/components/brand/index.js.map +1 -1
  6. package/dist/components/brand/types.d.ts +2 -0
  7. package/dist/components/brand/types.d.ts.map +1 -1
  8. package/dist/icons/index.d.ts +7 -2
  9. package/dist/icons/index.d.ts.map +1 -1
  10. package/dist/icons/index.js +7 -2
  11. package/dist/icons/index.js.map +1 -1
  12. package/dist/icons/lucide.d.ts +3 -0
  13. package/dist/icons/lucide.d.ts.map +1 -1
  14. package/dist/icons/lucide.js +3 -0
  15. package/dist/icons/lucide.js.map +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +126 -125
  19. package/dist/layout/app-shell.d.ts +7 -0
  20. package/dist/layout/app-shell.d.ts.map +1 -1
  21. package/dist/layout/app-shell.js +24 -6
  22. package/dist/layout/app-shell.js.map +1 -1
  23. package/dist/layout/core-app-chrome.d.ts.map +1 -1
  24. package/dist/layout/core-app-chrome.js +8 -5
  25. package/dist/layout/core-app-chrome.js.map +1 -1
  26. package/dist/layout/core-app-library-dashboard.d.ts +72 -0
  27. package/dist/layout/core-app-library-dashboard.d.ts.map +1 -0
  28. package/dist/layout/core-app-library-dashboard.js +160 -0
  29. package/dist/layout/core-app-library-dashboard.js.map +1 -0
  30. package/dist/layout/index.d.ts +2 -0
  31. package/dist/layout/index.d.ts.map +1 -1
  32. package/dist/layout/index.js +38 -37
  33. package/dist/layout/index.js.map +1 -1
  34. package/dist/react/brand/index.d.ts +3 -1
  35. package/dist/react/brand/index.d.ts.map +1 -1
  36. package/dist/react/brand.js +19 -13
  37. package/dist/react/brand.js.map +1 -1
  38. package/dist/react/layout/core-app-library-dashboard.d.ts +13 -0
  39. package/dist/react/layout/core-app-library-dashboard.d.ts.map +1 -0
  40. package/dist/react/layout/core-app-library-dashboard.js +27 -0
  41. package/dist/react/layout/core-app-library-dashboard.js.map +1 -0
  42. package/dist/react/layout/index.d.ts +1 -0
  43. package/dist/react/layout/index.d.ts.map +1 -1
  44. package/dist/react/layout/index.js +3 -2
  45. package/dist/react/primitives/alert.d.ts +1 -1
  46. package/dist/react/primitives/toast.d.ts +1 -1
  47. package/dist/react/sidebar.js +1 -1
  48. package/dist/react.js +97 -96
  49. package/dist/sidebar/component.d.ts.map +1 -1
  50. package/dist/sidebar/index.js +1 -1
  51. package/dist/sidebar/types.d.ts +7 -0
  52. package/dist/sidebar/types.d.ts.map +1 -1
  53. package/dist/styles/components/brand.css +22 -0
  54. package/dist/styles/layout.css +577 -0
  55. package/dist/styles/sidebar.css +26 -0
  56. package/package.json +11 -1
  57. package/src/components/brand/index.ts +22 -4
  58. package/src/components/brand/types.ts +2 -0
  59. package/src/icons/icons.test.ts +1 -1
  60. package/src/icons/index.ts +7 -2
  61. package/src/icons/lucide.ts +4 -0
  62. package/src/index.ts +2 -0
  63. package/src/layout/app-shell.test.ts +76 -0
  64. package/src/layout/app-shell.ts +38 -7
  65. package/src/layout/core-app-chrome.test.ts +17 -5
  66. package/src/layout/core-app-chrome.ts +8 -3
  67. package/src/layout/core-app-library-dashboard.test.ts +397 -0
  68. package/src/layout/core-app-library-dashboard.ts +519 -0
  69. package/src/layout/index.ts +18 -0
  70. package/src/react/brand/index.test.tsx +10 -0
  71. package/src/react/brand/index.tsx +25 -4
  72. package/src/react/layout/core-app-chrome.test.tsx +2 -2
  73. package/src/react/layout/core-app-library-dashboard.test.tsx +42 -0
  74. package/src/react/layout/core-app-library-dashboard.tsx +56 -0
  75. package/src/react/layout/index.ts +6 -0
  76. package/src/sidebar/component.test.ts +21 -1
  77. package/src/sidebar/component.ts +14 -8
  78. package/src/sidebar/types.ts +7 -0
  79. package/src/styles/components/brand.css +22 -0
  80. package/src/styles/layout.css +577 -0
  81. package/src/styles/sidebar.css +26 -0
  82. package/dist/component-D5sRm1fq.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"core-app-chrome.d.ts","sourceRoot":"","sources":["../../src/layout/core-app-chrome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core-app-chrome.d.ts","sourceRoot":"","sources":["../../src/layout/core-app-chrome.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "../utils-CSEWuKHo.js";
2
2
  import { TopMenuBar as t } from "./app-shell.js";
3
- import { t as n } from "../component-D5sRm1fq.js";
3
+ import { t as n } from "../component-D_asjmrt.js";
4
4
  //#region src/layout/core-app-chrome.ts
5
5
  var r = "[data-core-app-sidebar]", i = "[data-core-app-topbar]", a = "[data-core-app-topbar-action]", o = [
6
6
  {
@@ -212,11 +212,14 @@ function f(e = "/app") {
212
212
  }
213
213
  function p(e, t = "/app") {
214
214
  let n = u(e, t);
215
- return n === "/" || n === "" ? "Platform Overview" : s.find((e) => e.pattern.test(n))?.label ?? "Threat Library";
215
+ return n === "/" || n === "" ? "Library Dashboard" : s.find((e) => e.pattern.test(n))?.label ?? "Threat Library";
216
216
  }
217
217
  function m(e = {}) {
218
- let { basePath: t = "/app", sections: n, variant: r = "cm", brand: i, scope: a, beforeNav: o, afterNav: s, collapsible: c = !0, collapseButtonVisible: u = !0, user: p, footerActions: m, iconSet: h, collapsed: g, activeItemId: _, pathname: v, storageKey: y = "cm-sidebar-collapsed", persistCollapsed: b, mobileBreakpoint: x, mobileBackdrop: S = !0, closeOnNavigate: C = !0, open: w, onNavigate: T, onCollapse: E, onOpenChange: D } = e, O = i ?? {
218
+ let { basePath: t = "/app", sections: n, variant: r = "threat-library", brand: i, scope: a, beforeNav: o, afterNav: s, collapsible: c = !0, collapseButtonVisible: u = !0, user: p, footerActions: m, iconSet: h, collapsed: g, activeItemId: _, pathname: v, storageKey: y = "cm-sidebar-collapsed", persistCollapsed: b, mobileBreakpoint: x, mobileBackdrop: S = !0, closeOnNavigate: C = !0, open: w, onNavigate: T, onCollapse: E, onOpenChange: D } = e, O = i ?? {
219
219
  label: "CounterMeasure",
220
+ subtitle: "Platform",
221
+ wordmarkCase: "title",
222
+ markSize: 24,
220
223
  href: l(t, "/")
221
224
  }, k = {
222
225
  variant: r,
@@ -252,7 +255,7 @@ function h(e = {}) {
252
255
  }), i;
253
256
  }
254
257
  function g(e = {}) {
255
- let { basePath: t = "/app", pathname: n = typeof window > "u" ? "/" : window.location.pathname, product: r = "CounterMeasure Core", current: i = p(n, t), actions: a, beforeActions: o, afterActions: s, user: c, iconSet: l, className: u, breadcrumbs: d, container: f, includeSearchAction: m, includeFeedbackAction: g, includeHelpAction: _ } = e, v = {};
258
+ let { basePath: t = "/app", pathname: n = typeof window > "u" ? "/" : window.location.pathname, product: r = "Threat Library", current: i = p(n, t), actions: a, beforeActions: o, afterActions: s, user: c, iconSet: l, className: u, breadcrumbs: d, container: f, includeSearchAction: m, includeFeedbackAction: g, includeHelpAction: _ } = e, v = {};
256
259
  m !== void 0 && (v.includeSearchAction = m), g !== void 0 && (v.includeFeedbackAction = g), _ !== void 0 && (v.includeHelpAction = _);
257
260
  let y = {
258
261
  product: r,
@@ -298,7 +301,7 @@ function w(e, t, n) {
298
301
  basePath: r,
299
302
  container: t
300
303
  }, a = b(e.topbar?.afterActions, n);
301
- return e.pathname !== void 0 && (i.pathname = e.pathname), e.topbarUser !== void 0 && (i.user = e.topbarUser), e.topbarActions !== void 0 && (i.actions = e.topbarActions), a !== void 0 && (i.afterActions = a), S(i, n), i;
304
+ return e.pathname !== void 0 && (i.pathname = e.pathname), e.topbarUser !== void 0 && (i.user = e.topbarUser), e.topbarActions !== void 0 && (i.actions = e.topbarActions), e.topbar?.beforeActions !== void 0 && (i.beforeActions = e.topbar.beforeActions), a !== void 0 && (i.afterActions = a), S(i, n), i;
302
305
  }
303
306
  function T(r) {
304
307
  let i = e(r.sidebarContainer);
@@ -1 +1 @@
1
- {"version":3,"file":"core-app-chrome.js","names":[],"sources":["../../src/layout/core-app-chrome.ts"],"sourcesContent":["import type {\n SidebarBrandConfig,\n SidebarComponentConfig,\n SidebarFooterAction,\n SidebarNavItem,\n SidebarScopeConfig,\n SidebarSection,\n SidebarUser,\n} from '../sidebar/types'\nimport { SidebarComponent } from '../sidebar/component'\nimport { resolveContainer } from '../primitives/utils'\nimport {\n TopMenuBar,\n type TopMenuBarActionInput,\n type TopMenuBarConfig,\n type TopMenuBarUser,\n} from './app-shell'\n\nexport interface CoreAppRouteLabel {\n pattern: RegExp\n label: string\n}\n\nexport interface CoreAppSidebarPresetOptions extends Omit<\n SidebarComponentConfig,\n 'container' | 'sections'\n> {\n basePath?: string\n sections?: SidebarSection[]\n}\n\nexport interface CoreAppTopbarPresetOptions extends Omit<\n TopMenuBarConfig,\n 'actions' | 'current' | 'product'\n> {\n basePath?: string\n pathname?: string\n product?: string\n current?: string\n actions?: TopMenuBarActionInput[]\n includeSearchAction?: boolean\n includeFeedbackAction?: boolean\n includeHelpAction?: boolean\n}\n\nexport interface CoreAppChromePreset {\n sidebar: Omit<SidebarComponentConfig, 'container'>\n topbar: TopMenuBarConfig\n}\n\nexport interface CoreAppChromePresetOptions {\n basePath?: string\n pathname?: string\n scope?: SidebarScopeConfig\n sidebarUser?: SidebarUser\n sidebarFooterActions?: SidebarFooterAction[]\n topbarUser?: TopMenuBarUser\n topbarActions?: TopMenuBarActionInput[]\n}\n\nexport interface CoreAppChromeMountOptions extends CoreAppChromePresetOptions {\n sidebarContainer: HTMLElement | string\n topbarContainer?: HTMLElement | string\n sidebar?: CoreAppSidebarPresetOptions\n topbar?: CoreAppTopbarPresetOptions\n /**\n * Move explicitly marked server-rendered topbar action nodes into the new topbar.\n * Useful for native hooks that are initialized outside the chrome mount.\n * @default true\n */\n preserveTopbarActions?: boolean\n /**\n * Selector for preserved action nodes inside the topbar container.\n * @default '[data-core-app-topbar-action]'\n */\n topbarActionSelector?: string\n /**\n * Remove existing placeholder/server-rendered children before mounting.\n * @default true\n */\n clearContainers?: boolean\n}\n\nexport interface CoreAppChromeDomMountOptions extends CoreAppChromePresetOptions {\n root?: ParentNode\n sidebarSelector?: string\n topbarSelector?: string\n sidebar?: CoreAppSidebarPresetOptions\n topbar?: CoreAppTopbarPresetOptions\n preserveTopbarActions?: boolean\n topbarActionSelector?: string\n clearContainers?: boolean\n}\n\nexport interface CoreAppChromeMount {\n sidebar: SidebarComponent\n topbar?: TopMenuBar\n destroy: () => void\n}\n\ninterface CoreAppNavItemBlueprint {\n id: string\n label: string\n href: string\n icon: string\n end?: boolean\n}\n\ninterface CoreAppNavSectionBlueprint {\n id: string\n label: string\n items: CoreAppNavItemBlueprint[]\n}\n\nconst DEFAULT_DOM_SIDEBAR_SELECTOR = '[data-core-app-sidebar]'\nconst DEFAULT_DOM_TOPBAR_SELECTOR = '[data-core-app-topbar]'\nconst DEFAULT_TOPBAR_ACTION_SELECTOR = '[data-core-app-topbar-action]'\n\nconst CORE_APP_NAV_SECTIONS: CoreAppNavSectionBlueprint[] = [\n {\n id: 'dashboards',\n label: 'Dashboards',\n items: [\n { id: 'library', label: 'Library', href: '/', icon: 'library', end: true },\n { id: 'capacity', label: 'Capacity', href: '/capacity', icon: 'capacity' },\n { id: 'operational-alerts', label: 'Operational Alerts', href: '/alerts', icon: 'alerts' },\n ],\n },\n {\n id: 'threat-library',\n label: 'Threat Library',\n items: [\n { id: 'detections', label: 'Detections', href: '/detections', icon: 'detections' },\n { id: 'actors', label: 'Actors', href: '/actors', icon: 'actors' },\n { id: 'library-reports', label: 'Library Reports', href: '/intel', icon: 'intel-reports' },\n { id: 'mitre', label: 'MITRE ATT&CK', href: '/mitre', icon: 'mitre' },\n ],\n },\n {\n id: 'library-operations',\n label: 'Library Operations',\n items: [{ id: 'pipeline', label: 'Pipeline', href: '/pipeline', icon: 'pipeline' }],\n },\n {\n id: 'integrations',\n label: 'Integrations',\n items: [\n { id: 'connectors', label: 'Connectors', href: '/connectors', icon: 'connectors' },\n { id: 'jobs', label: 'Jobs', href: '/jobs', icon: 'jobs' },\n ],\n },\n {\n id: 'platform',\n label: 'Platform',\n items: [\n { id: 'tenants', label: 'Tenants', href: '/tenants', icon: 'tenants' },\n { id: 'runners', label: 'Runners', href: '/runners', icon: 'runners' },\n { id: 'topology', label: 'Topology', href: '/topology', icon: 'topology' },\n { id: 'api-access', label: 'API Access', href: '/api-access', icon: 'api-access' },\n ],\n },\n]\n\nexport const CORE_APP_ROUTE_LABELS: CoreAppRouteLabel[] = [\n { pattern: /^\\/(?:dashboards\\/)?capacity(?:\\/|$)/, label: 'Capacity' },\n { pattern: /^\\/(?:dashboards\\/)?alerts(?:\\/|$)/, label: 'Operational Alerts' },\n { pattern: /^\\/dashboards\\/library(?:\\/|$)/, label: 'Library Dashboard' },\n { pattern: /^\\/detections(?:\\/|$)/, label: 'Detections' },\n { pattern: /^\\/actors(?:\\/|$)/, label: 'Actors' },\n { pattern: /^\\/intel(?:\\/|$)/, label: 'Library Reports' },\n { pattern: /^\\/mitre(?:\\/|$)/, label: 'MITRE ATT&CK' },\n { pattern: /^\\/pipeline(?:\\/|$)/, label: 'Pipeline' },\n { pattern: /^\\/connectors(?:\\/|$)/, label: 'Connectors' },\n { pattern: /^\\/jobs(?:\\/|$)/, label: 'Jobs' },\n { pattern: /^\\/topology(?:\\/|$)/, label: 'Topology' },\n { pattern: /^\\/tenants(?:\\/|$)/, label: 'Tenants' },\n { pattern: /^\\/runners(?:\\/|$)/, label: 'Runners' },\n { pattern: /^\\/api-access(?:\\/|$)/, label: 'API Access' },\n { pattern: /^\\/settings(?:\\/|$)/, label: 'Settings' },\n]\n\nfunction normalizeBasePath(basePath: string): string {\n const trimmed = basePath.trim()\n if (trimmed === '' || trimmed === '/') {\n return ''\n }\n return `/${trimmed.replace(/^\\/+|\\/+$/g, '')}`\n}\n\nfunction joinBasePath(basePath: string, href: string): string {\n const normalizedBase = normalizeBasePath(basePath)\n if (href === '/' || href === '') {\n return normalizedBase || '/'\n }\n return `${normalizedBase}/${href.replace(/^\\/+/, '')}`\n}\n\nfunction stripBasePath(pathname: string, basePath: string): string {\n const normalizedBase = normalizeBasePath(basePath)\n if (normalizedBase === '') {\n return pathname || '/'\n }\n\n if (pathname === normalizedBase) {\n return '/'\n }\n\n if (pathname.startsWith(`${normalizedBase}/`)) {\n return pathname.slice(normalizedBase.length) || '/'\n }\n\n return pathname || '/'\n}\n\nfunction cloneSections(sections: SidebarSection[]): SidebarSection[] {\n return sections.map(section => ({\n ...section,\n items: section.items.map(item => ({ ...item })),\n }))\n}\n\nexport function createCoreAppSidebarSections(basePath = '/app'): SidebarSection[] {\n return CORE_APP_NAV_SECTIONS.map(section => ({\n id: section.id,\n label: section.label,\n items: section.items.map(item => {\n const navItem: SidebarNavItem = {\n id: item.id,\n label: item.label,\n href: joinBasePath(basePath, item.href),\n icon: item.icon,\n tooltip: item.label,\n activeMatch: item.end === true ? 'exact' : 'prefix',\n }\n if (item.end !== undefined) {\n navItem.end = item.end\n }\n return navItem\n }),\n }))\n}\n\nexport function getCoreAppRouteLabel(pathname: string, basePath = '/app'): string {\n const relativePathname = stripBasePath(pathname, basePath)\n if (relativePathname === '/' || relativePathname === '') {\n return 'Platform Overview'\n }\n\n return (\n CORE_APP_ROUTE_LABELS.find(route => route.pattern.test(relativePathname))?.label ??\n 'Threat Library'\n )\n}\n\nexport function createCoreAppSidebarConfig(\n options: CoreAppSidebarPresetOptions = {}\n): Omit<SidebarComponentConfig, 'container'> {\n const {\n basePath = '/app',\n sections,\n variant = 'cm',\n brand,\n scope,\n beforeNav,\n afterNav,\n collapsible = true,\n collapseButtonVisible = true,\n user,\n footerActions,\n iconSet,\n collapsed,\n activeItemId,\n pathname,\n storageKey = 'cm-sidebar-collapsed',\n persistCollapsed,\n mobileBreakpoint,\n mobileBackdrop = true,\n closeOnNavigate = true,\n open,\n onNavigate,\n onCollapse,\n onOpenChange,\n } = options\n\n const resolvedBrand: SidebarBrandConfig = brand ?? {\n label: 'CounterMeasure',\n href: joinBasePath(basePath, '/'),\n }\n\n const config: Omit<SidebarComponentConfig, 'container'> = {\n variant,\n sections:\n sections === undefined ? createCoreAppSidebarSections(basePath) : cloneSections(sections),\n brand: resolvedBrand,\n collapsible,\n collapseButtonVisible,\n storageKey,\n mobileBackdrop,\n closeOnNavigate,\n }\n\n if (scope !== undefined) config.scope = scope\n if (beforeNav !== undefined) config.beforeNav = beforeNav\n if (afterNav !== undefined) config.afterNav = afterNav\n if (user !== undefined) config.user = user\n if (footerActions !== undefined) config.footerActions = footerActions\n if (iconSet !== undefined) config.iconSet = iconSet\n if (collapsed !== undefined) config.collapsed = collapsed\n if (activeItemId !== undefined) config.activeItemId = activeItemId\n if (pathname !== undefined) config.pathname = pathname\n if (persistCollapsed !== undefined) config.persistCollapsed = persistCollapsed\n if (mobileBreakpoint !== undefined) config.mobileBreakpoint = mobileBreakpoint\n if (open !== undefined) config.open = open\n if (onNavigate !== undefined) config.onNavigate = onNavigate\n if (onCollapse !== undefined) config.onCollapse = onCollapse\n if (onOpenChange !== undefined) config.onOpenChange = onOpenChange\n\n return config\n}\n\nexport function createCoreAppTopbarActions(\n options: Pick<\n CoreAppTopbarPresetOptions,\n 'includeSearchAction' | 'includeFeedbackAction' | 'includeHelpAction'\n > = {}\n): TopMenuBarActionInput[] {\n const {\n includeSearchAction = true,\n includeFeedbackAction = true,\n includeHelpAction = true,\n } = options\n const actions: TopMenuBarActionInput[] = []\n\n if (includeSearchAction) {\n actions.push({\n id: 'search',\n label: 'Find...',\n icon: 'search',\n showLabel: true,\n className: 'cmm-topbar__action--search',\n attributes: { 'data-app-search-trigger': true },\n })\n }\n\n if (includeFeedbackAction) {\n actions.push({\n id: 'feedback',\n label: 'Feedback',\n showLabel: true,\n attributes: { 'data-feedback-toggle': true },\n })\n }\n\n if (includeHelpAction) {\n actions.push({\n id: 'help',\n label: 'Help',\n icon: 'help',\n attributes: { 'data-help-toggle': true },\n })\n }\n\n return actions\n}\n\nexport function createCoreAppTopbarConfig(\n options: CoreAppTopbarPresetOptions = {}\n): TopMenuBarConfig {\n const {\n basePath = '/app',\n pathname = typeof window === 'undefined' ? '/' : window.location.pathname,\n product = 'CounterMeasure Core',\n current = getCoreAppRouteLabel(pathname, basePath),\n actions,\n beforeActions,\n afterActions,\n user,\n iconSet,\n className,\n breadcrumbs,\n container,\n includeSearchAction,\n includeFeedbackAction,\n includeHelpAction,\n } = options\n\n const actionOptions: Pick<\n CoreAppTopbarPresetOptions,\n 'includeSearchAction' | 'includeFeedbackAction' | 'includeHelpAction'\n > = {}\n if (includeSearchAction !== undefined) actionOptions.includeSearchAction = includeSearchAction\n if (includeFeedbackAction !== undefined)\n actionOptions.includeFeedbackAction = includeFeedbackAction\n if (includeHelpAction !== undefined) actionOptions.includeHelpAction = includeHelpAction\n\n const config: TopMenuBarConfig = {\n product,\n current,\n actions: actions ?? createCoreAppTopbarActions(actionOptions),\n }\n\n if (container !== undefined) config.container = container\n if (breadcrumbs !== undefined) config.breadcrumbs = breadcrumbs\n if (beforeActions !== undefined) config.beforeActions = beforeActions\n if (afterActions !== undefined) config.afterActions = afterActions\n if (user !== undefined) config.user = user\n if (iconSet !== undefined) config.iconSet = iconSet\n if (className !== undefined) config.className = className\n\n return config\n}\n\nexport function createCoreAppChromePreset(\n options: CoreAppChromePresetOptions = {}\n): CoreAppChromePreset {\n const {\n basePath = '/app',\n pathname,\n scope,\n sidebarUser,\n sidebarFooterActions,\n topbarUser,\n topbarActions,\n } = options\n\n const sidebarOptions: CoreAppSidebarPresetOptions = { basePath }\n if (scope !== undefined) sidebarOptions.scope = scope\n if (sidebarUser !== undefined) sidebarOptions.user = sidebarUser\n if (sidebarFooterActions !== undefined) sidebarOptions.footerActions = sidebarFooterActions\n if (pathname !== undefined) sidebarOptions.pathname = pathname\n\n const topbarOptions: CoreAppTopbarPresetOptions = { basePath }\n if (pathname !== undefined) topbarOptions.pathname = pathname\n if (topbarUser !== undefined) topbarOptions.user = topbarUser\n if (topbarActions !== undefined) topbarOptions.actions = topbarActions\n\n return {\n sidebar: createCoreAppSidebarConfig(sidebarOptions),\n topbar: createCoreAppTopbarConfig(topbarOptions),\n }\n}\n\nfunction clearContainer(container: HTMLElement, clearContainers: boolean | undefined): void {\n if (clearContainers !== false) {\n container.replaceChildren()\n }\n}\n\nfunction collectTopbarActionNodes(options: {\n container: HTMLElement\n preserveTopbarActions: boolean | undefined\n selector: string | undefined\n}): HTMLElement[] {\n if (options.preserveTopbarActions === false) {\n return []\n }\n\n return Array.from(\n options.container.querySelectorAll<HTMLElement>(\n options.selector ?? DEFAULT_TOPBAR_ACTION_SELECTOR\n )\n )\n}\n\nfunction mergeElements(\n existing: HTMLElement | HTMLElement[] | undefined,\n additions: HTMLElement[]\n): HTMLElement | HTMLElement[] | undefined {\n if (additions.length === 0) {\n return existing\n }\n\n if (existing === undefined) {\n return additions\n }\n\n return Array.isArray(existing) ? [...existing, ...additions] : [existing, ...additions]\n}\n\nfunction hasPreservedActionAttribute(actions: HTMLElement[], attribute: string): boolean {\n return actions.some(action => action.hasAttribute(attribute))\n}\n\nfunction dedupeDefaultActionsForPreservedNodes(\n options: CoreAppTopbarPresetOptions,\n preservedActions: HTMLElement[]\n): void {\n if (options.actions !== undefined || preservedActions.length === 0) {\n return\n }\n\n if (\n options.includeSearchAction === undefined &&\n hasPreservedActionAttribute(preservedActions, 'data-app-search-trigger')\n ) {\n options.includeSearchAction = false\n }\n\n if (\n options.includeFeedbackAction === undefined &&\n hasPreservedActionAttribute(preservedActions, 'data-feedback-toggle')\n ) {\n options.includeFeedbackAction = false\n }\n\n if (\n options.includeHelpAction === undefined &&\n hasPreservedActionAttribute(preservedActions, 'data-help-toggle')\n ) {\n options.includeHelpAction = false\n }\n}\n\nfunction buildSidebarMountOptions(options: CoreAppChromeMountOptions): CoreAppSidebarPresetOptions {\n const basePath = options.sidebar?.basePath ?? options.basePath ?? '/app'\n const sidebarOptions: CoreAppSidebarPresetOptions = {\n ...options.sidebar,\n basePath,\n }\n\n if (options.scope !== undefined) sidebarOptions.scope = options.scope\n if (options.sidebarUser !== undefined) sidebarOptions.user = options.sidebarUser\n if (options.sidebarFooterActions !== undefined)\n sidebarOptions.footerActions = options.sidebarFooterActions\n if (options.pathname !== undefined && sidebarOptions.pathname === undefined) {\n sidebarOptions.pathname = options.pathname\n }\n\n return sidebarOptions\n}\n\nfunction buildTopbarMountOptions(\n options: CoreAppChromeMountOptions,\n topbarContainer: HTMLElement,\n preservedActions: HTMLElement[]\n): CoreAppTopbarPresetOptions {\n const basePath = options.topbar?.basePath ?? options.basePath ?? '/app'\n const topbarOptions: CoreAppTopbarPresetOptions = {\n ...options.topbar,\n basePath,\n container: topbarContainer,\n }\n const afterActions = mergeElements(options.topbar?.afterActions, preservedActions)\n\n if (options.pathname !== undefined) topbarOptions.pathname = options.pathname\n if (options.topbarUser !== undefined) topbarOptions.user = options.topbarUser\n if (options.topbarActions !== undefined) topbarOptions.actions = options.topbarActions\n if (afterActions !== undefined) topbarOptions.afterActions = afterActions\n dedupeDefaultActionsForPreservedNodes(topbarOptions, preservedActions)\n\n return topbarOptions\n}\n\nexport function mountCoreAppChrome(options: CoreAppChromeMountOptions): CoreAppChromeMount {\n const sidebarContainer = resolveContainer(options.sidebarContainer)\n clearContainer(sidebarContainer, options.clearContainers)\n\n const sidebar = new SidebarComponent({\n container: sidebarContainer,\n ...createCoreAppSidebarConfig(buildSidebarMountOptions(options)),\n })\n\n const topbarContainerOption = options.topbarContainer ?? options.topbar?.container\n const topbarContainer =\n topbarContainerOption === undefined ? undefined : resolveContainer(topbarContainerOption)\n let topbar: TopMenuBar | undefined\n\n if (topbarContainer !== undefined) {\n const preservedActions = collectTopbarActionNodes({\n container: topbarContainer,\n preserveTopbarActions: options.preserveTopbarActions,\n selector: options.topbarActionSelector,\n })\n clearContainer(topbarContainer, options.clearContainers)\n topbar = new TopMenuBar(\n createCoreAppTopbarConfig(buildTopbarMountOptions(options, topbarContainer, preservedActions))\n )\n }\n\n const mounted: CoreAppChromeMount = {\n sidebar,\n destroy: () => {\n topbar?.destroy()\n sidebar.destroy()\n },\n }\n\n if (topbar !== undefined) {\n mounted.topbar = topbar\n }\n\n return mounted\n}\n\nfunction readDataValue(element: HTMLElement | undefined, key: string): string | undefined {\n const value = element?.dataset[key]\n return value === undefined || value.length === 0 ? undefined : value\n}\n\nfunction buildDeclarativeTopbarOptions(\n options: CoreAppChromeDomMountOptions,\n sidebarContainer: HTMLElement,\n topbarContainer: HTMLElement | null\n): CoreAppTopbarPresetOptions | undefined {\n const product =\n options.topbar?.product ??\n readDataValue(topbarContainer ?? undefined, 'product') ??\n readDataValue(sidebarContainer, 'product')\n const current =\n options.topbar?.current ??\n readDataValue(topbarContainer ?? undefined, 'current') ??\n readDataValue(sidebarContainer, 'current')\n\n if (options.topbar === undefined && product === undefined && current === undefined) {\n return undefined\n }\n\n const topbar: CoreAppTopbarPresetOptions = { ...(options.topbar ?? {}) }\n if (product !== undefined) topbar.product = product\n if (current !== undefined) topbar.current = current\n return topbar\n}\n\nexport function mountCoreAppChromeFromDom(\n options: CoreAppChromeDomMountOptions = {}\n): CoreAppChromeMount | null {\n const root = options.root ?? document\n const sidebarContainer = root.querySelector<HTMLElement>(\n options.sidebarSelector ?? DEFAULT_DOM_SIDEBAR_SELECTOR\n )\n\n if (sidebarContainer === null) {\n return null\n }\n\n const topbarContainer = root.querySelector<HTMLElement>(\n options.topbarSelector ?? DEFAULT_DOM_TOPBAR_SELECTOR\n )\n const basePath =\n options.basePath ??\n options.sidebar?.basePath ??\n options.topbar?.basePath ??\n readDataValue(sidebarContainer, 'basePath') ??\n readDataValue(topbarContainer ?? undefined, 'basePath') ??\n '/app'\n const pathname =\n options.pathname ??\n readDataValue(sidebarContainer, 'pathname') ??\n readDataValue(topbarContainer ?? undefined, 'pathname')\n\n const mountOptions: CoreAppChromeMountOptions = {\n ...options,\n sidebarContainer,\n basePath,\n }\n const topbar = buildDeclarativeTopbarOptions(options, sidebarContainer, topbarContainer)\n if (topbar !== undefined) mountOptions.topbar = topbar\n if (topbarContainer !== null) mountOptions.topbarContainer = topbarContainer\n if (pathname !== undefined) mountOptions.pathname = pathname\n\n return mountCoreAppChrome(mountOptions)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core-app-chrome.js","names":[],"sources":["../../src/layout/core-app-chrome.ts"],"sourcesContent":["import type {\n SidebarBrandConfig,\n SidebarComponentConfig,\n SidebarFooterAction,\n SidebarNavItem,\n SidebarScopeConfig,\n SidebarSection,\n SidebarUser,\n} from '../sidebar/types'\nimport { SidebarComponent } from '../sidebar/component'\nimport { resolveContainer } from '../primitives/utils'\nimport {\n TopMenuBar,\n type TopMenuBarActionInput,\n type TopMenuBarConfig,\n type TopMenuBarUser,\n} from './app-shell'\n\nexport interface CoreAppRouteLabel {\n pattern: RegExp\n label: string\n}\n\nexport interface CoreAppSidebarPresetOptions extends Omit<\n SidebarComponentConfig,\n 'container' | 'sections'\n> {\n basePath?: string\n sections?: SidebarSection[]\n}\n\nexport interface CoreAppTopbarPresetOptions extends Omit<\n TopMenuBarConfig,\n 'actions' | 'current' | 'product'\n> {\n basePath?: string\n pathname?: string\n product?: string\n current?: string\n actions?: TopMenuBarActionInput[]\n includeSearchAction?: boolean\n includeFeedbackAction?: boolean\n includeHelpAction?: boolean\n}\n\nexport interface CoreAppChromePreset {\n sidebar: Omit<SidebarComponentConfig, 'container'>\n topbar: TopMenuBarConfig\n}\n\nexport interface CoreAppChromePresetOptions {\n basePath?: string\n pathname?: string\n scope?: SidebarScopeConfig\n sidebarUser?: SidebarUser\n sidebarFooterActions?: SidebarFooterAction[]\n topbarUser?: TopMenuBarUser\n topbarActions?: TopMenuBarActionInput[]\n}\n\nexport interface CoreAppChromeMountOptions extends CoreAppChromePresetOptions {\n sidebarContainer: HTMLElement | string\n topbarContainer?: HTMLElement | string\n sidebar?: CoreAppSidebarPresetOptions\n topbar?: CoreAppTopbarPresetOptions\n /**\n * Move explicitly marked server-rendered topbar action nodes into the new topbar.\n * Useful for native hooks that are initialized outside the chrome mount.\n * @default true\n */\n preserveTopbarActions?: boolean\n /**\n * Selector for preserved action nodes inside the topbar container.\n * @default '[data-core-app-topbar-action]'\n */\n topbarActionSelector?: string\n /**\n * Remove existing placeholder/server-rendered children before mounting.\n * @default true\n */\n clearContainers?: boolean\n}\n\nexport interface CoreAppChromeDomMountOptions extends CoreAppChromePresetOptions {\n root?: ParentNode\n sidebarSelector?: string\n topbarSelector?: string\n sidebar?: CoreAppSidebarPresetOptions\n topbar?: CoreAppTopbarPresetOptions\n preserveTopbarActions?: boolean\n topbarActionSelector?: string\n clearContainers?: boolean\n}\n\nexport interface CoreAppChromeMount {\n sidebar: SidebarComponent\n topbar?: TopMenuBar\n destroy: () => void\n}\n\ninterface CoreAppNavItemBlueprint {\n id: string\n label: string\n href: string\n icon: string\n end?: boolean\n}\n\ninterface CoreAppNavSectionBlueprint {\n id: string\n label: string\n items: CoreAppNavItemBlueprint[]\n}\n\nconst DEFAULT_DOM_SIDEBAR_SELECTOR = '[data-core-app-sidebar]'\nconst DEFAULT_DOM_TOPBAR_SELECTOR = '[data-core-app-topbar]'\nconst DEFAULT_TOPBAR_ACTION_SELECTOR = '[data-core-app-topbar-action]'\n\nconst CORE_APP_NAV_SECTIONS: CoreAppNavSectionBlueprint[] = [\n {\n id: 'dashboards',\n label: 'Dashboards',\n items: [\n { id: 'library', label: 'Library', href: '/', icon: 'library', end: true },\n { id: 'capacity', label: 'Capacity', href: '/capacity', icon: 'capacity' },\n { id: 'operational-alerts', label: 'Operational Alerts', href: '/alerts', icon: 'alerts' },\n ],\n },\n {\n id: 'threat-library',\n label: 'Threat Library',\n items: [\n { id: 'detections', label: 'Detections', href: '/detections', icon: 'detections' },\n { id: 'actors', label: 'Actors', href: '/actors', icon: 'actors' },\n { id: 'library-reports', label: 'Library Reports', href: '/intel', icon: 'intel-reports' },\n { id: 'mitre', label: 'MITRE ATT&CK', href: '/mitre', icon: 'mitre' },\n ],\n },\n {\n id: 'library-operations',\n label: 'Library Operations',\n items: [{ id: 'pipeline', label: 'Pipeline', href: '/pipeline', icon: 'pipeline' }],\n },\n {\n id: 'integrations',\n label: 'Integrations',\n items: [\n { id: 'connectors', label: 'Connectors', href: '/connectors', icon: 'connectors' },\n { id: 'jobs', label: 'Jobs', href: '/jobs', icon: 'jobs' },\n ],\n },\n {\n id: 'platform',\n label: 'Platform',\n items: [\n { id: 'tenants', label: 'Tenants', href: '/tenants', icon: 'tenants' },\n { id: 'runners', label: 'Runners', href: '/runners', icon: 'runners' },\n { id: 'topology', label: 'Topology', href: '/topology', icon: 'topology' },\n { id: 'api-access', label: 'API Access', href: '/api-access', icon: 'api-access' },\n ],\n },\n]\n\nexport const CORE_APP_ROUTE_LABELS: CoreAppRouteLabel[] = [\n { pattern: /^\\/(?:dashboards\\/)?capacity(?:\\/|$)/, label: 'Capacity' },\n { pattern: /^\\/(?:dashboards\\/)?alerts(?:\\/|$)/, label: 'Operational Alerts' },\n { pattern: /^\\/dashboards\\/library(?:\\/|$)/, label: 'Library Dashboard' },\n { pattern: /^\\/detections(?:\\/|$)/, label: 'Detections' },\n { pattern: /^\\/actors(?:\\/|$)/, label: 'Actors' },\n { pattern: /^\\/intel(?:\\/|$)/, label: 'Library Reports' },\n { pattern: /^\\/mitre(?:\\/|$)/, label: 'MITRE ATT&CK' },\n { pattern: /^\\/pipeline(?:\\/|$)/, label: 'Pipeline' },\n { pattern: /^\\/connectors(?:\\/|$)/, label: 'Connectors' },\n { pattern: /^\\/jobs(?:\\/|$)/, label: 'Jobs' },\n { pattern: /^\\/topology(?:\\/|$)/, label: 'Topology' },\n { pattern: /^\\/tenants(?:\\/|$)/, label: 'Tenants' },\n { pattern: /^\\/runners(?:\\/|$)/, label: 'Runners' },\n { pattern: /^\\/api-access(?:\\/|$)/, label: 'API Access' },\n { pattern: /^\\/settings(?:\\/|$)/, label: 'Settings' },\n]\n\nfunction normalizeBasePath(basePath: string): string {\n const trimmed = basePath.trim()\n if (trimmed === '' || trimmed === '/') {\n return ''\n }\n return `/${trimmed.replace(/^\\/+|\\/+$/g, '')}`\n}\n\nfunction joinBasePath(basePath: string, href: string): string {\n const normalizedBase = normalizeBasePath(basePath)\n if (href === '/' || href === '') {\n return normalizedBase || '/'\n }\n return `${normalizedBase}/${href.replace(/^\\/+/, '')}`\n}\n\nfunction stripBasePath(pathname: string, basePath: string): string {\n const normalizedBase = normalizeBasePath(basePath)\n if (normalizedBase === '') {\n return pathname || '/'\n }\n\n if (pathname === normalizedBase) {\n return '/'\n }\n\n if (pathname.startsWith(`${normalizedBase}/`)) {\n return pathname.slice(normalizedBase.length) || '/'\n }\n\n return pathname || '/'\n}\n\nfunction cloneSections(sections: SidebarSection[]): SidebarSection[] {\n return sections.map(section => ({\n ...section,\n items: section.items.map(item => ({ ...item })),\n }))\n}\n\nexport function createCoreAppSidebarSections(basePath = '/app'): SidebarSection[] {\n return CORE_APP_NAV_SECTIONS.map(section => ({\n id: section.id,\n label: section.label,\n items: section.items.map(item => {\n const navItem: SidebarNavItem = {\n id: item.id,\n label: item.label,\n href: joinBasePath(basePath, item.href),\n icon: item.icon,\n tooltip: item.label,\n activeMatch: item.end === true ? 'exact' : 'prefix',\n }\n if (item.end !== undefined) {\n navItem.end = item.end\n }\n return navItem\n }),\n }))\n}\n\nexport function getCoreAppRouteLabel(pathname: string, basePath = '/app'): string {\n const relativePathname = stripBasePath(pathname, basePath)\n if (relativePathname === '/' || relativePathname === '') {\n return 'Library Dashboard'\n }\n\n return (\n CORE_APP_ROUTE_LABELS.find(route => route.pattern.test(relativePathname))?.label ??\n 'Threat Library'\n )\n}\n\nexport function createCoreAppSidebarConfig(\n options: CoreAppSidebarPresetOptions = {}\n): Omit<SidebarComponentConfig, 'container'> {\n const {\n basePath = '/app',\n sections,\n variant = 'threat-library',\n brand,\n scope,\n beforeNav,\n afterNav,\n collapsible = true,\n collapseButtonVisible = true,\n user,\n footerActions,\n iconSet,\n collapsed,\n activeItemId,\n pathname,\n storageKey = 'cm-sidebar-collapsed',\n persistCollapsed,\n mobileBreakpoint,\n mobileBackdrop = true,\n closeOnNavigate = true,\n open,\n onNavigate,\n onCollapse,\n onOpenChange,\n } = options\n\n const resolvedBrand: SidebarBrandConfig = brand ?? {\n label: 'CounterMeasure',\n subtitle: 'Platform',\n wordmarkCase: 'title',\n markSize: 24,\n href: joinBasePath(basePath, '/'),\n }\n\n const config: Omit<SidebarComponentConfig, 'container'> = {\n variant,\n sections:\n sections === undefined ? createCoreAppSidebarSections(basePath) : cloneSections(sections),\n brand: resolvedBrand,\n collapsible,\n collapseButtonVisible,\n storageKey,\n mobileBackdrop,\n closeOnNavigate,\n }\n\n if (scope !== undefined) config.scope = scope\n if (beforeNav !== undefined) config.beforeNav = beforeNav\n if (afterNav !== undefined) config.afterNav = afterNav\n if (user !== undefined) config.user = user\n if (footerActions !== undefined) config.footerActions = footerActions\n if (iconSet !== undefined) config.iconSet = iconSet\n if (collapsed !== undefined) config.collapsed = collapsed\n if (activeItemId !== undefined) config.activeItemId = activeItemId\n if (pathname !== undefined) config.pathname = pathname\n if (persistCollapsed !== undefined) config.persistCollapsed = persistCollapsed\n if (mobileBreakpoint !== undefined) config.mobileBreakpoint = mobileBreakpoint\n if (open !== undefined) config.open = open\n if (onNavigate !== undefined) config.onNavigate = onNavigate\n if (onCollapse !== undefined) config.onCollapse = onCollapse\n if (onOpenChange !== undefined) config.onOpenChange = onOpenChange\n\n return config\n}\n\nexport function createCoreAppTopbarActions(\n options: Pick<\n CoreAppTopbarPresetOptions,\n 'includeSearchAction' | 'includeFeedbackAction' | 'includeHelpAction'\n > = {}\n): TopMenuBarActionInput[] {\n const {\n includeSearchAction = true,\n includeFeedbackAction = true,\n includeHelpAction = true,\n } = options\n const actions: TopMenuBarActionInput[] = []\n\n if (includeSearchAction) {\n actions.push({\n id: 'search',\n label: 'Find...',\n icon: 'search',\n showLabel: true,\n className: 'cmm-topbar__action--search',\n attributes: { 'data-app-search-trigger': true },\n })\n }\n\n if (includeFeedbackAction) {\n actions.push({\n id: 'feedback',\n label: 'Feedback',\n showLabel: true,\n attributes: { 'data-feedback-toggle': true },\n })\n }\n\n if (includeHelpAction) {\n actions.push({\n id: 'help',\n label: 'Help',\n icon: 'help',\n attributes: { 'data-help-toggle': true },\n })\n }\n\n return actions\n}\n\nexport function createCoreAppTopbarConfig(\n options: CoreAppTopbarPresetOptions = {}\n): TopMenuBarConfig {\n const {\n basePath = '/app',\n pathname = typeof window === 'undefined' ? '/' : window.location.pathname,\n product = 'Threat Library',\n current = getCoreAppRouteLabel(pathname, basePath),\n actions,\n beforeActions,\n afterActions,\n user,\n iconSet,\n className,\n breadcrumbs,\n container,\n includeSearchAction,\n includeFeedbackAction,\n includeHelpAction,\n } = options\n\n const actionOptions: Pick<\n CoreAppTopbarPresetOptions,\n 'includeSearchAction' | 'includeFeedbackAction' | 'includeHelpAction'\n > = {}\n if (includeSearchAction !== undefined) actionOptions.includeSearchAction = includeSearchAction\n if (includeFeedbackAction !== undefined)\n actionOptions.includeFeedbackAction = includeFeedbackAction\n if (includeHelpAction !== undefined) actionOptions.includeHelpAction = includeHelpAction\n\n const config: TopMenuBarConfig = {\n product,\n current,\n actions: actions ?? createCoreAppTopbarActions(actionOptions),\n }\n\n if (container !== undefined) config.container = container\n if (breadcrumbs !== undefined) config.breadcrumbs = breadcrumbs\n if (beforeActions !== undefined) config.beforeActions = beforeActions\n if (afterActions !== undefined) config.afterActions = afterActions\n if (user !== undefined) config.user = user\n if (iconSet !== undefined) config.iconSet = iconSet\n if (className !== undefined) config.className = className\n\n return config\n}\n\nexport function createCoreAppChromePreset(\n options: CoreAppChromePresetOptions = {}\n): CoreAppChromePreset {\n const {\n basePath = '/app',\n pathname,\n scope,\n sidebarUser,\n sidebarFooterActions,\n topbarUser,\n topbarActions,\n } = options\n\n const sidebarOptions: CoreAppSidebarPresetOptions = { basePath }\n if (scope !== undefined) sidebarOptions.scope = scope\n if (sidebarUser !== undefined) sidebarOptions.user = sidebarUser\n if (sidebarFooterActions !== undefined) sidebarOptions.footerActions = sidebarFooterActions\n if (pathname !== undefined) sidebarOptions.pathname = pathname\n\n const topbarOptions: CoreAppTopbarPresetOptions = { basePath }\n if (pathname !== undefined) topbarOptions.pathname = pathname\n if (topbarUser !== undefined) topbarOptions.user = topbarUser\n if (topbarActions !== undefined) topbarOptions.actions = topbarActions\n\n return {\n sidebar: createCoreAppSidebarConfig(sidebarOptions),\n topbar: createCoreAppTopbarConfig(topbarOptions),\n }\n}\n\nfunction clearContainer(container: HTMLElement, clearContainers: boolean | undefined): void {\n if (clearContainers !== false) {\n container.replaceChildren()\n }\n}\n\nfunction collectTopbarActionNodes(options: {\n container: HTMLElement\n preserveTopbarActions: boolean | undefined\n selector: string | undefined\n}): HTMLElement[] {\n if (options.preserveTopbarActions === false) {\n return []\n }\n\n return Array.from(\n options.container.querySelectorAll<HTMLElement>(\n options.selector ?? DEFAULT_TOPBAR_ACTION_SELECTOR\n )\n )\n}\n\nfunction mergeElements(\n existing: HTMLElement | HTMLElement[] | undefined,\n additions: HTMLElement[]\n): HTMLElement | HTMLElement[] | undefined {\n if (additions.length === 0) {\n return existing\n }\n\n if (existing === undefined) {\n return additions\n }\n\n return Array.isArray(existing) ? [...existing, ...additions] : [existing, ...additions]\n}\n\nfunction hasPreservedActionAttribute(actions: HTMLElement[], attribute: string): boolean {\n return actions.some(action => action.hasAttribute(attribute))\n}\n\nfunction dedupeDefaultActionsForPreservedNodes(\n options: CoreAppTopbarPresetOptions,\n preservedActions: HTMLElement[]\n): void {\n if (options.actions !== undefined || preservedActions.length === 0) {\n return\n }\n\n if (\n options.includeSearchAction === undefined &&\n hasPreservedActionAttribute(preservedActions, 'data-app-search-trigger')\n ) {\n options.includeSearchAction = false\n }\n\n if (\n options.includeFeedbackAction === undefined &&\n hasPreservedActionAttribute(preservedActions, 'data-feedback-toggle')\n ) {\n options.includeFeedbackAction = false\n }\n\n if (\n options.includeHelpAction === undefined &&\n hasPreservedActionAttribute(preservedActions, 'data-help-toggle')\n ) {\n options.includeHelpAction = false\n }\n}\n\nfunction buildSidebarMountOptions(options: CoreAppChromeMountOptions): CoreAppSidebarPresetOptions {\n const basePath = options.sidebar?.basePath ?? options.basePath ?? '/app'\n const sidebarOptions: CoreAppSidebarPresetOptions = {\n ...options.sidebar,\n basePath,\n }\n\n if (options.scope !== undefined) sidebarOptions.scope = options.scope\n if (options.sidebarUser !== undefined) sidebarOptions.user = options.sidebarUser\n if (options.sidebarFooterActions !== undefined)\n sidebarOptions.footerActions = options.sidebarFooterActions\n if (options.pathname !== undefined && sidebarOptions.pathname === undefined) {\n sidebarOptions.pathname = options.pathname\n }\n\n return sidebarOptions\n}\n\nfunction buildTopbarMountOptions(\n options: CoreAppChromeMountOptions,\n topbarContainer: HTMLElement,\n preservedActions: HTMLElement[]\n): CoreAppTopbarPresetOptions {\n const basePath = options.topbar?.basePath ?? options.basePath ?? '/app'\n const topbarOptions: CoreAppTopbarPresetOptions = {\n ...options.topbar,\n basePath,\n container: topbarContainer,\n }\n const afterActions = mergeElements(options.topbar?.afterActions, preservedActions)\n\n if (options.pathname !== undefined) topbarOptions.pathname = options.pathname\n if (options.topbarUser !== undefined) topbarOptions.user = options.topbarUser\n if (options.topbarActions !== undefined) topbarOptions.actions = options.topbarActions\n if (options.topbar?.beforeActions !== undefined)\n topbarOptions.beforeActions = options.topbar.beforeActions\n if (afterActions !== undefined) topbarOptions.afterActions = afterActions\n dedupeDefaultActionsForPreservedNodes(topbarOptions, preservedActions)\n\n return topbarOptions\n}\n\nexport function mountCoreAppChrome(options: CoreAppChromeMountOptions): CoreAppChromeMount {\n const sidebarContainer = resolveContainer(options.sidebarContainer)\n clearContainer(sidebarContainer, options.clearContainers)\n\n const sidebar = new SidebarComponent({\n container: sidebarContainer,\n ...createCoreAppSidebarConfig(buildSidebarMountOptions(options)),\n })\n\n const topbarContainerOption = options.topbarContainer ?? options.topbar?.container\n const topbarContainer =\n topbarContainerOption === undefined ? undefined : resolveContainer(topbarContainerOption)\n let topbar: TopMenuBar | undefined\n\n if (topbarContainer !== undefined) {\n const preservedActions = collectTopbarActionNodes({\n container: topbarContainer,\n preserveTopbarActions: options.preserveTopbarActions,\n selector: options.topbarActionSelector,\n })\n clearContainer(topbarContainer, options.clearContainers)\n topbar = new TopMenuBar(\n createCoreAppTopbarConfig(buildTopbarMountOptions(options, topbarContainer, preservedActions))\n )\n }\n\n const mounted: CoreAppChromeMount = {\n sidebar,\n destroy: () => {\n topbar?.destroy()\n sidebar.destroy()\n },\n }\n\n if (topbar !== undefined) {\n mounted.topbar = topbar\n }\n\n return mounted\n}\n\nfunction readDataValue(element: HTMLElement | undefined, key: string): string | undefined {\n const value = element?.dataset[key]\n return value === undefined || value.length === 0 ? undefined : value\n}\n\nfunction buildDeclarativeTopbarOptions(\n options: CoreAppChromeDomMountOptions,\n sidebarContainer: HTMLElement,\n topbarContainer: HTMLElement | null\n): CoreAppTopbarPresetOptions | undefined {\n const product =\n options.topbar?.product ??\n readDataValue(topbarContainer ?? undefined, 'product') ??\n readDataValue(sidebarContainer, 'product')\n const current =\n options.topbar?.current ??\n readDataValue(topbarContainer ?? undefined, 'current') ??\n readDataValue(sidebarContainer, 'current')\n\n if (options.topbar === undefined && product === undefined && current === undefined) {\n return undefined\n }\n\n const topbar: CoreAppTopbarPresetOptions = { ...(options.topbar ?? {}) }\n if (product !== undefined) topbar.product = product\n if (current !== undefined) topbar.current = current\n return topbar\n}\n\nexport function mountCoreAppChromeFromDom(\n options: CoreAppChromeDomMountOptions = {}\n): CoreAppChromeMount | null {\n const root = options.root ?? document\n const sidebarContainer = root.querySelector<HTMLElement>(\n options.sidebarSelector ?? DEFAULT_DOM_SIDEBAR_SELECTOR\n )\n\n if (sidebarContainer === null) {\n return null\n }\n\n const topbarContainer = root.querySelector<HTMLElement>(\n options.topbarSelector ?? DEFAULT_DOM_TOPBAR_SELECTOR\n )\n const basePath =\n options.basePath ??\n options.sidebar?.basePath ??\n options.topbar?.basePath ??\n readDataValue(sidebarContainer, 'basePath') ??\n readDataValue(topbarContainer ?? undefined, 'basePath') ??\n '/app'\n const pathname =\n options.pathname ??\n readDataValue(sidebarContainer, 'pathname') ??\n readDataValue(topbarContainer ?? undefined, 'pathname')\n\n const mountOptions: CoreAppChromeMountOptions = {\n ...options,\n sidebarContainer,\n basePath,\n }\n const topbar = buildDeclarativeTopbarOptions(options, sidebarContainer, topbarContainer)\n if (topbar !== undefined) mountOptions.topbar = topbar\n if (topbarContainer !== null) mountOptions.topbarContainer = topbarContainer\n if (pathname !== undefined) mountOptions.pathname = pathname\n\n return mountCoreAppChrome(mountOptions)\n}\n"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ export type CoreAppLibraryMetricTone = 'cyan' | 'orange' | 'violet' | 'neutral';
2
+ export type CoreAppLibraryConnectorStatus = 'active' | 'error' | 'paused' | 'disabled';
3
+ export interface CoreAppLibraryMetric {
4
+ id: string;
5
+ label: string;
6
+ value: number | string;
7
+ helper?: string;
8
+ tone?: CoreAppLibraryMetricTone;
9
+ }
10
+ export interface CoreAppLibraryTacticDepth {
11
+ label: string;
12
+ value: number;
13
+ }
14
+ export interface CoreAppLibraryFreshnessBucket {
15
+ label: string;
16
+ detections: number;
17
+ rules?: number;
18
+ intel?: number;
19
+ }
20
+ export interface CoreAppLibraryConnector {
21
+ id: string;
22
+ name: string;
23
+ status: CoreAppLibraryConnectorStatus;
24
+ schedule: string;
25
+ tags: string[];
26
+ lastRun: string;
27
+ enabled?: boolean;
28
+ }
29
+ export interface CoreAppLibraryPipelineSummary {
30
+ connectors: number;
31
+ active: number;
32
+ error: number;
33
+ }
34
+ export interface CoreAppLibraryDashboardError {
35
+ source?: string;
36
+ detail: string;
37
+ }
38
+ export interface CoreAppLibraryDashboardData {
39
+ title?: string;
40
+ subtitle?: string;
41
+ metrics?: CoreAppLibraryMetric[];
42
+ tacticDepth?: CoreAppLibraryTacticDepth[];
43
+ freshness?: CoreAppLibraryFreshnessBucket[];
44
+ pipelineSummary?: CoreAppLibraryPipelineSummary;
45
+ connectors?: CoreAppLibraryConnector[];
46
+ loading?: boolean;
47
+ error?: string;
48
+ errors?: CoreAppLibraryDashboardError[];
49
+ generatedAt?: string;
50
+ }
51
+ export interface CoreAppLibraryDashboardMountOptions {
52
+ container: HTMLElement | string;
53
+ data?: CoreAppLibraryDashboardData;
54
+ className?: string;
55
+ clearContainer?: boolean;
56
+ }
57
+ export interface CoreAppLibraryDashboardDomMountOptions {
58
+ root?: ParentNode;
59
+ selector?: string;
60
+ dataSelector?: string;
61
+ data?: CoreAppLibraryDashboardData;
62
+ className?: string;
63
+ clearContainer?: boolean;
64
+ }
65
+ export interface CoreAppLibraryDashboardMount {
66
+ element: HTMLElement;
67
+ update: (data: CoreAppLibraryDashboardData) => void;
68
+ destroy: () => void;
69
+ }
70
+ export declare function mountCoreAppLibraryDashboard(options: CoreAppLibraryDashboardMountOptions): CoreAppLibraryDashboardMount;
71
+ export declare function mountCoreAppLibraryDashboardFromDom(options?: CoreAppLibraryDashboardDomMountOptions): CoreAppLibraryDashboardMount | null;
72
+ //# sourceMappingURL=core-app-library-dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-app-library-dashboard.d.ts","sourceRoot":"","sources":["../../src/layout/core-app-library-dashboard.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;AAC/E,MAAM,MAAM,6BAA6B,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAA;AAEtF,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,wBAAwB,CAAA;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,6BAA6B,CAAA;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAChC,WAAW,CAAC,EAAE,yBAAyB,EAAE,CAAA;IACzC,SAAS,CAAC,EAAE,6BAA6B,EAAE,CAAA;IAC3C,eAAe,CAAC,EAAE,6BAA6B,CAAA;IAC/C,UAAU,CAAC,EAAE,uBAAuB,EAAE,CAAA;IACtC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,4BAA4B,EAAE,CAAA;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,mCAAmC;IAClD,SAAS,EAAE,WAAW,GAAG,MAAM,CAAA;IAC/B,IAAI,CAAC,EAAE,2BAA2B,CAAA;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,sCAAsC;IACrD,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAE,2BAA2B,CAAA;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,WAAW,CAAA;IACpB,MAAM,EAAE,CAAC,IAAI,EAAE,2BAA2B,KAAK,IAAI,CAAA;IACnD,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAsYD,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,mCAAmC,GAC3C,4BAA4B,CAyB9B;AAED,wBAAgB,mCAAmC,CACjD,OAAO,GAAE,sCAA2C,GACnD,4BAA4B,GAAG,IAAI,CAiBrC"}
@@ -0,0 +1,160 @@
1
+ import { t as e } from "../utils-CSEWuKHo.js";
2
+ //#region src/layout/core-app-library-dashboard.ts
3
+ var t = "[data-core-app-library-dashboard]", n = "[data-core-app-library-dashboard-data]", r = "cmm-library-dashboard-title", i = 0, a = {
4
+ connectors: 0,
5
+ active: 0,
6
+ error: 0
7
+ }, o = (e, t, n) => {
8
+ let r = document.createElement(e);
9
+ return t !== void 0 && (r.className = t), n !== void 0 && (r.textContent = n), r;
10
+ }, s = (e) => typeof e == "number" ? e.toLocaleString() : e, c = (e) => Number.isFinite(e) && e !== void 0 ? e : 0, l = (e, t = 5) => {
11
+ let n = Math.max(0, Math.ceil(e));
12
+ if (n === 0) return [0];
13
+ if (n <= t - 1) return Array.from({ length: n + 1 }, (e, t) => t);
14
+ let r = new Set([0, n]);
15
+ for (let e = 1; e < t - 1; e += 1) r.add(Math.round(n * e / (t - 1)));
16
+ return Array.from(r).sort((e, t) => e - t);
17
+ }, u = (e) => {
18
+ let t = e.getAttribute("aria-labelledby");
19
+ return t !== null && t.length > 0 ? t : (i += 1, `${r}-${i}`);
20
+ }, d = (e) => e.map((e) => ({ ...e })), f = (e) => e.map((e) => ({ ...e })), p = (e) => e.map((e) => ({ ...e })), m = (e) => e.map((e) => ({
21
+ ...e,
22
+ tags: [...e.tags]
23
+ })), h = (e) => e.map((e) => ({ ...e })), g = (e) => ({
24
+ title: e?.title ?? "Library Dashboard",
25
+ subtitle: e?.subtitle ?? "Detection content, MITRE coverage, and collection pipeline.",
26
+ metrics: d(e?.metrics ?? []),
27
+ tacticDepth: f(e?.tacticDepth ?? []),
28
+ freshness: p(e?.freshness ?? []),
29
+ pipelineSummary: { ...e?.pipelineSummary ?? a },
30
+ connectors: m(e?.connectors ?? []),
31
+ loading: e?.loading ?? !1,
32
+ ...e?.error === void 0 ? {} : { error: e.error },
33
+ errors: h(e?.errors ?? []),
34
+ ...e?.generatedAt === void 0 ? {} : { generatedAt: e.generatedAt }
35
+ }), _ = (e) => {
36
+ if (e !== null) try {
37
+ let t = JSON.parse(e.textContent ?? "");
38
+ return typeof t == "object" && t ? t : void 0;
39
+ } catch {
40
+ return;
41
+ }
42
+ }, v = (e, t) => {
43
+ let n = o("article", "cmm-library-metric");
44
+ n.dataset.tone = t.tone ?? "neutral", n.dataset.metricId = t.id, n.append(o("div", "cmm-library-metric__label", t.label), o("div", "cmm-library-metric__value", s(t.value))), t.helper !== void 0 && n.appendChild(o("div", "cmm-library-metric__helper", t.helper)), e.appendChild(n);
45
+ }, y = (e, t, n = "cmm-library-dashboard__empty") => {
46
+ e.appendChild(o("div", n, t));
47
+ }, b = (e, t) => {
48
+ let n = o("div", "cmm-library-dashboard__metrics");
49
+ if (t.length === 0) {
50
+ y(n, "No metrics available"), e.appendChild(n);
51
+ return;
52
+ }
53
+ for (let e of t) v(n, e);
54
+ e.appendChild(n);
55
+ }, x = (e, t) => {
56
+ if (t.errors.length === 0 && t.generatedAt === void 0) return;
57
+ let n = o("div", "cmm-library-dashboard__meta");
58
+ t.generatedAt !== void 0 && n.appendChild(o("span", "cmm-library-dashboard__timestamp", `Updated ${t.generatedAt}`));
59
+ for (let e of t.errors) {
60
+ let t = e.source === void 0 ? e.detail : `${e.source}: ${e.detail}`;
61
+ n.appendChild(o("span", "cmm-library-dashboard__warning", t));
62
+ }
63
+ e.appendChild(n);
64
+ }, S = (e, t) => {
65
+ let n = o("section", "cmm-library-chart cmm-library-chart--depth"), r = o("h2", "cmm-library-chart__title", "Detection Depth by Tactic"), i = o("div", "cmm-library-depth");
66
+ if (t.length === 0) {
67
+ y(i, "No tactic coverage yet", "cmm-library-chart__empty"), n.append(r, i), e.appendChild(n);
68
+ return;
69
+ }
70
+ let a = Math.max(1, ...t.map((e) => e.value));
71
+ for (let e of t) {
72
+ let t = o("div", "cmm-library-depth__row"), n = o("div", "cmm-library-depth__label", e.label), r = o("div", "cmm-library-depth__track"), s = o("span", "cmm-library-depth__bar");
73
+ s.style.width = `${Math.max(4, e.value / a * 100).toFixed(2)}%`, s.setAttribute("aria-label", `${e.label}: ${e.value}`), r.appendChild(s), t.append(n, r), i.appendChild(t);
74
+ }
75
+ let s = o("div", "cmm-library-depth__axis");
76
+ for (let e of l(a)) s.appendChild(o("span", void 0, String(e)));
77
+ i.appendChild(s), n.append(r, i), e.appendChild(n);
78
+ }, C = (e, t) => {
79
+ let n = o("section", "cmm-library-chart cmm-library-chart--freshness"), r = o("h2", "cmm-library-chart__title", "Content Freshness (30d)"), i = o("div", "cmm-library-freshness");
80
+ if (t.length === 0) {
81
+ y(i, "No recent content activity", "cmm-library-chart__empty"), n.append(r, i), e.appendChild(n);
82
+ return;
83
+ }
84
+ let a = o("div", "cmm-library-freshness__plot"), s = Math.max(1, ...t.map((e) => e.detections + c(e.rules) + c(e.intel)));
85
+ for (let e of t) {
86
+ let t = o("div", "cmm-library-freshness__bucket"), n = o("div", "cmm-library-freshness__stack"), r = e.detections + c(e.rules) + c(e.intel);
87
+ n.style.height = `${Math.max(8, r / s * 100).toFixed(2)}%`, n.setAttribute("aria-label", `${e.label || "Freshness bucket"}: ${r}`);
88
+ let i = o("span", "cmm-library-freshness__segment");
89
+ i.dataset.tone = "cyan", i.style.flexGrow = String(e.detections);
90
+ let l = o("span", "cmm-library-freshness__segment");
91
+ l.dataset.tone = "green", l.style.flexGrow = String(c(e.rules));
92
+ let u = o("span", "cmm-library-freshness__segment");
93
+ u.dataset.tone = "orange", u.style.flexGrow = String(c(e.intel)), n.append(i, l, u), t.appendChild(n), e.label.length > 0 && t.appendChild(o("span", "cmm-library-freshness__label", e.label)), a.appendChild(t);
94
+ }
95
+ let u = o("div", "cmm-library-freshness__axis"), d = Math.max(1, ...t.map((e) => e.detections + c(e.rules) + c(e.intel)));
96
+ for (let e of l(d).reverse()) u.appendChild(o("span", void 0, String(e)));
97
+ i.append(u, a), n.append(r, i), e.appendChild(n);
98
+ }, w = (e, t) => {
99
+ let n = o("div", "cmm-library-dashboard__charts");
100
+ S(n, t.tacticDepth), C(n, t.freshness), e.appendChild(n);
101
+ }, T = (e) => e === "active" ? "success" : e === "error" ? "error" : e === "paused" ? "warn" : "neutral", E = (e, t) => {
102
+ let n = o("article", "cmm-library-pipeline-card");
103
+ n.dataset.status = t.status;
104
+ let r = o("div", "cmm-library-pipeline-card__head"), i = o("div", "cmm-library-pipeline-card__name-wrap"), a = o("span", "cmm-library-pipeline-card__glyph", "");
105
+ a.setAttribute("aria-hidden", "true"), i.append(a, o("h3", "cmm-library-pipeline-card__name", t.name));
106
+ let s = o("span", "cmm-library-pipeline-card__badge", t.status[0]?.toUpperCase() + t.status.slice(1));
107
+ s.dataset.tone = T(t.status), r.append(i, s);
108
+ let c = o("div", "cmm-library-pipeline-card__meta");
109
+ c.appendChild(o("span", void 0, t.schedule));
110
+ for (let e of t.tags) c.appendChild(o("span", void 0, e));
111
+ let l = o("div", "cmm-library-pipeline-card__foot");
112
+ l.append(o("span", void 0, t.lastRun), o("span", void 0, t.enabled === !1 ? "Disabled" : "Enabled")), n.append(r, c, l), e.appendChild(n);
113
+ }, D = (e, t) => {
114
+ let n = o("section", "cmm-library-dashboard__pipeline"), r = o("div", "cmm-library-dashboard__pipeline-heading");
115
+ r.appendChild(o("h2", "cmm-library-dashboard__eyebrow", "Collection Pipeline"));
116
+ let i = o("div", "cmm-library-dashboard__pipeline-summary");
117
+ i.append(o("span", void 0, `${t.pipelineSummary.connectors} connectors`), o("span", void 0, `${t.pipelineSummary.active} active`), o("span", void 0, `${t.pipelineSummary.error} error`)), r.appendChild(i);
118
+ let a = o("div", "cmm-library-dashboard__pipeline-grid");
119
+ if (t.connectors.length === 0) y(a, "No connectors configured");
120
+ else for (let e of t.connectors) E(a, e);
121
+ n.append(r, a), e.appendChild(n);
122
+ }, O = (e, t, n) => {
123
+ let r = o("div", "cmm-library-dashboard__state");
124
+ r.appendChild(o("h2", "cmm-library-dashboard__state-title", t)), n !== void 0 && n.length > 0 && r.appendChild(o("p", "cmm-library-dashboard__state-detail", n)), e.appendChild(r);
125
+ }, k = (e, t) => {
126
+ let n = u(e);
127
+ e.setAttribute("aria-labelledby", n);
128
+ let r = o("div", "cmm-library-dashboard__inner"), i = o("header", "cmm-library-dashboard__header"), a = o("h1", "cmm-library-dashboard__title", t.title);
129
+ if (a.id = n, i.append(a, o("p", "cmm-library-dashboard__subtitle", t.subtitle)), r.appendChild(i), x(r, t), t.loading) {
130
+ O(r, "Loading library dashboard"), e.replaceChildren(r);
131
+ return;
132
+ }
133
+ if (t.error !== void 0) {
134
+ O(r, "Unable to load dashboard", t.error), e.replaceChildren(r);
135
+ return;
136
+ }
137
+ b(r, t.metrics), w(r, t), D(r, t), e.replaceChildren(r);
138
+ };
139
+ function A(t) {
140
+ let n = e(t.container), r = o("section", "cmm-library-dashboard");
141
+ return t.className !== void 0 && t.className.length > 0 && r.classList.add(...t.className.split(/\s+/).filter(Boolean)), k(r, g(t.data)), t.clearContainer === !1 ? n.appendChild(r) : n.replaceChildren(r), {
142
+ element: r,
143
+ update: (e) => {
144
+ k(r, g(e));
145
+ },
146
+ destroy: () => {
147
+ r.remove();
148
+ }
149
+ };
150
+ }
151
+ function j(e = {}) {
152
+ let r = e.root ?? document, i = r.querySelector(e.selector ?? t);
153
+ if (i === null) return null;
154
+ let a = r.querySelector(e.dataSelector ?? n), o = { container: i }, s = e.data ?? _(a);
155
+ return s !== void 0 && (o.data = s), e.className !== void 0 && (o.className = e.className), e.clearContainer !== void 0 && (o.clearContainer = e.clearContainer), A(o);
156
+ }
157
+ //#endregion
158
+ export { A as mountCoreAppLibraryDashboard, j as mountCoreAppLibraryDashboardFromDom };
159
+
160
+ //# sourceMappingURL=core-app-library-dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-app-library-dashboard.js","names":[],"sources":["../../src/layout/core-app-library-dashboard.ts"],"sourcesContent":["import { resolveContainer } from '../primitives/utils'\n\nexport type CoreAppLibraryMetricTone = 'cyan' | 'orange' | 'violet' | 'neutral'\nexport type CoreAppLibraryConnectorStatus = 'active' | 'error' | 'paused' | 'disabled'\n\nexport interface CoreAppLibraryMetric {\n id: string\n label: string\n value: number | string\n helper?: string\n tone?: CoreAppLibraryMetricTone\n}\n\nexport interface CoreAppLibraryTacticDepth {\n label: string\n value: number\n}\n\nexport interface CoreAppLibraryFreshnessBucket {\n label: string\n detections: number\n rules?: number\n intel?: number\n}\n\nexport interface CoreAppLibraryConnector {\n id: string\n name: string\n status: CoreAppLibraryConnectorStatus\n schedule: string\n tags: string[]\n lastRun: string\n enabled?: boolean\n}\n\nexport interface CoreAppLibraryPipelineSummary {\n connectors: number\n active: number\n error: number\n}\n\nexport interface CoreAppLibraryDashboardError {\n source?: string\n detail: string\n}\n\nexport interface CoreAppLibraryDashboardData {\n title?: string\n subtitle?: string\n metrics?: CoreAppLibraryMetric[]\n tacticDepth?: CoreAppLibraryTacticDepth[]\n freshness?: CoreAppLibraryFreshnessBucket[]\n pipelineSummary?: CoreAppLibraryPipelineSummary\n connectors?: CoreAppLibraryConnector[]\n loading?: boolean\n error?: string\n errors?: CoreAppLibraryDashboardError[]\n generatedAt?: string\n}\n\nexport interface CoreAppLibraryDashboardMountOptions {\n container: HTMLElement | string\n data?: CoreAppLibraryDashboardData\n className?: string\n clearContainer?: boolean\n}\n\nexport interface CoreAppLibraryDashboardDomMountOptions {\n root?: ParentNode\n selector?: string\n dataSelector?: string\n data?: CoreAppLibraryDashboardData\n className?: string\n clearContainer?: boolean\n}\n\nexport interface CoreAppLibraryDashboardMount {\n element: HTMLElement\n update: (data: CoreAppLibraryDashboardData) => void\n destroy: () => void\n}\n\ninterface NormalizedDashboardData {\n title: string\n subtitle: string\n metrics: CoreAppLibraryMetric[]\n tacticDepth: CoreAppLibraryTacticDepth[]\n freshness: CoreAppLibraryFreshnessBucket[]\n pipelineSummary: CoreAppLibraryPipelineSummary\n connectors: CoreAppLibraryConnector[]\n loading: boolean\n error?: string\n errors: CoreAppLibraryDashboardError[]\n generatedAt?: string\n}\n\nconst DEFAULT_DOM_SELECTOR = '[data-core-app-library-dashboard]'\nconst DEFAULT_DATA_SELECTOR = '[data-core-app-library-dashboard-data]'\nconst DASHBOARD_TITLE_ID_PREFIX = 'cmm-library-dashboard-title'\nlet dashboardTitleIdSequence = 0\n\nconst EMPTY_PIPELINE_SUMMARY: CoreAppLibraryPipelineSummary = {\n connectors: 0,\n active: 0,\n error: 0,\n}\n\nconst createElement = <K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n className?: string,\n textContent?: string\n): HTMLElementTagNameMap[K] => {\n const element = document.createElement(tagName)\n if (className !== undefined) element.className = className\n if (textContent !== undefined) element.textContent = textContent\n return element\n}\n\nconst toDisplayValue = (value: number | string): string =>\n typeof value === 'number' ? value.toLocaleString() : value\n\nconst toNumber = (value: number | undefined): number =>\n Number.isFinite(value) && value !== undefined ? value : 0\n\nconst createIntegerTicks = (maxValue: number, maxTicks = 5): number[] => {\n const max = Math.max(0, Math.ceil(maxValue))\n if (max === 0) return [0]\n if (max <= maxTicks - 1) {\n return Array.from({ length: max + 1 }, (_, index) => index)\n }\n\n const ticks = new Set<number>([0, max])\n for (let index = 1; index < maxTicks - 1; index += 1) {\n ticks.add(Math.round((max * index) / (maxTicks - 1)))\n }\n\n return Array.from(ticks).sort((left, right) => left - right)\n}\n\nconst getDashboardTitleId = (root: HTMLElement): string => {\n const existing = root.getAttribute('aria-labelledby')\n if (existing !== null && existing.length > 0) return existing\n\n dashboardTitleIdSequence += 1\n return `${DASHBOARD_TITLE_ID_PREFIX}-${dashboardTitleIdSequence}`\n}\n\nconst cloneMetrics = (metrics: CoreAppLibraryMetric[]): CoreAppLibraryMetric[] =>\n metrics.map(metric => ({ ...metric }))\n\nconst cloneTactics = (tactics: CoreAppLibraryTacticDepth[]): CoreAppLibraryTacticDepth[] =>\n tactics.map(tactic => ({ ...tactic }))\n\nconst cloneFreshness = (\n buckets: CoreAppLibraryFreshnessBucket[]\n): CoreAppLibraryFreshnessBucket[] => buckets.map(bucket => ({ ...bucket }))\n\nconst cloneConnectors = (connectors: CoreAppLibraryConnector[]): CoreAppLibraryConnector[] =>\n connectors.map(connector => ({ ...connector, tags: [...connector.tags] }))\n\nconst cloneErrors = (errors: CoreAppLibraryDashboardError[]): CoreAppLibraryDashboardError[] =>\n errors.map(error => ({ ...error }))\n\nconst normalizeDashboardData = (\n data: CoreAppLibraryDashboardData | undefined\n): NormalizedDashboardData => ({\n title: data?.title ?? 'Library Dashboard',\n subtitle: data?.subtitle ?? 'Detection content, MITRE coverage, and collection pipeline.',\n metrics: cloneMetrics(data?.metrics ?? []),\n tacticDepth: cloneTactics(data?.tacticDepth ?? []),\n freshness: cloneFreshness(data?.freshness ?? []),\n pipelineSummary: { ...(data?.pipelineSummary ?? EMPTY_PIPELINE_SUMMARY) },\n connectors: cloneConnectors(data?.connectors ?? []),\n loading: data?.loading ?? false,\n ...(data?.error !== undefined ? { error: data.error } : {}),\n errors: cloneErrors(data?.errors ?? []),\n ...(data?.generatedAt !== undefined ? { generatedAt: data.generatedAt } : {}),\n})\n\nconst parseDashboardData = (\n element: HTMLElement | null\n): CoreAppLibraryDashboardData | undefined => {\n if (element === null) return undefined\n\n try {\n const parsed: unknown = JSON.parse(element.textContent ?? '')\n return parsed !== null && typeof parsed === 'object'\n ? (parsed as CoreAppLibraryDashboardData)\n : undefined\n } catch {\n return undefined\n }\n}\n\nconst appendMetricCard = (container: HTMLElement, metric: CoreAppLibraryMetric): void => {\n const card = createElement('article', 'cmm-library-metric')\n card.dataset.tone = metric.tone ?? 'neutral'\n card.dataset.metricId = metric.id\n\n card.append(\n createElement('div', 'cmm-library-metric__label', metric.label),\n createElement('div', 'cmm-library-metric__value', toDisplayValue(metric.value))\n )\n\n if (metric.helper !== undefined) {\n card.appendChild(createElement('div', 'cmm-library-metric__helper', metric.helper))\n }\n\n container.appendChild(card)\n}\n\nconst appendEmpty = (\n container: HTMLElement,\n text: string,\n className = 'cmm-library-dashboard__empty'\n): void => {\n container.appendChild(createElement('div', className, text))\n}\n\nconst appendMetricStrip = (container: HTMLElement, metrics: CoreAppLibraryMetric[]): void => {\n const strip = createElement('div', 'cmm-library-dashboard__metrics')\n if (metrics.length === 0) {\n appendEmpty(strip, 'No metrics available')\n container.appendChild(strip)\n return\n }\n\n for (const metric of metrics) {\n appendMetricCard(strip, metric)\n }\n container.appendChild(strip)\n}\n\nconst appendDashboardMeta = (\n container: HTMLElement,\n data: Pick<NormalizedDashboardData, 'errors' | 'generatedAt'>\n): void => {\n if (data.errors.length === 0 && data.generatedAt === undefined) return\n\n const meta = createElement('div', 'cmm-library-dashboard__meta')\n if (data.generatedAt !== undefined) {\n meta.appendChild(\n createElement('span', 'cmm-library-dashboard__timestamp', `Updated ${data.generatedAt}`)\n )\n }\n\n for (const error of data.errors) {\n const detail = error.source !== undefined ? `${error.source}: ${error.detail}` : error.detail\n meta.appendChild(createElement('span', 'cmm-library-dashboard__warning', detail))\n }\n\n container.appendChild(meta)\n}\n\nconst appendTacticDepthChart = (\n container: HTMLElement,\n tactics: CoreAppLibraryTacticDepth[]\n): void => {\n const panel = createElement('section', 'cmm-library-chart cmm-library-chart--depth')\n const title = createElement('h2', 'cmm-library-chart__title', 'Detection Depth by Tactic')\n const body = createElement('div', 'cmm-library-depth')\n\n if (tactics.length === 0) {\n appendEmpty(body, 'No tactic coverage yet', 'cmm-library-chart__empty')\n panel.append(title, body)\n container.appendChild(panel)\n return\n }\n\n const maxValue = Math.max(1, ...tactics.map(tactic => tactic.value))\n\n for (const tactic of tactics) {\n const row = createElement('div', 'cmm-library-depth__row')\n const label = createElement('div', 'cmm-library-depth__label', tactic.label)\n const barTrack = createElement('div', 'cmm-library-depth__track')\n const bar = createElement('span', 'cmm-library-depth__bar')\n bar.style.width = `${Math.max(4, (tactic.value / maxValue) * 100).toFixed(2)}%`\n bar.setAttribute('aria-label', `${tactic.label}: ${tactic.value}`)\n barTrack.appendChild(bar)\n row.append(label, barTrack)\n body.appendChild(row)\n }\n\n const axis = createElement('div', 'cmm-library-depth__axis')\n for (const label of createIntegerTicks(maxValue)) {\n axis.appendChild(createElement('span', undefined, String(label)))\n }\n body.appendChild(axis)\n panel.append(title, body)\n container.appendChild(panel)\n}\n\nconst appendFreshnessChart = (\n container: HTMLElement,\n buckets: CoreAppLibraryFreshnessBucket[]\n): void => {\n const panel = createElement('section', 'cmm-library-chart cmm-library-chart--freshness')\n const title = createElement('h2', 'cmm-library-chart__title', 'Content Freshness (30d)')\n const body = createElement('div', 'cmm-library-freshness')\n\n if (buckets.length === 0) {\n appendEmpty(body, 'No recent content activity', 'cmm-library-chart__empty')\n panel.append(title, body)\n container.appendChild(panel)\n return\n }\n\n const plot = createElement('div', 'cmm-library-freshness__plot')\n const maxTotal = Math.max(\n 1,\n ...buckets.map(bucket => bucket.detections + toNumber(bucket.rules) + toNumber(bucket.intel))\n )\n\n for (const bucket of buckets) {\n const column = createElement('div', 'cmm-library-freshness__bucket')\n const stack = createElement('div', 'cmm-library-freshness__stack')\n const total = bucket.detections + toNumber(bucket.rules) + toNumber(bucket.intel)\n stack.style.height = `${Math.max(8, (total / maxTotal) * 100).toFixed(2)}%`\n stack.setAttribute('aria-label', `${bucket.label || 'Freshness bucket'}: ${total}`)\n\n const detections = createElement('span', 'cmm-library-freshness__segment')\n detections.dataset.tone = 'cyan'\n detections.style.flexGrow = String(bucket.detections)\n const rules = createElement('span', 'cmm-library-freshness__segment')\n rules.dataset.tone = 'green'\n rules.style.flexGrow = String(toNumber(bucket.rules))\n const intel = createElement('span', 'cmm-library-freshness__segment')\n intel.dataset.tone = 'orange'\n intel.style.flexGrow = String(toNumber(bucket.intel))\n\n stack.append(detections, rules, intel)\n column.appendChild(stack)\n if (bucket.label.length > 0) {\n column.appendChild(createElement('span', 'cmm-library-freshness__label', bucket.label))\n }\n plot.appendChild(column)\n }\n\n const axis = createElement('div', 'cmm-library-freshness__axis')\n const axisMax = Math.max(\n 1,\n ...buckets.map(bucket => bucket.detections + toNumber(bucket.rules) + toNumber(bucket.intel))\n )\n for (const label of createIntegerTicks(axisMax).reverse()) {\n axis.appendChild(createElement('span', undefined, String(label)))\n }\n\n body.append(axis, plot)\n panel.append(title, body)\n container.appendChild(panel)\n}\n\nconst appendCharts = (\n container: HTMLElement,\n data: Pick<NormalizedDashboardData, 'tacticDepth' | 'freshness'>\n): void => {\n const charts = createElement('div', 'cmm-library-dashboard__charts')\n appendTacticDepthChart(charts, data.tacticDepth)\n appendFreshnessChart(charts, data.freshness)\n container.appendChild(charts)\n}\n\nconst connectorTone = (status: CoreAppLibraryConnectorStatus): string => {\n if (status === 'active') return 'success'\n if (status === 'error') return 'error'\n if (status === 'paused') return 'warn'\n return 'neutral'\n}\n\nconst appendConnectorCard = (container: HTMLElement, connector: CoreAppLibraryConnector): void => {\n const card = createElement('article', 'cmm-library-pipeline-card')\n card.dataset.status = connector.status\n\n const head = createElement('div', 'cmm-library-pipeline-card__head')\n const nameWrap = createElement('div', 'cmm-library-pipeline-card__name-wrap')\n const glyph = createElement('span', 'cmm-library-pipeline-card__glyph', '')\n glyph.setAttribute('aria-hidden', 'true')\n nameWrap.append(glyph, createElement('h3', 'cmm-library-pipeline-card__name', connector.name))\n\n const badge = createElement(\n 'span',\n 'cmm-library-pipeline-card__badge',\n connector.status[0]?.toUpperCase() + connector.status.slice(1)\n )\n badge.dataset.tone = connectorTone(connector.status)\n head.append(nameWrap, badge)\n\n const meta = createElement('div', 'cmm-library-pipeline-card__meta')\n meta.appendChild(createElement('span', undefined, connector.schedule))\n for (const tag of connector.tags) {\n meta.appendChild(createElement('span', undefined, tag))\n }\n\n const foot = createElement('div', 'cmm-library-pipeline-card__foot')\n foot.append(\n createElement('span', undefined, connector.lastRun),\n createElement('span', undefined, connector.enabled === false ? 'Disabled' : 'Enabled')\n )\n\n card.append(head, meta, foot)\n container.appendChild(card)\n}\n\nconst appendPipeline = (\n container: HTMLElement,\n data: Pick<NormalizedDashboardData, 'pipelineSummary' | 'connectors'>\n): void => {\n const section = createElement('section', 'cmm-library-dashboard__pipeline')\n const heading = createElement('div', 'cmm-library-dashboard__pipeline-heading')\n heading.appendChild(createElement('h2', 'cmm-library-dashboard__eyebrow', 'Collection Pipeline'))\n\n const summary = createElement('div', 'cmm-library-dashboard__pipeline-summary')\n summary.append(\n createElement('span', undefined, `${data.pipelineSummary.connectors} connectors`),\n createElement('span', undefined, `${data.pipelineSummary.active} active`),\n createElement('span', undefined, `${data.pipelineSummary.error} error`)\n )\n heading.appendChild(summary)\n\n const grid = createElement('div', 'cmm-library-dashboard__pipeline-grid')\n if (data.connectors.length === 0) {\n appendEmpty(grid, 'No connectors configured')\n } else {\n for (const connector of data.connectors) {\n appendConnectorCard(grid, connector)\n }\n }\n\n section.append(heading, grid)\n container.appendChild(section)\n}\n\nconst appendDashboardState = (container: HTMLElement, title: string, detail?: string): void => {\n const state = createElement('div', 'cmm-library-dashboard__state')\n state.appendChild(createElement('h2', 'cmm-library-dashboard__state-title', title))\n if (detail !== undefined && detail.length > 0) {\n state.appendChild(createElement('p', 'cmm-library-dashboard__state-detail', detail))\n }\n container.appendChild(state)\n}\n\nconst renderDashboard = (root: HTMLElement, data: NormalizedDashboardData): void => {\n const titleId = getDashboardTitleId(root)\n root.setAttribute('aria-labelledby', titleId)\n\n const inner = createElement('div', 'cmm-library-dashboard__inner')\n const header = createElement('header', 'cmm-library-dashboard__header')\n const title = createElement('h1', 'cmm-library-dashboard__title', data.title)\n title.id = titleId\n header.append(title, createElement('p', 'cmm-library-dashboard__subtitle', data.subtitle))\n\n inner.appendChild(header)\n appendDashboardMeta(inner, data)\n if (data.loading) {\n appendDashboardState(inner, 'Loading library dashboard')\n root.replaceChildren(inner)\n return\n }\n if (data.error !== undefined) {\n appendDashboardState(inner, 'Unable to load dashboard', data.error)\n root.replaceChildren(inner)\n return\n }\n\n appendMetricStrip(inner, data.metrics)\n appendCharts(inner, data)\n appendPipeline(inner, data)\n root.replaceChildren(inner)\n}\n\nexport function mountCoreAppLibraryDashboard(\n options: CoreAppLibraryDashboardMountOptions\n): CoreAppLibraryDashboardMount {\n const container = resolveContainer(options.container)\n const element = createElement('section', 'cmm-library-dashboard')\n\n if (options.className !== undefined && options.className.length > 0) {\n element.classList.add(...options.className.split(/\\s+/).filter(Boolean))\n }\n\n renderDashboard(element, normalizeDashboardData(options.data))\n\n if (options.clearContainer !== false) {\n container.replaceChildren(element)\n } else {\n container.appendChild(element)\n }\n\n return {\n element,\n update: (data: CoreAppLibraryDashboardData) => {\n renderDashboard(element, normalizeDashboardData(data))\n },\n destroy: () => {\n element.remove()\n },\n }\n}\n\nexport function mountCoreAppLibraryDashboardFromDom(\n options: CoreAppLibraryDashboardDomMountOptions = {}\n): CoreAppLibraryDashboardMount | null {\n const root = options.root ?? document\n const container = root.querySelector<HTMLElement>(options.selector ?? DEFAULT_DOM_SELECTOR)\n if (container === null) {\n return null\n }\n\n const dataElement = root.querySelector<HTMLElement>(options.dataSelector ?? DEFAULT_DATA_SELECTOR)\n const mountOptions: CoreAppLibraryDashboardMountOptions = { container }\n const data = options.data ?? parseDashboardData(dataElement)\n if (data !== undefined) mountOptions.data = data\n if (options.className !== undefined) mountOptions.className = options.className\n if (options.clearContainer !== undefined) {\n mountOptions.clearContainer = options.clearContainer\n }\n\n return mountCoreAppLibraryDashboard(mountOptions)\n}\n"],"mappings":"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"}
@@ -8,6 +8,8 @@ export { AppShell, TopMenuBar, createAppShell, createProductShell, createTopMenu
8
8
  export type { AppShellConfig, TopMenuBarAction, TopMenuBarActionInput, TopMenuBarBreadcrumb, TopMenuBarConfig, TopMenuBarUser, } from './app-shell';
9
9
  export { CORE_APP_ROUTE_LABELS, createCoreAppChromePreset, createCoreAppSidebarConfig, createCoreAppSidebarSections, createCoreAppTopbarActions, createCoreAppTopbarConfig, getCoreAppRouteLabel, mountCoreAppChrome, mountCoreAppChromeFromDom, } from './core-app-chrome';
10
10
  export type { CoreAppChromePreset, CoreAppChromeDomMountOptions, CoreAppChromeMount, CoreAppChromeMountOptions, CoreAppChromePresetOptions, CoreAppRouteLabel, CoreAppSidebarPresetOptions, CoreAppTopbarPresetOptions, } from './core-app-chrome';
11
+ export { mountCoreAppLibraryDashboard, mountCoreAppLibraryDashboardFromDom, } from './core-app-library-dashboard';
12
+ export type { CoreAppLibraryConnector, CoreAppLibraryConnectorStatus, CoreAppLibraryDashboardData, CoreAppLibraryDashboardDomMountOptions, CoreAppLibraryDashboardError, CoreAppLibraryDashboardMount, CoreAppLibraryDashboardMountOptions, CoreAppLibraryFreshnessBucket, CoreAppLibraryMetric, CoreAppLibraryMetricTone, CoreAppLibraryPipelineSummary, CoreAppLibraryTacticDepth, } from './core-app-library-dashboard';
11
13
  export { PageHeader, createPageHeader } from './page-header';
12
14
  export type { PageHeaderConfig, PageHeaderMetadata } from './page-header';
13
15
  export interface SidebarConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"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"}