@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
|
@@ -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-
|
|
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 === "" ? "
|
|
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 = "
|
|
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 = "
|
|
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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"}
|
package/dist/layout/index.d.ts
CHANGED
|
@@ -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":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,QAAQ,EACR,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,EAC1B,iBAAiB,EACjB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,4BAA4B,EAC5B,mCAAmC,GACpC,MAAM,8BAA8B,CAAA;AACrC,YAAY,EACV,uBAAuB,EACvB,6BAA6B,EAC7B,2BAA2B,EAC3B,sCAAsC,EACtC,4BAA4B,EAC5B,4BAA4B,EAC5B,mCAAmC,EACnC,6BAA6B,EAC7B,oBAAoB,EACpB,wBAAwB,EACxB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAMzE,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,WAAW,CAAA;IAClB,QAAQ,EAAE,WAAW,CAAA;IACrB,OAAO,EAAE,WAAW,CAAA;IACpB,YAAY,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAA;IACnD,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAA;IACjD,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8EAA8E;IAC9E,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AAqCD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,aAAkB,GAAG,MAAM,IAAI,CAmGnE;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,cAAmB,GAAG,MAAM,IAAI,CAyFrE;AAwBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,iBAAsB,GAAG,MAAM,IAAI,CAsF5E;AAsBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,GAAE,gBAAqB,GAAG,MAAM,IAAI,CAiL1E;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,IAAI,CAqC7C;AAMD;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,GAAE;IACN,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAA;CACrB,GACL,MAAM,IAAI,CAcZ"}
|