@mk-kit/ui 0.52.1 → 0.53.0
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/fesm2022/mk-kit-ui-data.mjs +5 -417
- package/fesm2022/mk-kit-ui-data.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-feedback.mjs +1 -1
- package/fesm2022/mk-kit-ui-feedback.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-kanban.mjs +133 -0
- package/fesm2022/mk-kit-ui-kanban.mjs.map +1 -0
- package/fesm2022/mk-kit-ui-status.mjs +318 -0
- package/fesm2022/mk-kit-ui-status.mjs.map +1 -0
- package/fesm2022/mk-kit-ui-table.mjs +49 -1
- package/fesm2022/mk-kit-ui-table.mjs.map +1 -1
- package/fesm2022/mk-kit-ui.mjs +2 -0
- package/fesm2022/mk-kit-ui.mjs.map +1 -1
- package/package.json +9 -1
- package/types/mk-kit-ui-data.d.ts +3 -247
- package/types/mk-kit-ui-kanban.d.ts +98 -0
- package/types/mk-kit-ui-status.d.ts +158 -0
- package/types/mk-kit-ui-table.d.ts +26 -2
- package/types/mk-kit-ui.d.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mk-kit-ui-data.mjs","sources":["../../../projects/mk-kit/data/card/card.ts","../../../projects/mk-kit/data/card/card.html","../../../projects/mk-kit/data/card/card-parts.ts","../../../projects/mk-kit/data/divider/divider.ts","../../../projects/mk-kit/data/divider/divider.html","../../../projects/mk-kit/data/badge/badge.ts","../../../projects/mk-kit/data/badge/badge.html","../../../projects/mk-kit/data/badge/badge-overlay.ts","../../../projects/mk-kit/data/tag/tag.ts","../../../projects/mk-kit/data/tag/tag.html","../../../projects/mk-kit/data/avatar/avatar.ts","../../../projects/mk-kit/data/avatar/avatar.html","../../../projects/mk-kit/data/avatar/avatar-group.ts","../../../projects/mk-kit/data/avatar/avatar-group.html","../../../projects/mk-kit/data/list/list.ts","../../../projects/mk-kit/data/list/list.html","../../../projects/mk-kit/data/list/list-item.ts","../../../projects/mk-kit/data/list/list-item.html","../../../projects/mk-kit/data/empty-state/empty-state.ts","../../../projects/mk-kit/data/empty-state/empty-state.html","../../../projects/mk-kit/data/timeline/timeline.ts","../../../projects/mk-kit/data/timeline/timeline-item.ts","../../../projects/mk-kit/data/timeline/timeline-item.html","../../../projects/mk-kit/data/org-chart/org-chart.ts","../../../projects/mk-kit/data/org-chart/org-chart.html","../../../projects/mk-kit/data/stat-card/stat-card.ts","../../../projects/mk-kit/data/stat-card/stat-card.html","../../../projects/mk-kit/data/profile-card/profile-card.ts","../../../projects/mk-kit/data/profile-card/profile-card.html","../../../projects/mk-kit/data/progress-bar/progress-bar.ts","../../../projects/mk-kit/data/progress-bar/progress-bar.html","../../../projects/mk-kit/data/progress-ring/progress-ring.ts","../../../projects/mk-kit/data/progress-ring/progress-ring.html","../../../projects/mk-kit/data/spinner/spinner.ts","../../../projects/mk-kit/data/spinner/spinner.html","../../../projects/mk-kit/data/charts/chart-utils.ts","../../../projects/mk-kit/data/charts/sparkline.ts","../../../projects/mk-kit/data/charts/sparkline.html","../../../projects/mk-kit/data/charts/chart-autowidth.ts","../../../projects/mk-kit/data/charts/chart-tap-pin.ts","../../../projects/mk-kit/data/charts/bar-chart.ts","../../../projects/mk-kit/data/charts/bar-chart.html","../../../projects/mk-kit/data/charts/line-chart.ts","../../../projects/mk-kit/data/charts/line-chart.html","../../../projects/mk-kit/data/charts/donut-chart.ts","../../../projects/mk-kit/data/charts/donut-chart.html","../../../projects/mk-kit/data/charts/gauge.ts","../../../projects/mk-kit/data/charts/gauge.html","../../../projects/mk-kit/data/charts/scatter-chart.ts","../../../projects/mk-kit/data/charts/scatter-chart.html","../../../projects/mk-kit/data/charts/heatmap.ts","../../../projects/mk-kit/data/charts/heatmap.html","../../../projects/mk-kit/data/charts/calendar-heatmap.ts","../../../projects/mk-kit/data/charts/calendar-heatmap.html","../../../projects/mk-kit/data/charts/radar-chart.ts","../../../projects/mk-kit/data/charts/radar-chart.html","../../../projects/mk-kit/data/charts/funnel-chart.ts","../../../projects/mk-kit/data/charts/funnel-chart.html","../../../projects/mk-kit/data/charts/treemap.ts","../../../projects/mk-kit/data/charts/treemap.html","../../../projects/mk-kit/data/skeleton/skeleton.ts","../../../projects/mk-kit/data/skeleton/skeleton.html","../../../projects/mk-kit/data/skeleton/skeleton-preset.ts","../../../projects/mk-kit/data/skeleton/skeleton-preset.html","../../../projects/mk-kit/data/inline-edit/inline-edit.ts","../../../projects/mk-kit/data/inline-edit/inline-edit.html","../../../projects/mk-kit/data/countdown/countdown.ts","../../../projects/mk-kit/data/countdown/countdown.html","../../../projects/mk-kit/data/description-list/description-list.ts","../../../projects/mk-kit/data/code/code.ts","../../../projects/mk-kit/data/code/code.html","../../../projects/mk-kit/data/virtual-scroll/virtual-scroll.ts","../../../projects/mk-kit/data/virtual-scroll/virtual-scroll.html","../../../projects/mk-kit/data/carousel/carousel.ts","../../../projects/mk-kit/data/carousel/carousel.html","../../../projects/mk-kit/data/diff/diff-util.ts","../../../projects/mk-kit/data/diff/diff.ts","../../../projects/mk-kit/data/diff/diff.html","../../../projects/mk-kit/data/kanban/kanban.ts","../../../projects/mk-kit/data/kanban/kanban.html","../../../projects/mk-kit/data/qr-code/qr-encode.ts","../../../projects/mk-kit/data/qr-code/qr-code.ts","../../../projects/mk-kit/data/qr-code/qr-code.html","../../../projects/mk-kit/data/json-viewer/json-viewer.ts","../../../projects/mk-kit/data/json-viewer/json-viewer.html","../../../projects/mk-kit/data/log-viewer/ansi.ts","../../../projects/mk-kit/data/log-viewer/log-viewer.ts","../../../projects/mk-kit/data/log-viewer/log-viewer.html","../../../projects/mk-kit/data/markdown/markdown-parse.ts","../../../projects/mk-kit/data/markdown/markdown.ts","../../../projects/mk-kit/data/markdown/markdown.html","../../../projects/mk-kit/data/index.ts","../../../projects/mk-kit/data/mk-kit-ui-data.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Surface treatment for a {@link MkCard}. */\nexport type MkCardVariant = 'elevated' | 'outlined' | 'filled';\n/** Internal padding scale for a {@link MkCard}. */\nexport type MkCardPadding = 'none' | 'sm' | 'md' | 'lg';\n\n/**\n * Card — a themed surface container that groups related content. Compose it\n * with the projected `mk-card-header`, `mk-card-title` and `mk-card-footer`\n * parts, or drop plain content straight into the body.\n *\n * ```html\n * <mk-card variant=\"elevated\">\n * <mk-card-header>\n * <mk-card-title>Monthly revenue</mk-card-title>\n * </mk-card-header>\n * Body content goes here.\n * <mk-card-footer>\n * <button mkButton variant=\"ghost\">Details</button>\n * </mk-card-footer>\n * </mk-card>\n * ```\n */\n@Component({\n selector: 'mk-card',\n templateUrl: './card.html',\n styleUrl: './card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-card',\n '[class.mk-card--elevated]': \"variant() === 'elevated'\",\n '[class.mk-card--outlined]': \"variant() === 'outlined'\",\n '[class.mk-card--filled]': \"variant() === 'filled'\",\n '[attr.data-padding]': 'padding()',\n },\n})\nexport class MkCard {\n /** Surface treatment: raised shadow, hairline border, or tinted fill. */\n readonly variant = input<MkCardVariant>('elevated');\n /** Internal spacing applied to the body, header and footer. */\n readonly padding = input<MkCardPadding>('md');\n}\n","<ng-content select=\"mk-card-header, [mkCardHeader]\" />\n<div class=\"mk-card__body\">\n <ng-content />\n</div>\n<ng-content select=\"mk-card-footer, [mkCardFooter]\" />\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * Card header region — a padded band separated from the body by a hairline\n * border. Typically wraps a {@link MkCardTitle} and optional actions.\n */\n@Component({\n selector: 'mk-card-header, [mkCardHeader]',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-card-header' },\n styles: [\n `:host {\n display: flex;\n align-items: center;\n gap: var(--mk-space-3);\n padding: var(--mk-card-pad, var(--mk-space-5));\n border-bottom: var(--mk-border-width) solid var(--mk-border);\n }`,\n ],\n})\nexport class MkCardHeader {}\n\n/**\n * Card title — semantic heading text for a card header. Renders as bold,\n * emphasised text; wrap the projected content in your own heading element if a\n * specific heading level is required for the document outline.\n */\n@Component({\n selector: 'mk-card-title',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-card-title' },\n styles: [\n `:host {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n font-size: var(--mk-font-size-lg);\n font-weight: var(--mk-font-weight-semibold);\n line-height: var(--mk-line-height-snug);\n color: var(--mk-text);\n }`,\n ],\n})\nexport class MkCardTitle {}\n\n/**\n * Card footer region — a padded band separated from the body by a hairline\n * border, usually holding actions aligned to the end.\n */\n@Component({\n selector: 'mk-card-footer, [mkCardFooter]',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-card-footer' },\n styles: [\n `:host {\n display: flex;\n align-items: center;\n gap: var(--mk-space-3);\n padding: var(--mk-card-pad, var(--mk-space-5));\n border-top: var(--mk-border-width) solid var(--mk-border);\n }`,\n ],\n})\nexport class MkCardFooter {}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Axis a {@link MkDivider} is drawn along. */\nexport type MkDividerOrientation = 'horizontal' | 'vertical';\n\n/**\n * Divider — a themed separator rule. Renders horizontally by default; set\n * `orientation=\"vertical\"` for an inline vertical rule. Project content to\n * label a horizontal divider (the label sits centred between two rules).\n *\n * ```html\n * <mk-divider />\n * <mk-divider>OR</mk-divider>\n * <mk-divider orientation=\"vertical\" />\n * ```\n */\n@Component({\n selector: 'mk-divider',\n templateUrl: './divider.html',\n styleUrl: './divider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-divider',\n role: 'separator',\n '[class.mk-divider--vertical]': \"orientation() === 'vertical'\",\n '[attr.aria-orientation]': 'orientation()',\n },\n})\nexport class MkDivider {\n /** Axis the rule is drawn along. */\n readonly orientation = input<MkDividerOrientation>('horizontal');\n}\n","<span class=\"mk-divider__label\"><ng-content /></span>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n} from '@angular/core';\nimport type { MkSize, MkTone } from '@mk-kit/ui/core';\n\n/** Visual treatment for a {@link MkBadge}. */\nexport type MkBadgeVariant = 'solid' | 'soft' | 'outline';\n\n/**\n * Badge — a compact status pill, typically for counts or short state labels.\n * Set `dot` for a minimal notification indicator with no text.\n *\n * ```html\n * <mk-badge tone=\"success\">Active</mk-badge>\n * <mk-badge tone=\"danger\" variant=\"solid\">3</mk-badge>\n * <mk-badge tone=\"danger\" dot aria-label=\"Unread messages\" />\n * ```\n */\n@Component({\n selector: 'mk-badge',\n templateUrl: './badge.html',\n styleUrl: './badge.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-badge',\n '[class.mk-badge--sm]': \"size() === 'sm'\",\n '[class.mk-badge--md]': \"size() === 'md'\",\n '[class.mk-badge--lg]': \"size() === 'lg'\",\n '[class.mk-badge--solid]': \"variant() === 'solid'\",\n '[class.mk-badge--soft]': \"variant() === 'soft'\",\n '[class.mk-badge--outline]': \"variant() === 'outline'\",\n '[class.mk-badge--dot]': 'dot()',\n '[attr.data-tone]': 'tone()',\n },\n})\nexport class MkBadge {\n /** Semantic color tone. */\n readonly tone = input<MkTone>('primary');\n /** Visual treatment. */\n readonly variant = input<MkBadgeVariant>('soft');\n /** Size scale. */\n readonly size = input<MkSize>('md');\n /** Render as a tiny dot (no text) for notification indicators. */\n readonly dot = input(false, { transform: booleanAttribute });\n}\n","@if (!dot()) {\n <ng-content />\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n Renderer2,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { mkUniqueId, type MkTone } from '@mk-kit/ui/core';\n\n/** Corner of the host an {@link MkBadgeOverlay} is anchored to. */\nexport type MkBadgeOverlayPosition =\n | 'top-end'\n | 'top-start'\n | 'bottom-end'\n | 'bottom-start';\n\n/**\n * Badge overlay — anchors a small badge (count, dot or short text) to a corner\n * of ANY element: an icon button, an avatar, a tab label. The host stays a\n * single tab stop; the badge is a decorative, non-focusable child.\n *\n * - Numbers above `mkBadgeOverlayMax` (default 99) collapse to `99+`.\n * - `mkBadgeOverlayDot` renders a textless dot (\"something is new\").\n * - `mkBadgeOverlayAriaLabel` is the screen-reader text (\"3 unread\"). It is\n * rendered in a visually hidden span and wired to the host with\n * `aria-describedby`, so it is announced after the host's own name even\n * when the host has an `aria-label`. When it is given, the visible badge is\n * `aria-hidden` so the count is not read twice.\n * - Positions use logical insets, so `top-end` sits at the top-right in LTR\n * and the top-left in RTL.\n *\n * The badge is painted with the global `.mk-badge-overlay` styles from\n * `@mk-kit/ui/styles.css` and follows the `--mk-*` tone tokens.\n *\n * ```html\n * <button mkButton iconOnly aria-label=\"Notifications\"\n * [mkBadgeOverlay]=\"unread()\" mkBadgeOverlayTone=\"danger\"\n * [mkBadgeOverlayAriaLabel]=\"unread() + ' unread'\">\n * <mk-icon name=\"bell\" />\n * </button>\n *\n * <mk-avatar name=\"Ada Lovelace\" mkBadgeOverlay mkBadgeOverlayDot\n * mkBadgeOverlayTone=\"success\" mkBadgeOverlayPosition=\"bottom-end\" />\n * ```\n */\n@Directive({\n selector: '[mkBadgeOverlay]',\n})\nexport class MkBadgeOverlay {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /**\n * Badge content — a count or a short label. `null` / empty hides the badge\n * unless `mkBadgeOverlayDot` is set. Numeric strings are treated as numbers\n * so `mkBadgeOverlay=\"120\"` also collapses to `99+`.\n */\n readonly content = input<string | number | null | undefined>(null, {\n alias: 'mkBadgeOverlay',\n });\n /** Corner the badge is anchored to (logical: `end` flips in RTL). */\n readonly position = input<MkBadgeOverlayPosition>('top-end', {\n alias: 'mkBadgeOverlayPosition',\n });\n /** Semantic color tone (same scale as `mk-badge`). */\n readonly tone = input<MkTone>('primary', { alias: 'mkBadgeOverlayTone' });\n /** Render a textless dot instead of the content. */\n readonly dot = input(false, {\n alias: 'mkBadgeOverlayDot',\n transform: booleanAttribute,\n });\n /** Numbers above this render as `<max>+`. `0` disables the cap. */\n readonly max = input(99, {\n alias: 'mkBadgeOverlayMax',\n transform: numberAttribute,\n });\n /** Hide the badge while keeping the directive (and its aria wiring) in place. */\n readonly hidden = input(false, {\n alias: 'mkBadgeOverlayHidden',\n transform: booleanAttribute,\n });\n /**\n * Screen-reader text for the badge, e.g. `\"3 unread\"`. Announced as the\n * host's description; the visible badge becomes `aria-hidden`.\n */\n readonly ariaLabel = input<string>('', { alias: 'mkBadgeOverlayAriaLabel' });\n\n /** The text painted in the badge (`''` in dot mode). */\n readonly label = computed<string>(() => {\n if (this.dot()) return '';\n const raw = this.content();\n if (raw === null || raw === undefined || raw === '') return '';\n const max = this.max();\n const n =\n typeof raw === 'number' ? raw : /^\\d+$/.test(raw) ? Number(raw) : NaN;\n if (Number.isFinite(n) && max > 0 && n > max) return `${max}+`;\n return String(raw);\n });\n\n /** Whether the badge is currently rendered. */\n readonly visible = computed(\n () => !this.hidden() && (this.dot() || this.label() !== ''),\n );\n\n private readonly srId = mkUniqueId('mk-badge-overlay');\n private badge: HTMLElement | null = null;\n private sr: HTMLElement | null = null;\n /** Set when WE made the host positioned, so we can undo it on removal. */\n private positionedHost = false;\n\n constructor() {\n if (!this.isBrowser) return;\n\n effect(() => {\n const visible = this.visible();\n if (!visible) {\n this.detach();\n return;\n }\n const badge = this.attach();\n const dot = this.dot();\n const srText = this.ariaLabel().trim();\n\n this.renderer.setAttribute(badge, 'data-tone', this.tone());\n this.renderer.setAttribute(badge, 'data-position', this.position());\n if (dot) {\n this.renderer.addClass(badge, 'mk-badge-overlay--dot');\n } else {\n this.renderer.removeClass(badge, 'mk-badge-overlay--dot');\n }\n this.renderer.setProperty(badge, 'textContent', this.label());\n // A dot has nothing to read; a labelled badge is described via the\n // hidden span instead — either way the visual is hidden from AT.\n if (dot || srText) {\n this.renderer.setAttribute(badge, 'aria-hidden', 'true');\n } else {\n this.renderer.removeAttribute(badge, 'aria-hidden');\n }\n this.syncSr(srText);\n });\n }\n\n private attach(): HTMLElement {\n if (this.badge) return this.badge;\n const el = this.host.nativeElement;\n const view = this.document.defaultView;\n const position = view?.getComputedStyle(el).position;\n if (!position || position === 'static') {\n this.renderer.setStyle(el, 'position', 'relative');\n this.positionedHost = true;\n }\n const badge: HTMLElement = this.renderer.createElement('span');\n this.renderer.addClass(badge, 'mk-badge-overlay');\n this.renderer.appendChild(el, badge);\n this.badge = badge;\n return badge;\n }\n\n private detach(): void {\n if (this.badge) {\n this.renderer.removeChild(this.host.nativeElement, this.badge);\n this.badge = null;\n }\n this.syncSr('');\n if (this.positionedHost) {\n this.renderer.removeStyle(this.host.nativeElement, 'position');\n this.positionedHost = false;\n }\n }\n\n /** Create / update / remove the hidden description and its aria-describedby link. */\n private syncSr(text: string): void {\n const el = this.host.nativeElement;\n if (text) {\n if (!this.sr) {\n const sr: HTMLElement = this.renderer.createElement('span');\n this.renderer.addClass(sr, 'mk-visually-hidden');\n this.renderer.setAttribute(sr, 'id', this.srId);\n this.renderer.appendChild(el, sr);\n this.sr = sr;\n const ids = (el.getAttribute('aria-describedby') ?? '').split(/\\s+/).filter(Boolean);\n if (!ids.includes(this.srId)) ids.push(this.srId);\n this.renderer.setAttribute(el, 'aria-describedby', ids.join(' '));\n }\n this.renderer.setProperty(this.sr, 'textContent', text);\n } else if (this.sr) {\n this.renderer.removeChild(el, this.sr);\n this.sr = null;\n const ids = (el.getAttribute('aria-describedby') ?? '')\n .split(/\\s+/)\n .filter((id) => id && id !== this.srId);\n if (ids.length) {\n this.renderer.setAttribute(el, 'aria-describedby', ids.join(' '));\n } else {\n this.renderer.removeAttribute(el, 'aria-describedby');\n }\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { MkSize, MkTone } from '@mk-kit/ui/core';\n\n/** Visual treatment for a {@link MkTag}. */\nexport type MkTagVariant = 'solid' | 'soft' | 'outline';\n\n/**\n * Tag — a non-interactive label for categories, keywords or metadata. Unlike\n * {@link MkChip} it carries no interaction; use it purely for display.\n *\n * ```html\n * <mk-tag>Design</mk-tag>\n * <mk-tag tone=\"info\" variant=\"outline\">Beta</mk-tag>\n * ```\n */\n@Component({\n selector: 'mk-tag',\n templateUrl: './tag.html',\n styleUrl: './tag.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-tag',\n '[class.mk-tag--sm]': \"size() === 'sm'\",\n '[class.mk-tag--md]': \"size() === 'md'\",\n '[class.mk-tag--lg]': \"size() === 'lg'\",\n '[class.mk-tag--solid]': \"variant() === 'solid'\",\n '[class.mk-tag--soft]': \"variant() === 'soft'\",\n '[class.mk-tag--outline]': \"variant() === 'outline'\",\n '[attr.data-tone]': 'tone()',\n },\n})\nexport class MkTag {\n /** Semantic color tone. */\n readonly tone = input<MkTone>('neutral');\n /** Visual treatment. */\n readonly variant = input<MkTagVariant>('soft');\n /** Size scale. */\n readonly size = input<MkSize>('md');\n}\n","<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n signal,\n} from '@angular/core';\nimport type { MkSize } from '@mk-kit/ui/core';\n\n/** Outline shape of an {@link MkAvatar}. */\nexport type MkAvatarShape = 'circle' | 'rounded';\n/** Presence status shown as a corner dot on an {@link MkAvatar}. */\nexport type MkAvatarStatus = 'online' | 'offline' | 'away' | 'busy';\n\n/**\n * Avatar — a user/entity image that gracefully falls back to initials derived\n * from `name`, or to a projected icon. The whole avatar is exposed as a single\n * labelled image to assistive tech.\n *\n * ```html\n * <mk-avatar name=\"Ada Lovelace\" src=\"/ada.jpg\" status=\"online\" />\n * <mk-avatar name=\"Grace Hopper\" /> <!-- initials fallback -->\n * <mk-avatar><svg>…</svg></mk-avatar> <!-- icon fallback -->\n * ```\n */\n@Component({\n selector: 'mk-avatar',\n templateUrl: './avatar.html',\n styleUrl: './avatar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-avatar',\n role: 'img',\n '[class.mk-avatar--sm]': \"size() === 'sm'\",\n '[class.mk-avatar--md]': \"size() === 'md'\",\n '[class.mk-avatar--lg]': \"size() === 'lg'\",\n '[class.mk-avatar--circle]': \"shape() === 'circle'\",\n '[class.mk-avatar--rounded]': \"shape() === 'rounded'\",\n '[attr.aria-label]': 'label()',\n '[attr.data-status]': 'status() ?? null',\n },\n})\nexport class MkAvatar {\n /** Image URL. When it fails to load the avatar falls back automatically. */\n readonly src = input<string>();\n /** Display name; drives the initials fallback and the default alt text. */\n readonly name = input<string>();\n /** Explicit accessible label. Defaults to `name`, else \"Avatar\". */\n readonly alt = input<string>();\n /** Size scale. */\n readonly size = input<MkSize>('md');\n /** Outline shape. */\n readonly shape = input<MkAvatarShape>('circle');\n /** Presence indicator dot; omit for none. */\n readonly status = input<MkAvatarStatus>();\n\n /** True once the provided image has failed to load. */\n private readonly imgFailed = signal(false);\n\n protected readonly showImage = computed(\n () => !!this.src() && !this.imgFailed(),\n );\n\n /** Up-to-two-letter initials derived from `name`. */\n protected readonly initials = computed(() => {\n const parts = (this.name() ?? '').trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n });\n\n protected readonly label = computed(() => {\n const base = this.alt() || this.name() || 'Avatar';\n return this.status() ? `${base} (${this.status()})` : base;\n });\n\n protected onError(): void {\n this.imgFailed.set(true);\n }\n}\n","@if (showImage()) {\n <img class=\"mk-avatar__img\" [src]=\"src()\" alt=\"\" (error)=\"onError()\" />\n} @else if (initials()) {\n <span class=\"mk-avatar__initials\" aria-hidden=\"true\">{{ initials() }}</span>\n} @else {\n <span class=\"mk-avatar__icon\" aria-hidden=\"true\"><ng-content /></span>\n}\n@if (status()) {\n <span class=\"mk-avatar__status\" aria-hidden=\"true\"></span>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n contentChildren,\n effect,\n input,\n numberAttribute,\n} from '@angular/core';\nimport type { MkSize } from '@mk-kit/ui/core';\nimport { MkAvatar } from './avatar';\n\n/**\n * Avatar group — overlaps a set of {@link MkAvatar} children and, when `max`\n * is set, collapses the overflow into a trailing \"+N\" bubble.\n *\n * ```html\n * <mk-avatar-group [max]=\"3\">\n * <mk-avatar name=\"Ada Lovelace\" />\n * <mk-avatar name=\"Grace Hopper\" />\n * <mk-avatar name=\"Alan Turing\" />\n * <mk-avatar name=\"Katherine Johnson\" />\n * </mk-avatar-group>\n * ```\n */\n@Component({\n selector: 'mk-avatar-group',\n templateUrl: './avatar-group.html',\n styleUrl: './avatar-group.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-avatar-group',\n role: 'group',\n '[class.mk-avatar-group--sm]': \"size() === 'sm'\",\n '[class.mk-avatar-group--md]': \"size() === 'md'\",\n '[class.mk-avatar-group--lg]': \"size() === 'lg'\",\n },\n})\nexport class MkAvatarGroup {\n /** Maximum avatars to show before collapsing the rest into \"+N\". */\n readonly max = input(undefined, { transform: numberAttribute });\n /** Size of the overflow bubble (match your avatars' size). */\n readonly size = input<MkSize>('md');\n\n private readonly items = contentChildren(MkAvatar, { read: ElementRef });\n\n protected readonly overflowCount = computed(() => {\n const total = this.items().length;\n const max = this.max();\n return max != null && total > max ? total - max : 0;\n });\n\n constructor() {\n // Overlap the projected avatars and hide any beyond `max`. Projected\n // content lives in the consumer's view, so style it imperatively.\n effect(() => {\n const items = this.items();\n const max = this.max();\n items.forEach((ref, i) => {\n const el = ref.nativeElement as HTMLElement;\n el.style.marginInlineStart = i === 0 ? '0' : 'calc(var(--_size) * -0.35)';\n el.style.boxShadow =\n '0 0 0 var(--mk-border-width-strong) var(--mk-surface)';\n el.style.zIndex = String(items.length - i);\n el.style.display = max != null && i >= max ? 'none' : '';\n });\n });\n }\n}\n","<ng-content />\n@if (overflowCount() > 0) {\n <span class=\"mk-avatar-group__overflow\" aria-label=\"{{ overflowCount() }} more\">\n +{{ overflowCount() }}\n </span>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/**\n * List — a vertical stack of {@link MkListItem}s with `role=\"list\"` semantics.\n *\n * ```html\n * <mk-list>\n * <mk-list-item>Dashboard</mk-list-item>\n * <mk-list-item interactive (activated)=\"open()\">Settings</mk-list-item>\n * </mk-list>\n * ```\n */\n@Component({\n selector: 'mk-list',\n templateUrl: './list.html',\n styleUrl: './list.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-list',\n role: 'list',\n '[class.mk-list--bordered]': 'bordered()',\n },\n})\nexport class MkList {\n /** Draw hairline separators between items. */\n readonly bordered = input(false, { transform: booleanAttribute });\n}\n","<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n output,\n} from '@angular/core';\n\n/**\n * List item — a row inside {@link MkList}. Project leading/trailing adornments\n * with the `mkListLeading` / `mkListTrailing` attributes. Set `interactive`\n * to make the row focusable and clickable (Enter/Space activate it).\n *\n * ```html\n * <mk-list-item interactive [selected]=\"active()\" (activated)=\"pick()\">\n * <mk-avatar mkListLeading name=\"Ada\" />\n * Ada Lovelace\n * <mk-badge mkListTrailing tone=\"success\">New</mk-badge>\n * </mk-list-item>\n * ```\n */\n@Component({\n selector: 'mk-list-item',\n templateUrl: './list-item.html',\n styleUrl: './list-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-list-item',\n role: 'listitem',\n '[class.mk-list-item--interactive]': 'interactive()',\n '[class.mk-list-item--selected]': 'selected()',\n '[class.mk-list-item--disabled]': 'disabled()',\n '[attr.tabindex]': 'interactive() && !disabled() ? 0 : null',\n // `aria-selected` is not permitted on `listitem`; `aria-current` is the\n // ARIA way to mark the current row of a plain list.\n '[attr.aria-current]': \"interactive() && selected() ? 'true' : null\",\n '[attr.aria-disabled]': \"disabled() ? 'true' : null\",\n '(click)': 'onClick()',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class MkListItem {\n /** Make the row focusable/clickable with hover + keyboard activation. */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** Highlight the row as the current selection. */\n readonly selected = input(false, { transform: booleanAttribute });\n /** Disable interaction and dim the row. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Emitted on click / Enter / Space when `interactive`. */\n readonly activated = output<void>();\n\n protected onClick(): void {\n if (this.disabled() || !this.interactive()) return;\n this.activated.emit();\n }\n\n protected onKeydown(event: Event): void {\n if (this.disabled() || !this.interactive()) return;\n const key = (event as KeyboardEvent).key;\n if (key === 'Enter' || key === ' ') {\n event.preventDefault();\n this.activated.emit();\n }\n }\n}\n","<span class=\"mk-list-item__leading\"><ng-content select=\"[mkListLeading]\" /></span>\n<span class=\"mk-list-item__content\"><ng-content /></span>\n<span class=\"mk-list-item__trailing\"><ng-content select=\"[mkListTrailing]\" /></span>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n} from '@angular/core';\nimport type { MkSize } from '@mk-kit/ui/core';\nimport { MkIcon } from '@mk-kit/ui/icon';\n\n/**\n * EmptyState — a centered placeholder for \"nothing here yet\" situations: empty\n * tables, no search results, a fresh dashboard, a cleared inbox. Provide a\n * `title` (and usually a `description`), an `icon` or projected media, and\n * call-to-action buttons via the actions slot.\n *\n * Slots: `[mkEmptyStateMedia]` (custom illustration, overrides `icon`), default\n * content (extra body), `[mkEmptyStateActions]` (buttons).\n *\n * ```html\n * <mk-empty-state icon=\"search\" title=\"No results\"\n * description=\"Try adjusting your filters.\">\n * <button mkButton mkEmptyStateActions variant=\"outline\">Clear filters</button>\n * </mk-empty-state>\n * ```\n */\n@Component({\n selector: 'mk-empty-state',\n templateUrl: './empty-state.html',\n styleUrl: './empty-state.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkIcon],\n host: {\n class: 'mk-empty-state',\n '[class.mk-empty-state--sm]': \"size() === 'sm'\",\n '[class.mk-empty-state--lg]': \"size() === 'lg'\",\n },\n})\nexport class MkEmptyState {\n /** Name of a registered icon shown above the title (ignored if media is projected). */\n readonly icon = input<string>('');\n /** Main heading, e.g. \"No invoices yet\". */\n readonly title = input<string>('');\n /** Supporting sentence under the title. */\n readonly description = input<string>('');\n /** Overall scale of the block. */\n readonly size = input<MkSize>('md');\n\n protected readonly iconSize = () =>\n this.size() === 'sm' ? 28 : this.size() === 'lg' ? 48 : 36;\n}\n","@if (icon()) {\n <span class=\"mk-empty-state__icon\" aria-hidden=\"true\">\n <mk-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n </span>\n}\n<ng-content select=\"[mkEmptyStateMedia]\" />\n\n@if (title()) {\n <p class=\"mk-empty-state__title\">{{ title() }}</p>\n}\n@if (description()) {\n <p class=\"mk-empty-state__description\">{{ description() }}</p>\n}\n\n<ng-content />\n\n<div class=\"mk-empty-state__actions\">\n <ng-content select=\"[mkEmptyStateActions]\" />\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * Timeline — a vertical sequence of chronological events (activity feeds, order\n * status, audit logs). A container for `<mk-timeline-item>`s that draws the\n * connecting rail; exposed to assistive tech as a list.\n *\n * ```html\n * <mk-timeline>\n * <mk-timeline-item tone=\"success\" time=\"09:30\" heading=\"Order placed\">\n * Payment confirmed.\n * </mk-timeline-item>\n * <mk-timeline-item time=\"10:15\" heading=\"Packed\">In the warehouse.</mk-timeline-item>\n * </mk-timeline>\n * ```\n */\n@Component({\n selector: 'mk-timeline',\n template: '<ng-content />',\n styleUrl: './timeline.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-timeline',\n role: 'list',\n },\n})\nexport class MkTimeline {}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { MkTone } from '@mk-kit/ui/core';\nimport { MkIcon } from '@mk-kit/ui/icon';\n\n/**\n * A single event in an `<mk-timeline>`: a tone-coloured marker (optionally an\n * icon), an optional time/label and heading, and projected body content.\n *\n * ```html\n * <mk-timeline-item tone=\"danger\" icon=\"error\" time=\"2m ago\" heading=\"Build failed\">\n * 3 tests failed on <code>main</code>.\n * </mk-timeline-item>\n * ```\n */\n@Component({\n selector: 'mk-timeline-item',\n templateUrl: './timeline-item.html',\n styleUrl: './timeline-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkIcon],\n host: {\n class: 'mk-timeline-item',\n role: 'listitem',\n '[attr.data-tone]': 'tone()',\n '[class.mk-timeline-item--icon]': 'icon()',\n },\n})\nexport class MkTimelineItem {\n /** Semantic colour of the marker dot. */\n readonly tone = input<MkTone>('primary');\n /** Name of a registered icon rendered inside the marker. */\n readonly icon = input<string>('');\n /** Time or label shown above the heading (e.g. \"09:30\", \"2m ago\"). */\n readonly time = input<string>('');\n /** Event title. */\n readonly heading = input<string>('');\n}\n","<div class=\"mk-timeline-item__marker\">\n <span class=\"mk-timeline-item__dot\">\n @if (icon()) {\n <mk-icon [name]=\"icon()\" [size]=\"14\" />\n }\n </span>\n <span class=\"mk-timeline-item__connector\" aria-hidden=\"true\"></span>\n</div>\n\n<div class=\"mk-timeline-item__content\">\n @if (time()) {\n <span class=\"mk-timeline-item__time\">{{ time() }}</span>\n }\n @if (heading()) {\n <p class=\"mk-timeline-item__heading\">{{ heading() }}</p>\n }\n <div class=\"mk-timeline-item__body\">\n <ng-content />\n </div>\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n Directive,\n ElementRef,\n TemplateRef,\n booleanAttribute,\n computed,\n contentChild,\n inject,\n input,\n linkedSignal,\n model,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkAvatar } from '../avatar/avatar';\n\n/** A node in an {@link MkOrgChart} tree. `children` makes it a parent. */\nexport interface MkOrgChartNode<T = unknown> {\n /** Unique id — drives selection (`[(selected)]`) and expansion (`[(expanded)]`). */\n id: string;\n /** Primary text of the default card (and the initials fallback). */\n label?: string;\n /**\n * Arbitrary payload handed to the node template. The default card reads\n * `data.title` (sub-label) and `data.avatar` (image URL) when present.\n */\n data?: T;\n /** Direct reports; a non-empty array makes the node collapsible. */\n children?: MkOrgChartNode<T>[];\n /** Initial expansion (default `true`). Only consulted when `[(expanded)]` is not bound. */\n expanded?: boolean;\n}\n\n/** One row of a flat list accepted by {@link mkOrgChartFromFlat}. */\nexport interface MkOrgChartFlatNode<T = unknown> {\n id: string;\n label?: string;\n data?: T;\n /** Id of the parent row; `null` / `undefined` / unknown id = root. */\n parentId?: string | null;\n expanded?: boolean;\n}\n\n/**\n * Build the nested `nodes` input from a flat `parentId` list (the shape most\n * HR / directory APIs return). Row order is preserved among siblings; rows\n * whose `parentId` does not match any row become roots.\n *\n * ```ts\n * const nodes = mkOrgChartFromFlat([\n * { id: 'ceo', label: 'Ada' },\n * { id: 'cto', label: 'Grace', parentId: 'ceo' },\n * ]);\n * ```\n */\nexport function mkOrgChartFromFlat<T = unknown>(\n list: readonly MkOrgChartFlatNode<T>[],\n): MkOrgChartNode<T>[] {\n const byId = new Map<string, MkOrgChartNode<T>>();\n for (const row of list) {\n const node: MkOrgChartNode<T> = { id: row.id };\n if (row.label !== undefined) node.label = row.label;\n if (row.data !== undefined) node.data = row.data;\n if (row.expanded !== undefined) node.expanded = row.expanded;\n byId.set(row.id, node);\n }\n const roots: MkOrgChartNode<T>[] = [];\n for (const row of list) {\n const node = byId.get(row.id)!;\n const parent = row.parentId != null ? byId.get(row.parentId) : undefined;\n if (parent && parent !== node) (parent.children ??= []).push(node);\n else roots.push(node);\n }\n return roots;\n}\n\n/**\n * `data` type seen by a node template: `T` when it could be inferred (the\n * template binds `[mkOrgChartNodeDef]=\"nodes\"`), otherwise `any` so an\n * untyped `<ng-template mkOrgChartNodeDef>` can still read `node.data?.title`.\n */\nexport type MkOrgChartTemplateData<T> = keyof T extends never ? any : T;\n\n/** Template context of `ng-template[mkOrgChartNodeDef]`. */\nexport interface MkOrgChartNodeContext<T = unknown> {\n /** The node (also available as `let-node`). */\n $implicit: MkOrgChartNode<MkOrgChartTemplateData<T>>;\n node: MkOrgChartNode<MkOrgChartTemplateData<T>>;\n /** 1-based depth (roots are 1). */\n depth: number;\n /** Whether the node's children are currently shown. */\n expanded: boolean;\n /** Whether the node is the selected one. */\n selected: boolean;\n}\n\n/**\n * Custom node card for `mk-org-chart`:\n *\n * ```html\n * <mk-org-chart [nodes]=\"nodes\">\n * <ng-template mkOrgChartNodeDef let-node let-selected=\"selected\">\n * <strong>{{ node.label }}</strong> — {{ node.data?.title }}\n * </ng-template>\n * </mk-org-chart>\n * ```\n *\n * Bind the same array you pass to `nodes` to get a typed `node.data` in the\n * template: `<ng-template [mkOrgChartNodeDef]=\"nodes\" let-node>`.\n */\n@Directive({ selector: 'ng-template[mkOrgChartNodeDef]' })\nexport class MkOrgChartNodeDef<T = unknown> {\n /**\n * Type-inference hook only (the value is not used at runtime): bind the\n * `nodes` array so `let-node` is typed as `MkOrgChartNode<T>`.\n */\n readonly mkOrgChartNodeDef = input<readonly MkOrgChartNode<T>[] | '' | undefined>(undefined);\n readonly template = inject(TemplateRef<MkOrgChartNodeContext<T>>);\n static ngTemplateContextGuard<T>(\n _dir: MkOrgChartNodeDef<T>,\n ctx: unknown,\n ): ctx is MkOrgChartNodeContext<T> {\n return true;\n }\n}\n\n/** Chart direction: `top` = root at the top, `left` = root at the inline start. */\nexport type MkOrgChartOrientation = 'top' | 'left';\n\n/** Payload of `(nodeToggle)`. */\nexport interface MkOrgChartToggleEvent<T = unknown> {\n node: MkOrgChartNode<T>;\n expanded: boolean;\n}\n\n/** One visible node after flattening (pre-order, i.e. DOM order). */\ninterface MkOrgChartRow {\n node: MkOrgChartNode;\n depth: number;\n parentId: string | null;\n /** Ids of the sibling set this row belongs to (in order). */\n siblings: readonly string[];\n hasChildren: boolean;\n expanded: boolean;\n}\n\n/**\n * Organisation chart — a reporting-line hierarchy drawn with plain nested\n * lists and CSS connectors (no canvas, prints and themes like everything\n * else). Feed it a tree (`nodes`) or convert a flat `parentId` list with\n * {@link mkOrgChartFromFlat}. Nodes render as a default card (avatar /\n * initials, label, `data.title`) or through an `mkOrgChartNodeDef` template.\n *\n * Follows the ARIA tree pattern (`role=\"tree\"` / `treeitem` / `group`, one\n * roving tab stop). Keyboard (top-down; the axes swap for `orientation=\"left\"`\n * and in RTL): Down = first child (expands a collapsed node first), Up =\n * parent, Left/Right = previous/next sibling, Home/End = first/last visible\n * node, Enter/Space = select (or toggle when not selectable), `*` = expand\n * all siblings, `+`/`-` = expand/collapse.\n *\n * ```html\n * <mk-org-chart\n * [nodes]=\"company\"\n * selectable\n * [(selected)]=\"personId\"\n * collapsible\n * (nodeClick)=\"open($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'mk-org-chart',\n templateUrl: './org-chart.html',\n styleUrl: './org-chart.scss',\n exportAs: 'mkOrgChart',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, MkAvatar],\n host: {\n class: 'mk-org-chart',\n '[class.mk-org-chart--top]': \"orientation() === 'top'\",\n '[class.mk-org-chart--left]': \"orientation() === 'left'\",\n '[class.mk-org-chart--selectable]': 'selectable()',\n '[class.mk-org-chart--collapsible]': 'collapsible()',\n },\n})\nexport class MkOrgChart<T = unknown> {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n\n /** The hierarchy to render (roots first). */\n readonly nodes = input<readonly MkOrgChartNode<T>[]>([]);\n /** Root at the top (children below) or at the inline start (children to the side). */\n readonly orientation = input<MkOrgChartOrientation>('top');\n /** Allow choosing a node (adds selection styling + `aria-selected`). */\n readonly selectable = input(false, { transform: booleanAttribute });\n /** Show a toggle on every parent so branches can be hidden. */\n readonly collapsible = input(false, { transform: booleanAttribute });\n /** Scale factor applied to the whole chart (clamped to 0.5–2). */\n readonly zoom = input(1, { transform: numberAttribute });\n /** Accessible name for the tree. */\n readonly ariaLabel = input<string>(this.i18n.orgChartLabel, { alias: 'aria-label' });\n\n /** Two-way selected node id (`null` = nothing selected). */\n readonly selected = model<string | null>(null);\n /**\n * Two-way ids of the expanded parents. Leave unbound to let the chart\n * manage expansion itself (seeded from each node's `expanded` flag).\n */\n readonly expanded = model<readonly string[] | undefined>(undefined);\n\n /** Emits the node whose card was clicked or activated with Enter/Space. */\n readonly nodeClick = output<MkOrgChartNode<T>>();\n /** Emits whenever a node is expanded or collapsed. */\n readonly nodeToggle = output<MkOrgChartToggleEvent<T>>();\n\n protected readonly nodeDef = contentChild(MkOrgChartNodeDef<T>);\n\n protected readonly zoomLevel = computed(() => {\n const z = this.zoom();\n return Number.isFinite(z) ? Math.min(2, Math.max(0.5, z)) : 1;\n });\n\n /**\n * Expanded parent ids. Controlled by `expanded` when bound; otherwise kept\n * locally — a node's `expanded` flag only seeds ids not present in the\n * previous `nodes` value, so re-emitting the array never reverts branches\n * the user has since toggled.\n */\n private readonly expandedIds = linkedSignal<\n { nodes: readonly MkOrgChartNode<T>[]; expanded: readonly string[] | undefined },\n ReadonlySet<string>\n >({\n source: () => ({ nodes: this.nodes(), expanded: this.expanded() }),\n computation: ({ nodes, expanded }, previous) => {\n if (expanded) return new Set(expanded);\n const prev = previous?.value;\n const known = previous ? collectIds(previous.source.nodes) : null;\n const next = new Set<string>();\n walk(nodes, (node) => {\n if (!node.children?.length) return;\n const isKnown = known?.has(node.id) ?? false;\n if (isKnown ? prev!.has(node.id) : node.expanded !== false) next.add(node.id);\n });\n return next;\n },\n });\n\n /** Id of the node holding the roving tab stop. */\n private readonly activeId = signal<string | null>(null);\n\n /** Visible nodes in DOM (pre-order) order. */\n protected readonly rows = computed<MkOrgChartRow[]>(() => {\n const collapsible = this.collapsible();\n const expandedIds = this.expandedIds();\n const out: MkOrgChartRow[] = [];\n const visit = (list: readonly MkOrgChartNode[], depth: number, parentId: string | null) => {\n const siblings = list.map((n) => n.id);\n for (const node of list) {\n const hasChildren = !!node.children?.length;\n const expanded = hasChildren && (!collapsible || expandedIds.has(node.id));\n out.push({ node, depth, parentId, siblings, hasChildren, expanded });\n if (expanded) visit(node.children!, depth + 1, node.id);\n }\n };\n visit(this.nodes(), 1, null);\n return out;\n });\n\n private readonly rowById = computed(() => new Map(this.rows().map((r) => [r.node.id, r])));\n\n /** The single id with `tabindex=\"0\"` (falls back to the first visible node). */\n private readonly tabStopId = computed(() => {\n const active = this.activeId();\n if (active !== null && this.rowById().has(active)) return active;\n return this.rows()[0]?.node.id ?? null;\n });\n\n // ---- template helpers --------------------------------------------------\n\n protected isExpanded(node: MkOrgChartNode<T>): boolean {\n if (!node.children?.length) return false;\n return !this.collapsible() || this.expandedIds().has(node.id);\n }\n\n protected isSelected(node: MkOrgChartNode<T>): boolean {\n return this.selectable() && this.selected() === node.id;\n }\n\n protected tabIndexFor(node: MkOrgChartNode<T>): number {\n return this.tabStopId() === node.id ? 0 : -1;\n }\n\n protected toggleLabel(node: MkOrgChartNode<T>): string {\n const tpl = this.isExpanded(node) ? this.i18n.orgChartCollapse : this.i18n.orgChartExpand;\n return tpl.replace('{label}', node.label ?? node.id);\n }\n\n protected context(\n node: MkOrgChartNode<T>,\n depth: number,\n ): MkOrgChartNodeContext<T> {\n return {\n $implicit: node,\n node,\n depth,\n expanded: this.isExpanded(node),\n selected: this.isSelected(node),\n };\n }\n\n /** `data.title` / `data.avatar` of the default card, read defensively. */\n protected field(node: MkOrgChartNode<T>, key: 'title' | 'avatar'): string | undefined {\n const data = node.data as Record<string, unknown> | undefined;\n const value = data?.[key];\n return typeof value === 'string' && value ? value : undefined;\n }\n\n // ---- state changes -----------------------------------------------------\n\n /** Expand or collapse a parent (no-op for leaves / non-collapsible charts). */\n toggle(node: MkOrgChartNode<T>): void {\n this.setExpanded(node, !this.isExpanded(node));\n }\n\n /** Expand or collapse a parent explicitly. */\n setExpanded(node: MkOrgChartNode<T>, expanded: boolean): void {\n if (!this.collapsible() || !node.children?.length) return;\n if (this.expandedIds().has(node.id) === expanded) return;\n const next = new Set(this.expandedIds());\n if (expanded) next.add(node.id);\n else next.delete(node.id);\n this.expandedIds.set(next);\n this.expanded.set([...next]);\n this.nodeToggle.emit({ node, expanded });\n }\n\n /** Select a node by reference (no-op unless `selectable`). */\n select(node: MkOrgChartNode<T>): void {\n if (!this.selectable()) return;\n this.selected.set(node.id);\n }\n\n private activate(node: MkOrgChartNode<T>): void {\n this.activeId.set(node.id);\n if (this.selectable()) this.select(node);\n this.nodeClick.emit(node);\n }\n\n protected onCardClick(event: Event, node: MkOrgChartNode<T>): void {\n event.stopPropagation();\n this.activate(node);\n }\n\n protected onToggleClick(event: Event, node: MkOrgChartNode<T>): void {\n event.stopPropagation();\n this.activeId.set(node.id);\n this.toggle(node);\n this.focusItem(node.id);\n }\n\n /** Keeps the roving tab stop on whichever item last received focus. */\n protected onFocusIn(event: Event): void {\n const id = this.itemIdOf(event.target);\n if (id !== null) this.activeId.set(id);\n }\n\n protected onKeydown(event: Event): void {\n if (!(event instanceof KeyboardEvent)) return;\n const id = this.itemIdOf(event.target);\n if (id === null) return;\n const row = this.rowById().get(id);\n if (!row) return;\n const node = row.node as MkOrgChartNode<T>;\n\n const intent = this.intentOf(event.key);\n switch (intent) {\n case 'into':\n event.preventDefault();\n if (row.hasChildren && !row.expanded) {\n this.setExpanded(node, true);\n } else if (row.expanded) {\n this.focusItem(node.children![0].id);\n }\n return;\n case 'parent':\n event.preventDefault();\n if (row.parentId !== null) this.focusItem(row.parentId);\n return;\n case 'next':\n case 'prev': {\n event.preventDefault();\n const i = row.siblings.indexOf(id);\n const target = row.siblings[intent === 'next' ? i + 1 : i - 1];\n if (target !== undefined) this.focusItem(target);\n return;\n }\n }\n\n switch (event.key) {\n case 'Home':\n event.preventDefault();\n this.focusItem(this.rows()[0]?.node.id ?? null);\n break;\n case 'End': {\n event.preventDefault();\n const rows = this.rows();\n this.focusItem(rows[rows.length - 1]?.node.id ?? null);\n break;\n }\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (!this.selectable() && row.hasChildren && this.collapsible()) {\n this.toggle(node);\n }\n this.activate(node);\n break;\n case '*': {\n event.preventDefault();\n const nodes = this.siblingsOf(row);\n for (const sibling of nodes) this.setExpanded(sibling, true);\n break;\n }\n case '+':\n case '=':\n event.preventDefault();\n this.setExpanded(node, true);\n break;\n case '-':\n event.preventDefault();\n this.setExpanded(node, false);\n break;\n }\n }\n\n /**\n * Map an arrow key to a tree direction. Top-down: Down = into, Up = parent,\n * Left/Right = siblings (mirrored in RTL). Left-to-right: Right = into,\n * Left = parent (mirrored in RTL), Up/Down = siblings.\n */\n private intentOf(key: string): 'into' | 'parent' | 'next' | 'prev' | null {\n const rtl = this.isRtl();\n if (this.orientation() === 'left') {\n switch (key) {\n case 'ArrowRight':\n return rtl ? 'parent' : 'into';\n case 'ArrowLeft':\n return rtl ? 'into' : 'parent';\n case 'ArrowDown':\n return 'next';\n case 'ArrowUp':\n return 'prev';\n }\n return null;\n }\n switch (key) {\n case 'ArrowDown':\n return 'into';\n case 'ArrowUp':\n return 'parent';\n case 'ArrowRight':\n return rtl ? 'prev' : 'next';\n case 'ArrowLeft':\n return rtl ? 'next' : 'prev';\n }\n return null;\n }\n\n private siblingsOf(row: MkOrgChartRow): MkOrgChartNode<T>[] {\n const list =\n row.parentId === null\n ? this.nodes()\n : ((this.rowById().get(row.parentId)?.node.children ?? []) as MkOrgChartNode<T>[]);\n return list.filter((n) => !!n.children?.length);\n }\n\n\n private isRtl(): boolean {\n const el = this.host.nativeElement;\n const dir = el.closest('[dir]')?.getAttribute('dir');\n if (dir) return dir.toLowerCase() === 'rtl';\n const view = this.document.defaultView;\n return (view?.getComputedStyle(el).direction ?? 'ltr') === 'rtl';\n }\n\n private itemIdOf(target: EventTarget | null): string | null {\n if (!(target instanceof Element)) return null;\n const item = target.closest<HTMLElement>('.mk-org-chart__item');\n if (!item || !this.host.nativeElement.contains(item)) return null;\n return item.dataset['mkId'] ?? null;\n }\n\n private focusItem(id: string | null): void {\n if (id === null) return;\n this.activeId.set(id);\n const items = this.host.nativeElement.querySelectorAll<HTMLElement>('.mk-org-chart__item');\n for (const item of Array.from(items)) {\n if (item.dataset['mkId'] === id) {\n item.focus();\n return;\n }\n }\n }\n}\n\nfunction walk<T>(list: readonly MkOrgChartNode<T>[], fn: (node: MkOrgChartNode<T>) => void): void {\n for (const node of list) {\n fn(node);\n if (node.children?.length) walk(node.children, fn);\n }\n}\n\nfunction collectIds<T>(list: readonly MkOrgChartNode<T>[]): Set<string> {\n const ids = new Set<string>();\n walk(list, (n) => ids.add(n.id));\n return ids;\n}\n","<div class=\"mk-org-chart__scroller\">\n <div class=\"mk-org-chart__canvas\" [style.zoom]=\"zoomLevel()\">\n <ul\n class=\"mk-org-chart__level mk-org-chart__level--root\"\n role=\"tree\"\n [attr.aria-label]=\"ariaLabel() || null\"\n (keydown)=\"onKeydown($event)\"\n (focusin)=\"onFocusIn($event)\"\n >\n @for (node of nodes(); track node.id) {\n <ng-container\n *ngTemplateOutlet=\"itemTpl; context: { node: node, depth: 1 }\"\n />\n }\n </ul>\n </div>\n</div>\n\n<ng-template #itemTpl let-node=\"node\" let-depth=\"depth\">\n <li\n class=\"mk-org-chart__item\"\n role=\"treeitem\"\n [attr.data-mk-id]=\"node.id\"\n [class.mk-org-chart__item--expanded]=\"isExpanded(node)\"\n [class.mk-org-chart__item--collapsed]=\"node.children?.length && !isExpanded(node)\"\n [attr.aria-level]=\"depth\"\n [attr.aria-expanded]=\"node.children?.length ? isExpanded(node) : null\"\n [attr.aria-selected]=\"selectable() ? isSelected(node) : null\"\n [attr.tabindex]=\"tabIndexFor(node)\"\n >\n <div\n class=\"mk-org-chart__node\"\n [class.mk-org-chart__node--selected]=\"isSelected(node)\"\n [class.mk-org-chart__node--custom]=\"!!nodeDef()\"\n (click)=\"onCardClick($event, node)\"\n >\n @if (nodeDef(); as def) {\n <ng-container\n *ngTemplateOutlet=\"def.template; context: context(node, depth)\"\n />\n } @else {\n <mk-avatar\n class=\"mk-org-chart__avatar\"\n size=\"sm\"\n [name]=\"node.label ?? node.id\"\n [src]=\"field(node, 'avatar')\"\n alt=\"\"\n aria-hidden=\"true\"\n />\n <span class=\"mk-org-chart__text\">\n <span class=\"mk-org-chart__label\">{{ node.label ?? node.id }}</span>\n @if (field(node, 'title'); as title) {\n <span class=\"mk-org-chart__title\">{{ title }}</span>\n }\n </span>\n }\n @if (collapsible() && node.children?.length) {\n <button\n type=\"button\"\n class=\"mk-org-chart__toggle\"\n tabindex=\"-1\"\n [attr.aria-label]=\"toggleLabel(node)\"\n [attr.aria-expanded]=\"isExpanded(node)\"\n (click)=\"onToggleClick($event, node)\"\n >\n <span class=\"mk-org-chart__caret\" aria-hidden=\"true\"></span>\n </button>\n }\n </div>\n @if (isExpanded(node)) {\n <ul class=\"mk-org-chart__level mk-org-chart__level--nested\" role=\"group\">\n @for (child of node.children; track child.id) {\n <ng-container\n *ngTemplateOutlet=\"itemTpl; context: { node: child, depth: depth + 1 }\"\n />\n }\n </ul>\n }\n </li>\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\n\n/** Direction of a {@link MkStatCard} delta. */\nexport type MkStatTrend = 'up' | 'down' | 'neutral';\n\n/**\n * Stat card — a compact KPI tile for dashboards. Shows a label, a primary\n * value and an optional trend delta. The trend is conveyed by an arrow glyph\n * and a screen-reader phrase in addition to colour, so it never relies on\n * colour alone.\n *\n * ```html\n * <mk-stat-card\n * label=\"Revenue\"\n * value=\"$48.2k\"\n * [delta]=\"'+12%'\"\n * deltaTrend=\"up\"\n * hint=\"vs. last month\">\n * <svg mkStatIcon>…</svg>\n * </mk-stat-card>\n * ```\n */\n@Component({\n selector: 'mk-stat-card',\n templateUrl: './stat-card.html',\n styleUrl: './stat-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-stat-card',\n role: 'group',\n '[attr.aria-labelledby]': 'labelId',\n },\n})\nexport class MkStatCard {\n /** Metric name shown above the value. */\n readonly label = input<string>('');\n /** The primary metric value. */\n readonly value = input<string | number>('');\n /** Change indicator (e.g. `'+12%'` or `-4`). Omit to hide the delta row. */\n readonly delta = input<string | number>();\n /** Trend direction; colourises the delta and picks the arrow glyph. */\n readonly deltaTrend = input<MkStatTrend>('neutral');\n /** Small supporting note under the delta (e.g. \"vs. last month\"). */\n readonly hint = input<string>();\n\n protected readonly labelId = mkUniqueId('mk-stat-label');\n\n protected readonly hasDelta = computed(() => {\n const d = this.delta();\n return d !== undefined && d !== null && `${d}`.length > 0;\n });\n\n /** Arrow glyph for the current trend. */\n protected readonly arrow = computed(() => {\n switch (this.deltaTrend()) {\n case 'up':\n return '↑'; // ↑\n case 'down':\n return '↓'; // ↓\n default:\n return '→'; // →\n }\n });\n\n /** Screen-reader phrase describing the trend. */\n protected readonly trendLabel = computed(() => {\n switch (this.deltaTrend()) {\n case 'up':\n return 'Trending up';\n case 'down':\n return 'Trending down';\n default:\n return 'No change';\n }\n });\n}\n","<div class=\"mk-stat-card__header\">\n <span class=\"mk-stat-card__label\" [id]=\"labelId\">{{ label() }}</span>\n <span class=\"mk-stat-card__icon\" aria-hidden=\"true\">\n <ng-content select=\"[mkStatIcon]\" />\n </span>\n</div>\n\n<div class=\"mk-stat-card__value\">{{ value() }}</div>\n\n@if (hasDelta()) {\n <div class=\"mk-stat-card__delta\" [attr.data-trend]=\"deltaTrend()\">\n <span class=\"mk-stat-card__arrow\" aria-hidden=\"true\">{{ arrow() }}</span>\n <span class=\"mk-stat-card__delta-value\">{{ delta() }}</span>\n <span class=\"mk-stat-card__sr\">{{ trendLabel() }}</span>\n </div>\n}\n\n@if (hint()) {\n <div class=\"mk-stat-card__hint\">{{ hint() }}</div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport type { MkSize } from '@mk-kit/ui/core';\nimport { MkAvatar } from '../avatar/avatar';\n\n/** Layout direction of a {@link MkProfileCard}. */\nexport type MkProfileCardOrientation = 'vertical' | 'horizontal';\n\n/**\n * Profile meta row — a stats strip projected into a {@link MkProfileCard}\n * between the body and the actions. Direct children are laid out as\n * evenly-spaced, centre-aligned cells with subtle separators between them.\n *\n * ```html\n * <div mkProfileMeta>\n * <div><strong>128</strong> posts</div>\n * <div><strong>2.4k</strong> followers</div>\n * </div>\n * ```\n */\n@Component({\n selector: '[mkProfileMeta]',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-profile-meta' },\n styles: [\n `:host {\n display: flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n }\n :host(:empty) {\n display: none;\n }\n :host ::ng-deep > * {\n flex: 1 1 0;\n min-width: 0;\n padding-inline: var(--mk-space-2);\n text-align: center;\n font-size: var(--mk-font-size-sm);\n color: var(--mk-text-muted);\n }\n :host ::ng-deep > * + * {\n border-inline-start: var(--mk-border-width) solid var(--mk-border-subtle);\n }`,\n ],\n})\nexport class MkProfileMeta {}\n\n/**\n * Profile actions row — buttons projected into the footer area of a\n * {@link MkProfileCard}. Centred in vertical orientation; pinned to the end\n * in horizontal orientation.\n *\n * ```html\n * <div mkProfileActions>\n * <button mkButton>Follow</button>\n * <button mkButton variant=\"outline\">Message</button>\n * </div>\n * ```\n */\n@Component({\n selector: '[mkProfileActions]',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-profile-actions' },\n styles: [\n `:host {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: var(--mk-space-2);\n }\n :host(:empty) {\n display: none;\n }`,\n ],\n})\nexport class MkProfileActions {}\n\n/**\n * Profile card — a person/entity summary on a bordered surface: an optional\n * cover banner, an {@link MkAvatar} (with automatic initials fallback derived\n * from `name`), the display name, a muted subtitle, free-form body content and\n * two optional slots for a meta/stats row and an actions row.\n *\n * Orientations:\n * - `vertical` (default) — centred column; when `coverSrc` is set a 3:1 banner\n * spans the card top and the avatar overlaps its bottom edge with a\n * surface-coloured ring.\n * - `horizontal` — avatar on the left, text in the middle, actions pinned to\n * the end. The cover banner is intentionally NOT rendered in this\n * orientation (a side-by-side row has no top edge for it to crown).\n *\n * The name renders as emphasised generic text (like `mk-card-title`, no\n * hard-coded heading level) so the card never disrupts the document outline.\n *\n * ```html\n * <mk-profile-card\n * name=\"Ada Lovelace\"\n * subtitle=\"Analytical Engine Programmer\"\n * avatarSrc=\"/ada.jpg\"\n * coverSrc=\"/cover.jpg\">\n * First programmer. Wrote notes G through... well, all of them.\n * <div mkProfileMeta>\n * <div><strong>128</strong> posts</div>\n * <div><strong>2.4k</strong> followers</div>\n * <div><strong>310</strong> following</div>\n * </div>\n * <div mkProfileActions>\n * <button mkButton>Follow</button>\n * <button mkButton variant=\"outline\">Message</button>\n * </div>\n * </mk-profile-card>\n * ```\n */\n@Component({\n selector: 'mk-profile-card',\n exportAs: 'mkProfileCard',\n templateUrl: './profile-card.html',\n styleUrl: './profile-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkAvatar],\n host: {\n class: 'mk-profile-card',\n role: 'group',\n '[class.mk-profile-card--vertical]': \"orientation() === 'vertical'\",\n '[class.mk-profile-card--horizontal]': \"orientation() === 'horizontal'\",\n '[class.mk-profile-card--has-cover]': 'showCover()',\n '[attr.data-avatar-size]': 'avatarSize()',\n '[attr.aria-labelledby]': 'nameId',\n },\n})\nexport class MkProfileCard {\n /** Display name. Also drives the avatar's initials fallback and alt text. */\n readonly name = input.required<string>();\n /** Muted supporting line under the name (role, handle, email…). */\n readonly subtitle = input<string>('');\n /** Avatar image URL; when empty the avatar falls back to initials. */\n readonly avatarSrc = input<string>('');\n /**\n * Cover banner image URL rendered as a ~3:1 band across the card top\n * (vertical orientation only). When set, the avatar overlaps the banner's\n * bottom edge with a surface-coloured ring.\n */\n readonly coverSrc = input<string>('');\n /** Layout: centred column (`vertical`) or avatar-left row (`horizontal`). */\n readonly orientation = input<MkProfileCardOrientation>('vertical');\n /** Avatar size scale, forwarded to {@link MkAvatar}. */\n readonly avatarSize = input<MkSize>('lg');\n\n /** Id of the name element, wired to the host's `aria-labelledby`. */\n protected readonly nameId = mkUniqueId('mk-profile-card-name');\n\n /** Cover renders only in vertical orientation. */\n protected readonly showCover = computed(\n () => this.orientation() === 'vertical' && !!this.coverSrc(),\n );\n}\n","@if (showCover()) {\n <div class=\"mk-profile-card__cover\" aria-hidden=\"true\">\n <img class=\"mk-profile-card__cover-img\" [src]=\"coverSrc()\" alt=\"\" />\n </div>\n}\n\n<div class=\"mk-profile-card__content\">\n <mk-avatar\n class=\"mk-profile-card__avatar\"\n [src]=\"avatarSrc()\"\n [name]=\"name()\"\n [size]=\"avatarSize()\" />\n\n <div class=\"mk-profile-card__main\">\n <div class=\"mk-profile-card__identity\">\n <div class=\"mk-profile-card__name\" [id]=\"nameId\">{{ name() }}</div>\n @if (subtitle()) {\n <div class=\"mk-profile-card__subtitle\">{{ subtitle() }}</div>\n }\n </div>\n\n <div class=\"mk-profile-card__body\">\n <ng-content />\n </div>\n\n <div class=\"mk-profile-card__meta\">\n <ng-content select=\"[mkProfileMeta]\" />\n </div>\n </div>\n\n <div class=\"mk-profile-card__actions\">\n <ng-content select=\"[mkProfileActions]\" />\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\nimport type { MkSize, MkTone } from '@mk-kit/ui/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\n\n/**\n * Progress bar — a determinate (0–100) or indeterminate progress indicator\n * with `role=\"progressbar\"`. `aria-valuenow` is omitted while indeterminate.\n * The indeterminate animation respects `prefers-reduced-motion`.\n *\n * ```html\n * <mk-progress-bar [value]=\"uploaded()\" label=\"Uploading\" showValue />\n * <mk-progress-bar indeterminate label=\"Loading\" />\n * ```\n */\n@Component({\n selector: 'mk-progress-bar',\n templateUrl: './progress-bar.html',\n styleUrl: './progress-bar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-progress-bar',\n role: 'progressbar',\n 'aria-valuemin': '0',\n 'aria-valuemax': '100',\n '[class.mk-progress-bar--sm]': \"size() === 'sm'\",\n '[class.mk-progress-bar--md]': \"size() === 'md'\",\n '[class.mk-progress-bar--lg]': \"size() === 'lg'\",\n '[class.mk-progress-bar--indeterminate]': 'indeterminate()',\n '[attr.data-tone]': 'tone()',\n '[attr.aria-valuenow]': 'indeterminate() ? null : clamped()',\n '[attr.aria-labelledby]': 'label() ? labelId : null',\n '[attr.aria-label]': \"label() ? null : 'Progress'\",\n },\n})\nexport class MkProgressBar {\n /** Completion percentage 0–100 (ignored while indeterminate). */\n readonly value = input(0, { transform: numberAttribute });\n /** Show an animated indeterminate bar with no known completion. */\n readonly indeterminate = input(false, { transform: booleanAttribute });\n /** Semantic color tone of the fill. */\n readonly tone = input<MkTone>('primary');\n /** Track thickness. */\n readonly size = input<MkSize>('md');\n /** Optional visible caption; also labels the bar for assistive tech. */\n readonly label = input<string>();\n /** Show the numeric percentage next to the label (determinate only). */\n readonly showValue = input(false, { transform: booleanAttribute });\n\n protected readonly labelId = mkUniqueId('mk-progress-label');\n\n /** Value clamped into the valid 0–100 range and rounded. */\n protected readonly clamped = computed(() =>\n Math.round(Math.min(100, Math.max(0, this.value()))),\n );\n\n /**\n * Inline transform for the determinate fill. Scaling instead of animating\n * `width` keeps the transition compositor-only (no layout per frame).\n */\n protected readonly fillTransform = computed(\n () => `scaleX(${this.clamped() / 100})`,\n );\n}\n","@if (label() || (showValue() && !indeterminate())) {\n <div class=\"mk-progress-bar__header\">\n @if (label()) {\n <span class=\"mk-progress-bar__label\" [id]=\"labelId\">{{ label() }}</span>\n }\n @if (showValue() && !indeterminate()) {\n <span class=\"mk-progress-bar__value\">{{ clamped() }}%</span>\n }\n </div>\n}\n<div class=\"mk-progress-bar__track\">\n <div\n class=\"mk-progress-bar__fill\"\n [style.transform]=\"indeterminate() ? null : fillTransform()\"\n ></div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\nimport type { MkTone } from '@mk-kit/ui/core';\n\n/**\n * ProgressRing — a circular progress indicator. Determinate by default (an arc\n * proportional to `value`); set `indeterminate` for a spinner-style preloader\n * when progress is unknown. Themed by `tone`, sized by `size`.\n *\n * ```html\n * <mk-progress-ring [value]=\"uploaded()\" showLabel />\n * <mk-progress-ring indeterminate tone=\"neutral\" [size]=\"24\" />\n * <mk-progress-ring [value]=\"72\" tone=\"success\"><mk-icon name=\"check\" /></mk-progress-ring>\n * ```\n */\n@Component({\n selector: 'mk-progress-ring',\n templateUrl: './progress-ring.html',\n styleUrl: './progress-ring.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-progress-ring',\n '[class.mk-progress-ring--indeterminate]': 'indeterminate()',\n '[attr.data-tone]': 'tone()',\n role: 'progressbar',\n '[attr.aria-valuenow]': 'indeterminate() ? null : clampedValue()',\n '[attr.aria-valuemin]': 'indeterminate() ? null : 0',\n '[attr.aria-valuemax]': 'indeterminate() ? null : max()',\n '[attr.aria-label]': 'label() || null',\n '[style.width.px]': 'size()',\n '[style.height.px]': 'size()',\n },\n})\nexport class MkProgressRing {\n /** Current progress value (clamped to `[0, max]`). Ignored when indeterminate. */\n readonly value = input(0, { transform: numberAttribute });\n /** Maximum value. Default `100`. */\n readonly max = input(100, { transform: numberAttribute });\n /** Diameter in px. Default `48`. */\n readonly size = input(48, { transform: numberAttribute });\n /** Ring thickness in px. Default `4`. */\n readonly thickness = input(4, { transform: numberAttribute });\n /** Semantic colour of the progress arc. */\n readonly tone = input<MkTone>('primary');\n /** Show a rotating arc for unknown-duration work (a circular preloader). */\n readonly indeterminate = input(false, { transform: booleanAttribute });\n /** Show the percentage in the centre. */\n readonly showLabel = input(false, { transform: booleanAttribute });\n /** Accessible label (recommended, especially when indeterminate). */\n readonly label = input<string>('');\n\n protected readonly clampedValue = computed(() =>\n Math.min(Math.max(this.value(), 0), this.max()),\n );\n protected readonly fraction = computed(() =>\n this.max() > 0 ? this.clampedValue() / this.max() : 0,\n );\n protected readonly percent = computed(() => Math.round(this.fraction() * 100));\n\n protected readonly radius = computed(() => (this.size() - this.thickness()) / 2);\n protected readonly circumference = computed(() => 2 * Math.PI * this.radius());\n /** Dash offset that reveals `fraction` of the circle. */\n protected readonly dashOffset = computed(() =>\n this.circumference() * (1 - this.fraction()),\n );\n protected readonly center = computed(() => this.size() / 2);\n}\n","<svg\n class=\"mk-progress-ring__svg\"\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n [attr.width]=\"size()\"\n [attr.height]=\"size()\"\n aria-hidden=\"true\"\n focusable=\"false\"\n>\n <circle\n class=\"mk-progress-ring__track\"\n [attr.cx]=\"center()\"\n [attr.cy]=\"center()\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"thickness()\"\n fill=\"none\"\n />\n <circle\n class=\"mk-progress-ring__arc\"\n [attr.cx]=\"center()\"\n [attr.cy]=\"center()\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"thickness()\"\n [attr.stroke-dasharray]=\"circumference()\"\n [attr.stroke-dashoffset]=\"indeterminate() ? circumference() * 0.7 : dashOffset()\"\n fill=\"none\"\n stroke-linecap=\"round\"\n />\n</svg>\n\n@if (showLabel() && !indeterminate()) {\n <span class=\"mk-progress-ring__label\">{{ percent() }}%</span>\n}\n<span class=\"mk-progress-ring__center\"><ng-content /></span>\n","import { ChangeDetectionStrategy, Component, inject, input } from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkSize, MkTone } from '@mk-kit/ui/core';\n\n/**\n * Spinner — a circular indeterminate loading indicator. Exposes `role=\"status\"`\n * with a visually-hidden label so assistive tech announces the loading state.\n * The animation slows under `prefers-reduced-motion`.\n *\n * ```html\n * <mk-spinner />\n * <mk-spinner size=\"lg\" tone=\"neutral\" label=\"Fetching results\" />\n * ```\n */\n@Component({\n selector: 'mk-spinner',\n templateUrl: './spinner.html',\n styleUrl: './spinner.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-spinner',\n role: 'status',\n '[class.mk-spinner--sm]': \"size() === 'sm'\",\n '[class.mk-spinner--md]': \"size() === 'md'\",\n '[class.mk-spinner--lg]': \"size() === 'lg'\",\n '[attr.data-tone]': 'tone()',\n },\n})\nexport class MkSpinner {\n protected readonly i18n = inject(MK_I18N);\n\n /** Size scale. */\n readonly size = input<MkSize>('md');\n /** Semantic color tone. */\n readonly tone = input<MkTone>('primary');\n /** Visually-hidden status label announced to screen readers. */\n readonly label = input(this.i18n.loading);\n}\n","<span class=\"mk-spinner__circle\" aria-hidden=\"true\"></span>\n<span class=\"mk-spinner__sr\">{{ label() }}</span>\n","/**\n * Shared, framework-agnostic helpers for the mk-kit SVG charts. Pure functions\n * only — no Angular, no DOM — so they stay trivially testable and reusable.\n */\n\n/** A named data series for multi-series charts. */\nexport interface MkChartSeries {\n /** Legend/tooltip label (identity — always shown, never colour-alone). */\n name: string;\n /** The values, one per category/x position. */\n data: number[];\n /** Optional explicit colour; defaults to the validated palette by index. */\n color?: string;\n}\n\n/** A single slice for the donut/pie chart. */\nexport interface MkChartSlice {\n /** Slice label. */\n name: string;\n /** Slice value (summed to compute proportions). */\n value: number;\n /** Optional explicit colour; defaults to the palette by index. */\n color?: string;\n}\n\n/** A resolved 2-D point in SVG user space. */\nexport interface MkPoint {\n x: number;\n y: number;\n}\n\n/** Number of hues in the validated categorical palette (`--mk-chart-1..8`). */\nexport const MK_CHART_PALETTE_SIZE = 8;\n\n/**\n * Categorical colour for a series index — a CSS reference to the validated\n * `--mk-chart-N` token. Assigned in fixed order and wrapped past 8 (prefer\n * folding a 9th series into \"Other\" over relying on the wrap).\n */\nexport function mkChartColor(index: number): string {\n return `var(--mk-chart-${(index % MK_CHART_PALETTE_SIZE) + 1})`;\n}\n\n/** Build a linear scale mapping `[d0,d1]` (domain) onto `[r0,r1]` (range). */\nexport function mkLinearScale(\n d0: number,\n d1: number,\n r0: number,\n r1: number,\n): (value: number) => number {\n const span = d1 - d0 || 1;\n return (value: number) => r0 + ((value - d0) / span) * (r1 - r0);\n}\n\n/**\n * \"Nice\" rounded tick values covering `[min,max]` with roughly `count` steps —\n * used for value axes so gridlines land on human numbers.\n */\nexport function mkNiceTicks(min: number, max: number, count = 5): number[] {\n if (min === max) {\n max = min + 1;\n }\n const range = max - min;\n const rawStep = range / Math.max(count, 1);\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const residual = rawStep / magnitude;\n const step =\n (residual >= 5 ? 10 : residual >= 2 ? 5 : residual >= 1 ? 2 : 1) * magnitude;\n const start = Math.floor(min / step) * step;\n const end = Math.ceil(max / step) * step;\n const ticks: number[] = [];\n // Guard against fp drift accumulating an extra tick.\n for (let v = start; v <= end + step / 2; v += step) {\n ticks.push(Number(v.toFixed(10)));\n }\n return ticks;\n}\n\n/** Straight-segment SVG path (`M … L …`) through the given points. */\nexport function mkLinePath(points: readonly MkPoint[]): string {\n if (!points.length) return '';\n return points\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`)\n .join(' ');\n}\n\n/**\n * Closed area path under a line: the line, dropped to `baselineY` at each end.\n */\nexport function mkAreaPath(\n points: readonly MkPoint[],\n baselineY: number,\n): string {\n if (!points.length) return '';\n const line = points\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`)\n .join(' ');\n const first = points[0];\n const last = points[points.length - 1];\n return `${line} L${last.x} ${baselineY} L${first.x} ${baselineY} Z`;\n}\n\n/**\n * SVG arc path for a donut/pie slice between two angles (radians, clockwise\n * from 12 o'clock). `inner` of 0 yields a pie wedge; > 0 yields a ring segment.\n */\nexport function mkArcPath(\n cx: number,\n cy: number,\n outer: number,\n inner: number,\n startAngle: number,\n endAngle: number,\n): string {\n const p = (r: number, a: number): MkPoint => ({\n x: cx + r * Math.sin(a),\n y: cy - r * Math.cos(a),\n });\n const large = endAngle - startAngle > Math.PI ? 1 : 0;\n const o0 = p(outer, startAngle);\n const o1 = p(outer, endAngle);\n if (inner <= 0) {\n return `M${cx} ${cy} L${o0.x} ${o0.y} A${outer} ${outer} 0 ${large} 1 ${o1.x} ${o1.y} Z`;\n }\n const i1 = p(inner, endAngle);\n const i0 = p(inner, startAngle);\n return (\n `M${o0.x} ${o0.y} A${outer} ${outer} 0 ${large} 1 ${o1.x} ${o1.y} ` +\n `L${i1.x} ${i1.y} A${inner} ${inner} 0 ${large} 0 ${i0.x} ${i0.y} Z`\n );\n}\n\n/** Compact number formatting for axes/tooltips (1.2k, 3.4M). */\nexport function mkFormatCompact(value: number): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000) return `${trim(value / 1_000_000)}M`;\n if (abs >= 1_000) return `${trim(value / 1_000)}k`;\n return `${trim(value)}`;\n}\n\nfunction trim(n: number): string {\n return Number(n.toFixed(1)).toString();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\nimport {\n MkPoint,\n mkAreaPath,\n mkFormatCompact,\n mkLinePath,\n} from './chart-utils';\n\n/** Visual form of a {@link MkSparkline}. */\nexport type MkSparklineType = 'line' | 'area' | 'bar';\n\n/**\n * Sparkline — a tiny, axis-less trend chart sized to sit inline in a table\n * cell, stat card or list row. Single series only; it's a *mark*, so it carries\n * no legend or tooltip (give context with the surrounding label + `label`).\n *\n * ```html\n * <mk-sparkline [data]=\"[3,5,4,7,6,9,8]\" type=\"area\" />\n * <mk-sparkline [data]=\"visits()\" [width]=\"80\" showDot\n * color=\"var(--mk-success)\" label=\"Weekly visits\" />\n * ```\n */\n@Component({\n selector: 'mk-sparkline',\n templateUrl: './sparkline.html',\n styleUrl: './sparkline.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-sparkline',\n role: 'img',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkSparkline {\n /** The values to plot (left → right). */\n readonly data = input<readonly number[]>([]);\n /** Visual form. */\n readonly type = input<MkSparklineType>('line');\n /** Any CSS colour; defaults to the first chart hue. */\n readonly color = input<string>('var(--mk-chart-1)');\n /** Intrinsic width in px (the SVG scales with its box). */\n readonly width = input(120, { transform: numberAttribute });\n /** Intrinsic height in px. */\n readonly height = input(32, { transform: numberAttribute });\n /** Line/area stroke width. */\n readonly strokeWidth = input(2, { transform: numberAttribute });\n /** Draw a dot on the last point (line/area only). */\n readonly showDot = input(false, { transform: booleanAttribute });\n /** Fixed domain minimum (defaults to the data min). */\n readonly min = input<number | undefined>(undefined);\n /** Fixed domain maximum (defaults to the data max). */\n readonly max = input<number | undefined>(undefined);\n /** Accessible label; a data summary is generated when omitted. */\n readonly label = input<string>('');\n\n private readonly pad = computed(() => this.strokeWidth() + (this.showDot() ? 2 : 0));\n\n private readonly domain = computed<[number, number]>(() => {\n const d = this.data();\n if (!d.length) return [0, 1];\n const lo = this.min() ?? Math.min(...d);\n const hi = this.max() ?? Math.max(...d);\n return lo === hi ? [lo - 1, hi + 1] : [lo, hi];\n });\n\n protected readonly points = computed<MkPoint[]>(() => {\n const d = this.data();\n if (!d.length) return [];\n const [lo, hi] = this.domain();\n const w = this.width();\n const h = this.height();\n const p = this.pad();\n const innerW = Math.max(w - 2 * p, 1);\n const innerH = Math.max(h - 2 * p, 1);\n const step = d.length > 1 ? innerW / (d.length - 1) : 0;\n return d.map((v, i) => ({\n x: p + (d.length > 1 ? i * step : innerW / 2),\n y: p + innerH - ((v - lo) / (hi - lo)) * innerH,\n }));\n });\n\n protected readonly linePath = computed(() => mkLinePath(this.points()));\n protected readonly areaPath = computed(() =>\n mkAreaPath(this.points(), this.height() - this.pad()),\n );\n\n /** Bar geometry for the `bar` type. */\n protected readonly bars = computed(() => {\n const d = this.data();\n if (!d.length) return [];\n const [lo, hi] = this.domain();\n const w = this.width();\n const h = this.height();\n const p = this.pad();\n const innerH = Math.max(h - 2 * p, 1);\n const gap = 2;\n const slot = (w - 2 * p) / d.length;\n const bw = Math.max(slot - gap, 1);\n const base = lo < 0 ? 0 : lo;\n return d.map((v, i) => {\n const y = p + innerH - ((Math.max(v, base) - lo) / (hi - lo)) * innerH;\n const y0 = p + innerH - ((base - lo) / (hi - lo)) * innerH;\n return { x: p + i * slot + gap / 2, y, w: bw, h: Math.max(y0 - y, 1) };\n });\n });\n\n protected readonly lastPoint = computed(() => {\n const pts = this.points();\n return pts.length ? pts[pts.length - 1] : null;\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const d = this.data();\n if (!d.length) return 'Sparkline, no data';\n const first = d[0];\n const last = d[d.length - 1];\n const dir = last > first ? 'up' : last < first ? 'down' : 'flat';\n return (\n `Sparkline trend ${dir}: ${d.length} points, ` +\n `${mkFormatCompact(first)} to ${mkFormatCompact(last)}, ` +\n `min ${mkFormatCompact(Math.min(...d))}, max ${mkFormatCompact(Math.max(...d))}`\n );\n });\n}\n","<svg\n class=\"mk-sparkline__svg\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n [attr.width]=\"width()\"\n [attr.height]=\"height()\"\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n>\n @if (type() === 'bar') {\n @for (b of bars(); track $index) {\n <rect\n class=\"mk-sparkline__bar\"\n [attr.x]=\"b.x\"\n [attr.y]=\"b.y\"\n [attr.width]=\"b.w\"\n [attr.height]=\"b.h\"\n [style.fill]=\"color()\"\n rx=\"1\"\n />\n }\n } @else {\n @if (type() === 'area') {\n <path class=\"mk-sparkline__area\" [attr.d]=\"areaPath()\" [style.fill]=\"color()\" />\n }\n <path\n class=\"mk-sparkline__line\"\n [attr.d]=\"linePath()\"\n [style.stroke]=\"color()\"\n [style.stroke-width]=\"strokeWidth()\"\n />\n @if (showDot() && lastPoint(); as p) {\n <circle\n class=\"mk-sparkline__dot\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n [attr.r]=\"strokeWidth() + 1\"\n [style.fill]=\"color()\"\n />\n }\n }\n</svg>\n","import {\n DestroyRef,\n ElementRef,\n Signal,\n afterNextRender,\n computed,\n inject,\n signal,\n} from '@angular/core';\n\n/**\n * Track the host element's width so a chart's viewBox can match the box it is\n * actually rendered into.\n *\n * Why this exists: the charts draw into a `viewBox` and the stylesheet sets\n * `width: 100%; height: auto`, so the rendered height was\n * `containerWidth × (viewBoxHeight / viewBoxWidth)` — unbounded. A full-width\n * chart on a wide monitor grew to over 2000px tall. Capping the height instead\n * is not a fix: `preserveAspectRatio=\"xMidYMid meet\"` then letterboxes the plot\n * into a narrow band with empty margins either side.\n *\n * Measuring the host and re-deriving the viewBox width keeps `height` meaning\n * exactly what it says (pixels) while the drawing fills the available width.\n *\n * SSR-safe: with no `ResizeObserver` (or before first render) the caller's\n * declared `width` is used unchanged, so server output is deterministic.\n *\n * Must be called from an injection context (field initialiser).\n */\nexport function mkChartAutoWidth(fallback: Signal<number>): Signal<number> {\n const host = inject(ElementRef<HTMLElement>);\n const destroyRef = inject(DestroyRef);\n const measured = signal<number | null>(null);\n\n afterNextRender(() => {\n if (typeof ResizeObserver === 'undefined') return;\n const el = host.nativeElement;\n const ro = new ResizeObserver((entries) => {\n const w = Math.round(entries[0]?.contentRect.width ?? 0);\n // Ignore a collapsed/hidden host — keeping the previous width avoids a\n // degenerate viewBox while the chart is inside a closed tab or panel.\n if (w > 0) measured.set(w);\n });\n ro.observe(el);\n destroyRef.onDestroy(() => ro.disconnect());\n });\n\n return computed(() => measured() ?? fallback());\n}\n","import { DOCUMENT, DestroyRef, ElementRef, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Tap-to-pin controller for chart hover tooltips — the touch path for UI that\n * is otherwise hover-only. Returned by {@link mkChartTapPin}.\n */\nexport interface MkChartTapPin<K> {\n /** Whether the tooltip is currently pinned by a tap. */\n isPinned(): boolean;\n /**\n * Pin the tooltip on `key`. Call from `pointerdown` on a hit target with the\n * original event — only `touch` pointers pin (mouse keeps its pure\n * hover-in/hover-out behaviour). Tapping another hit target moves the pin;\n * a pointerdown outside the chart clears it.\n */\n pin(key: K, event: PointerEvent): void;\n /**\n * Transient hover update from `pointerenter`/`pointerleave`. Enters always\n * apply; a leave (`null`) is ignored while pinned, so lifting the finger —\n * or a mouse straying off the chart — cannot dismiss a pinned tooltip.\n */\n hover(key: K | null): void;\n}\n\n/**\n * Creates a tap-to-pin controller for a chart's hover state. Must be called in\n * an injection context (a field initializer). `apply` receives the hover key to\n * set, or `null` to clear.\n *\n * While pinned, a capture-phase `pointerdown` listener on the document watches\n * for taps outside the chart host and clears the pin (listener added on pin,\n * removed on clear/destroy — SSR-safe: never attached on the server).\n */\nexport function mkChartTapPin<K>(apply: (key: K | null) => void): MkChartTapPin<K> {\n const documentRef = inject(DOCUMENT);\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n let pinned = false;\n\n const detach = (): void => {\n if (!pinned) return;\n pinned = false;\n documentRef.removeEventListener('pointerdown', onDocumentPointerdown, true);\n };\n\n const onDocumentPointerdown = (event: Event): void => {\n // Taps inside the chart move the pin via the hit target's own handler.\n if (host.contains(event.target as Node)) return;\n detach();\n apply(null);\n };\n\n inject(DestroyRef).onDestroy(detach);\n\n return {\n isPinned: () => pinned,\n\n pin(key: K, event: PointerEvent): void {\n if (event.pointerType !== 'touch') return;\n apply(key);\n if (pinned || !isBrowser) return;\n pinned = true;\n documentRef.addEventListener('pointerdown', onDocumentPointerdown, true);\n },\n\n hover(key: K | null): void {\n if (key === null && pinned) return;\n apply(key);\n },\n };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartAutoWidth } from './chart-autowidth';\nimport { mkChartTapPin } from './chart-tap-pin';\nimport {\n MkChartSeries,\n mkChartColor,\n mkFormatCompact,\n mkNiceTicks,\n} from './chart-utils';\n\ninterface BarRect {\n x: number;\n y: number;\n w: number;\n h: number;\n color: string;\n seriesIndex: number;\n categoryIndex: number;\n value: number;\n}\n\ninterface GridLine {\n value: number;\n label: string;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n labelX: number;\n labelY: number;\n}\n\ninterface Band {\n label: string;\n labelX: number;\n labelY: number;\n /** SVG transform when the axis is tilted; `null` when labels sit flat. */\n transform: string | null;\n}\n\n/**\n * Rough width of a label in px at the axis font-size (11px). Measuring for\n * real needs a laid-out DOM and a synchronous read per label per frame; a\n * per-character estimate is deterministic, testable, and only has to be good\n * enough to decide \"do these collide\".\n */\nconst CHAR_PX = 6.2;\nconst estimateLabelPx = (label: string) => label.length * CHAR_PX;\n\n/**\n * Fraction of its band a label may fill before `auto` tilts the axis.\n *\n * Not 1.0: labels that *technically* fit still read as a cramped run of words\n * with no gap between them (\"mar\" \"kwi\" \"maj\" touching each other), which is\n * the look tilting exists to avoid. Leaving a fifth of the band as breathing\n * room tilts the tight cases and leaves genuinely roomy axes alone.\n */\nconst TILT_THRESHOLD = 0.8;\n\n/** Bar orientation. */\nexport type MkBarOrientation = 'vertical' | 'horizontal';\n\n/**\n * BarChart — compares a measure across categories with one or more series\n * (grouped or `stacked`), `vertical` (default) or `horizontal`. Dependency-free\n * SVG on the validated `--mk-chart-*` palette; ships a legend for ≥ 2 series, a\n * value axis with gridlines, per-bar hover tooltips and a screen-reader table.\n *\n * ```html\n * <mk-bar-chart orientation=\"horizontal\"\n * [categories]=\"['Q1','Q2','Q3','Q4']\"\n * [series]=\"[{ name: 'Revenue', data: [12,19,15,22] }]\" />\n * ```\n */\n@Component({\n selector: 'mk-bar-chart',\n templateUrl: './bar-chart.html',\n styleUrl: './charts.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-bar-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkBarChart {\n /** Measured host width (falls back to `width` before first measure). */\n private readonly autoWidth = mkChartAutoWidth(computed(() => this.width()));\n /** The viewBox width the geometry is drawn against. */\n protected readonly drawWidth = computed(() =>\n this.responsive() ? this.autoWidth() : this.width(),\n );\n protected readonly i18n = inject(MK_I18N);\n\n /** Category labels along the category axis. */\n readonly categories = input<readonly string[]>([]);\n /** One or more data series (values align to `categories`). */\n readonly series = input<readonly MkChartSeries[]>([]);\n /** Bar direction. */\n readonly orientation = input<MkBarOrientation>('vertical');\n /** Intrinsic width in viewBox units — the fallback before the host is\n * measured, and the fixed drawing width when `responsive` is off. */\n readonly width = input(480, { transform: numberAttribute });\n /**\n * Match the viewBox width to the host's actual width so `height` means\n * pixels and a wide container no longer stretches the chart vertically.\n * Set false to pin the drawing to `width` (the pre-0.8 behaviour).\n */\n readonly responsive = input(true, { transform: booleanAttribute });\n /** Intrinsic height. */\n readonly height = input(260, { transform: numberAttribute });\n /** Stack series into one bar per category instead of grouping. */\n readonly stacked = input(false, { transform: booleanAttribute });\n /** Show gridlines behind the bars. */\n readonly showGrid = input(true, { transform: booleanAttribute });\n /** Force the legend on/off (defaults to on when there are ≥ 2 series). */\n readonly showLegend = input<boolean | undefined>(undefined);\n /**\n * Category-label tilt in degrees. `'auto'` (the default) leaves labels flat\n * while they fit and tilts them 45° when they would collide — the axis of a\n * narrow chart is otherwise an unreadable smear. A number pins the angle\n * (0 = always flat, 30/45 = always tilted); values are clamped to 0…90.\n *\n * Tilting reserves the extra vertical room it needs, so `height` still means\n * the height you asked for. When even tilted labels cannot fit, the chart\n * thins them — every Nth label is dropped rather than overlapped.\n */\n readonly labelAngle = input<number | 'auto'>('auto');\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n /** Make bars clickable + keyboard-focusable (`role=\"button\"`, accessible name) and emit `barClick`. */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** A bar was clicked or activated with Enter / Space (needs `interactive`). */\n readonly barClick = output<{ series: MkChartSeries; seriesIndex: number; category: string; categoryIndex: number; value: number }>();\n\n protected readonly hovered = signal<BarRect | null>(null);\n /** Tap-to-pin: a touch tap on a bar pins the tooltip until a tap lands\n * outside the chart (mouse hover in/out is unaffected). */\n private readonly tapPin = mkChartTapPin<BarRect>((b) => this.hovered.set(b));\n\n protected readonly horizontal = computed(\n () => this.orientation() === 'horizontal',\n );\n\n /** Widest category label, in estimated px. */\n private readonly widestLabelPx = computed(() =>\n this.categories().reduce((w, c) => Math.max(w, estimateLabelPx(c)), 0),\n );\n\n /**\n * The tilt actually applied. `auto` stays flat while the labels fit their\n * band and tilts 45° otherwise; an explicit number always wins (clamped).\n * Horizontal bars put categories on the Y axis, where tilting makes no\n * sense, so they are always flat.\n */\n protected readonly resolvedAngle = computed(() => {\n if (this.horizontal()) return 0;\n const requested = this.labelAngle();\n if (requested !== 'auto') {\n return Math.min(90, Math.max(0, requested));\n }\n const count = this.categories().length;\n if (!count) return 0;\n const band = Math.max(this.drawWidth() - 58, 1) / count;\n return this.widestLabelPx() <= band * TILT_THRESHOLD ? 0 : 45;\n });\n\n /**\n * Show every Nth label. Tilting buys room but not unlimited room: at 45° a\n * label still occupies `width * cos(45°)` horizontally, so a 24-category\n * chart in a card can need thinning on top of the tilt. Dropping labels\n * beats overlapping them — the bars all still draw.\n */\n protected readonly labelStep = computed(() => {\n const count = this.categories().length;\n if (!count) return 1;\n const band = Math.max(this.drawWidth() - 58, 1) / count;\n const angle = this.resolvedAngle();\n const footprint =\n this.widestLabelPx() * Math.cos((angle * Math.PI) / 180) || 1;\n return Math.max(1, Math.ceil(footprint / band));\n });\n\n private readonly margin = computed(() => {\n if (this.horizontal()) {\n return { top: 10, right: 18, bottom: 28, left: 72 };\n }\n // Tilted labels lean below the axis; reserve what they need so `height`\n // keeps meaning what the caller asked for instead of clipping at the\n // viewBox edge.\n const angle = this.resolvedAngle();\n const lean = angle\n ? this.widestLabelPx() * Math.sin((angle * Math.PI) / 180)\n : 0;\n return {\n top: 14,\n right: 14,\n bottom: 30 + Math.min(lean, 64),\n left: 44,\n };\n });\n\n protected readonly plot = computed(() => {\n const m = this.margin();\n return {\n x: m.left,\n y: m.top,\n w: Math.max(this.drawWidth() - m.left - m.right, 1),\n h: Math.max(this.height() - m.top - m.bottom, 1),\n };\n });\n\n protected readonly colors = computed(() =>\n this.series().map((s, i) => s.color ?? mkChartColor(i)),\n );\n\n protected readonly legendVisible = computed(\n () => this.showLegend() ?? this.series().length > 1,\n );\n\n private readonly maxValue = computed(() => {\n const series = this.series();\n const cats = this.categories();\n if (!series.length || !cats.length) return 1;\n if (this.stacked()) {\n let max = 0;\n for (let c = 0; c < cats.length; c++) {\n let sum = 0;\n for (const s of series) sum += Math.max(s.data[c] ?? 0, 0);\n max = Math.max(max, sum);\n }\n return max || 1;\n }\n return Math.max(1, ...series.flatMap((s) => s.data.map((v) => v || 0)));\n });\n\n protected readonly ticks = computed(() => mkNiceTicks(0, this.maxValue(), 5));\n private readonly tickMax = computed(() => {\n const t = this.ticks();\n return t[t.length - 1] || 1;\n });\n\n /** Pixel position along the value axis for a value. */\n private readonly valuePos = computed(() => {\n const { x, y, w, h } = this.plot();\n const max = this.tickMax();\n return this.horizontal()\n ? (v: number) => x + (v / max) * w\n : (v: number) => y + h - (v / max) * h;\n });\n\n /** Gridlines + value-axis labels (orientation-aware). */\n protected readonly gridRows = computed<GridLine[]>(() => {\n const { x, y, w, h } = this.plot();\n const pos = this.valuePos();\n return this.ticks().map((value) => {\n const label = mkFormatCompact(value);\n if (this.horizontal()) {\n const gx = pos(value);\n return { value, label, x1: gx, y1: y, x2: gx, y2: y + h, labelX: gx, labelY: y + h + 16 };\n }\n const gy = pos(value);\n return { value, label, x1: x, y1: gy, x2: x + w, y2: gy, labelX: x - 8, labelY: gy };\n });\n });\n\n /** Category-axis labels. */\n protected readonly bands = computed<Band[]>(() => {\n const cats = this.categories();\n const { x, y, w, h } = this.plot();\n if (this.horizontal()) {\n const bandH = h / (cats.length || 1);\n return cats.map((label, i) => ({\n label,\n labelX: x - 8,\n labelY: y + i * bandH + bandH / 2,\n transform: null,\n }));\n }\n const bandW = w / (cats.length || 1);\n const angle = this.resolvedAngle();\n const step = this.labelStep();\n const baselineY = y + h + 12;\n return cats.map((label, i) => {\n const cx = x + i * bandW + bandW / 2;\n // Thinned-out ticks keep their slot (so bars stay aligned) but render\n // nothing.\n const shown = i % step === 0 ? label : '';\n return {\n label: shown,\n labelX: cx,\n labelY: baselineY,\n // Rotate about the tick itself so the label's END sits under its bar\n // — anchoring at the start would walk the text off to the right.\n transform: angle ? `rotate(-${angle} ${cx} ${baselineY})` : null,\n };\n });\n });\n\n /** All bar rectangles (grouped or stacked, vertical or horizontal). */\n protected readonly bars = computed<BarRect[]>(() => {\n const series = this.series();\n const cats = this.categories();\n const colors = this.colors();\n const { x, y, w, h } = this.plot();\n const pos = this.valuePos();\n const base = this.horizontal() ? x : y + h;\n const out: BarRect[] = [];\n const bandSize = (this.horizontal() ? h : w) / (cats.length || 1);\n\n const push = (\n c: number,\n s: number,\n value: number,\n along: number, // offset within the band (cross-axis)\n thick: number,\n startVal: number,\n ) => {\n const bandStart = (this.horizontal() ? y : x) + c * bandSize + along;\n const p0 = pos(startVal);\n const p1 = pos(startVal + Math.max(value, 0));\n if (this.horizontal()) {\n out.push({ x: Math.min(p0, p1), y: bandStart, w: Math.abs(p1 - p0), h: thick, color: colors[s], seriesIndex: s, categoryIndex: c, value });\n } else {\n out.push({ x: bandStart, y: Math.min(p0, p1), w: thick, h: Math.abs(p1 - p0), color: colors[s], seriesIndex: s, categoryIndex: c, value });\n }\n };\n\n if (this.stacked()) {\n const barThick = bandSize * 0.6;\n const along = (bandSize - barThick) / 2;\n for (let c = 0; c < cats.length; c++) {\n let acc = 0;\n for (let s = 0; s < series.length; s++) {\n const v = Math.max(series[s].data[c] ?? 0, 0);\n if (v <= 0) continue;\n push(c, s, v, along, barThick, acc);\n acc += v;\n }\n }\n } else {\n const n = series.length || 1;\n const groupThick = bandSize * 0.7;\n const barThick = groupThick / n;\n for (let c = 0; c < cats.length; c++) {\n for (let s = 0; s < series.length; s++) {\n const v = series[s].data[c] ?? 0;\n const along = (bandSize - groupThick) / 2 + s * barThick;\n push(c, s, v, along, Math.max(barThick - 2, 1), 0);\n }\n }\n }\n // `base` referenced to satisfy the linter when value axes start at 0.\n void base;\n return out;\n });\n\n protected readonly legend = computed(() =>\n this.series().map((s, i) => ({ name: s.name, color: this.colors()[i] })),\n );\n\n /** Tooltip position (percent of viewBox) + content for the hovered bar. */\n protected readonly tooltip = computed(() => {\n const b = this.hovered();\n if (!b) return null;\n const [px, py] = this.horizontal()\n ? [b.x + b.w, b.y + b.h / 2]\n : [b.x + b.w / 2, b.y];\n return {\n left: (px / this.drawWidth()) * 100,\n top: (py / this.height()) * 100,\n category: this.categories()[b.categoryIndex],\n series: this.series()[b.seriesIndex]?.name ?? '',\n color: b.color,\n value: mkFormatCompact(b.value),\n multi: this.series().length > 1,\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const s = this.series();\n const cats = this.categories();\n if (!s.length || !cats.length) return 'Bar chart, no data';\n return `Bar chart of ${s.map((x) => x.name).join(', ')} across ${cats.length} categories`;\n });\n\n protected emitBar(b: BarRect, event?: Event): void {\n if (!this.interactive()) return;\n if (event instanceof KeyboardEvent) {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n }\n const series = this.series()[b.seriesIndex];\n if (!series) return;\n this.barClick.emit({ series, seriesIndex: b.seriesIndex, category: this.categories()[b.categoryIndex] ?? '', categoryIndex: b.categoryIndex, value: b.value });\n }\n\n protected barLabel(b: BarRect): string {\n return `${this.series()[b.seriesIndex]?.name ?? ''}, ${this.categories()[b.categoryIndex] ?? ''}: ${b.value}`;\n }\n\n protected setHover(bar: BarRect | null): void {\n this.tapPin.hover(bar);\n }\n\n protected pinHover(bar: BarRect, event: PointerEvent): void {\n this.tapPin.pin(bar, event);\n }\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg\"\n [attr.viewBox]=\"'0 0 ' + drawWidth() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n [attr.aria-hidden]=\"interactive() ? null : true\"\n [attr.role]=\"interactive() ? 'group' : null\"\n [attr.aria-label]=\"interactive() ? resolvedLabel() : null\"\n focusable=\"false\"\n >\n <!-- Gridlines + value-axis labels -->\n @for (row of gridRows(); track row.value) {\n @if (showGrid()) {\n <line\n class=\"mk-chart__grid\"\n [attr.x1]=\"row.x1\"\n [attr.x2]=\"row.x2\"\n [attr.y1]=\"row.y1\"\n [attr.y2]=\"row.y2\"\n />\n }\n <text\n class=\"mk-chart__axis-label\"\n [class.mk-chart__axis-label--y]=\"!horizontal()\"\n [class.mk-chart__axis-label--x]=\"horizontal()\"\n [attr.x]=\"row.labelX\"\n [attr.y]=\"row.labelY\"\n >\n {{ row.label }}\n </text>\n }\n\n <!-- Bars -->\n @for (b of bars(); track b.categoryIndex + '-' + b.seriesIndex) {\n <rect\n class=\"mk-chart__bar\"\n [class.mk-chart__bar--dim]=\"hovered() && hovered() !== b\"\n [attr.x]=\"b.x\"\n [attr.y]=\"b.y\"\n [attr.width]=\"b.w\"\n [attr.height]=\"b.h\"\n [style.fill]=\"b.color\"\n rx=\"3\"\n [class.mk-chart__bar--interactive]=\"interactive()\"\n [attr.role]=\"interactive() ? 'button' : null\"\n [attr.tabindex]=\"interactive() ? 0 : null\"\n [attr.aria-label]=\"interactive() ? barLabel(b) : null\"\n (pointerenter)=\"setHover(b)\"\n (pointerleave)=\"setHover(null)\"\n (pointerdown)=\"pinHover(b, $event)\"\n (click)=\"emitBar(b)\"\n (keydown)=\"emitBar(b, $event)\"\n (focus)=\"setHover(b)\"\n (blur)=\"setHover(null)\"\n />\n }\n\n <!-- Category labels. Tracked by index, not label: a 12-month window can\n start and end in the same month, and thinned axes repeat the empty\n string — both are duplicate keys (NG0955). -->\n @for (band of bands(); track $index) {\n @if (band.label) {\n <text\n class=\"mk-chart__axis-label\"\n [class.mk-chart__axis-label--x]=\"!horizontal() && !band.transform\"\n [class.mk-chart__axis-label--tilted]=\"band.transform\"\n [class.mk-chart__axis-label--y]=\"horizontal()\"\n [attr.x]=\"band.labelX\"\n [attr.y]=\"band.labelY\"\n [attr.transform]=\"band.transform\"\n >\n {{ band.label }}\n </text>\n }\n }\n </svg>\n\n @if (tooltip(); as t) {\n <div\n class=\"mk-chart__tooltip\"\n [style.left.%]=\"t.left\"\n [style.top.%]=\"t.top\"\n >\n <span class=\"mk-chart__tooltip-title\">{{ t.category }}</span>\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__swatch\" [style.background]=\"t.color\"></span>\n @if (t.multi) {\n <span class=\"mk-chart__tooltip-name\">{{ t.series }}</span>\n }\n <span class=\"mk-chart__tooltip-value\">{{ t.value }}</span>\n </span>\n </div>\n }\n</div>\n\n@if (legendVisible()) {\n <ul class=\"mk-chart__legend\">\n @for (item of legend(); track item.name) {\n <li class=\"mk-chart__legend-item\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartCategory }}</th>\n @for (s of series(); track s.name) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (cat of categories(); track cat; let c = $index) {\n <tr>\n <th scope=\"row\">{{ cat }}</th>\n @for (s of series(); track s.name) {\n <td>{{ s.data[c] }}</td>\n }\n </tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartAutoWidth } from './chart-autowidth';\nimport { mkChartTapPin } from './chart-tap-pin';\nimport {\n MkChartSeries,\n MkPoint,\n mkAreaPath,\n mkChartColor,\n mkFormatCompact,\n mkLinePath,\n mkNiceTicks,\n} from './chart-utils';\n\nconst MARGIN = { top: 14, right: 16, bottom: 30, left: 44 };\n\n/** Closed path filling between an upper (`top`) and lower (`bottom`) line. */\nfunction stackedAreaPath(\n top: readonly MkPoint[],\n bottom: readonly MkPoint[],\n): string {\n if (!top.length) return '';\n const topLine = top\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`)\n .join(' ');\n const botLine = [...bottom]\n .reverse()\n .map((p) => `L${p.x} ${p.y}`)\n .join(' ');\n return `${topLine} ${botLine} Z`;\n}\n\n/**\n * LineChart — a line (or `area`) chart for change over time / ordered\n * categories, with one or more series. Dependency-free SVG on the validated\n * `--mk-chart-*` palette; ships a legend for ≥ 2 series, a value axis, a\n * hover crosshair with a shared tooltip, and a screen-reader data table.\n *\n * ```html\n * <mk-line-chart area\n * [categories]=\"months\"\n * [series]=\"[{ name: 'Sessions', data: sessions() }]\" />\n * ```\n */\n@Component({\n selector: 'mk-line-chart',\n templateUrl: './line-chart.html',\n styleUrl: './charts.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-line-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkLineChart {\n /** Measured host width (falls back to `width` before first measure). */\n private readonly autoWidth = mkChartAutoWidth(computed(() => this.width()));\n /** The viewBox width the geometry is drawn against. */\n protected readonly drawWidth = computed(() =>\n this.responsive() ? this.autoWidth() : this.width(),\n );\n protected readonly i18n = inject(MK_I18N);\n\n /** Ordered category labels along the x axis. */\n readonly categories = input<readonly string[]>([]);\n /** One or more data series (values align to `categories`). */\n readonly series = input<readonly MkChartSeries[]>([]);\n /** Intrinsic width in viewBox units — the fallback before the host is\n * measured, and the fixed drawing width when `responsive` is off. */\n readonly width = input(480, { transform: numberAttribute });\n /**\n * Match the viewBox width to the host's actual width so `height` means\n * pixels and a wide container no longer stretches the chart vertically.\n * Set false to pin the drawing to `width` (the pre-0.8 behaviour).\n */\n readonly responsive = input(true, { transform: booleanAttribute });\n /** Intrinsic height. */\n readonly height = input(260, { transform: numberAttribute });\n /** Fill the area under each line. */\n readonly area = input(false, { transform: booleanAttribute });\n /** Stack the series (cumulative bands) — implies filled areas. */\n readonly stacked = input(false, { transform: booleanAttribute });\n /** Draw a dot at every data point. */\n readonly showDots = input(false, { transform: booleanAttribute });\n /** Show gridlines. */\n readonly showGrid = input(true, { transform: booleanAttribute });\n /** Force the legend on/off (defaults to on when there are ≥ 2 series). */\n readonly showLegend = input<boolean | undefined>(undefined);\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n /** Make x positions keyboard-focusable (`role=\"button\"`, accessible name) and emit `pointClick`. */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** A category (x position) was clicked or activated with Enter / Space (needs `interactive`). */\n readonly pointClick = output<{ index: number; category: string; values: Array<{ series: MkChartSeries; value: number }> }>();\n\n protected readonly hoverIndex = signal<number | null>(null);\n /** Tap-to-pin: a touch tap on a hit band pins the tooltip until a tap lands\n * outside the chart (mouse hover in/out is unaffected). */\n private readonly tapPin = mkChartTapPin<number>((i) => this.hoverIndex.set(i));\n\n protected readonly plot = computed(() => ({\n x: MARGIN.left,\n y: MARGIN.top,\n w: Math.max(this.drawWidth() - MARGIN.left - MARGIN.right, 1),\n h: Math.max(this.height() - MARGIN.top - MARGIN.bottom, 1),\n }));\n\n protected readonly colors = computed(() =>\n this.series().map((s, i) => s.color ?? mkChartColor(i)),\n );\n protected readonly legendVisible = computed(\n () => this.showLegend() ?? this.series().length > 1,\n );\n\n private readonly extent = computed<[number, number]>(() => {\n const series = this.series();\n if (!series.length) return [0, 1];\n if (this.stacked()) {\n const n = Math.max(0, ...series.map((s) => s.data.length));\n let max = 0;\n for (let i = 0; i < n; i++) {\n let sum = 0;\n for (const s of series) sum += Math.max(s.data[i] ?? 0, 0);\n max = Math.max(max, sum);\n }\n return [0, max || 1];\n }\n const values = series.flatMap((s) => s.data);\n if (!values.length) return [0, 1];\n return [Math.min(...values, 0), Math.max(...values)];\n });\n\n protected readonly ticks = computed(() => {\n const [lo, hi] = this.extent();\n return mkNiceTicks(lo, hi, 5);\n });\n private readonly domain = computed<[number, number]>(() => {\n const t = this.ticks();\n return [t[0], t[t.length - 1]];\n });\n\n private readonly toY = computed(() => {\n const { y, h } = this.plot();\n const [lo, hi] = this.domain();\n const span = hi - lo || 1;\n return (v: number) => y + h - ((v - lo) / span) * h;\n });\n private readonly xAt = computed(() => {\n const cats = this.categories();\n const { x, w } = this.plot();\n const step = cats.length > 1 ? w / (cats.length - 1) : 0;\n return (i: number) => (cats.length > 1 ? x + i * step : x + w / 2);\n });\n\n protected readonly gridRows = computed(() => {\n const { y, h } = this.plot();\n const [lo, hi] = this.domain();\n const span = hi - lo || 1;\n return this.ticks().map((value) => ({\n value,\n label: mkFormatCompact(value),\n y: y + h - ((value - lo) / span) * h,\n }));\n });\n\n /** Per-series rendered geometry (points + line + area paths). */\n protected readonly rendered = computed(() => {\n const toY = this.toY();\n const xAt = this.xAt();\n const series = this.series();\n\n if (this.stacked()) {\n const n = Math.max(0, ...series.map((s) => s.data.length));\n const running = new Array<number>(n).fill(0);\n return series.map((s, si) => {\n const bottom: MkPoint[] = running.map((v, i) => ({ x: xAt(i), y: toY(v) }));\n for (let i = 0; i < n; i++) running[i] += Math.max(s.data[i] ?? 0, 0);\n const top: MkPoint[] = running.map((v, i) => ({ x: xAt(i), y: toY(v) }));\n return {\n name: s.name,\n color: this.colors()[si],\n points: top,\n line: mkLinePath(top),\n area: stackedAreaPath(top, bottom),\n };\n });\n }\n\n const baseline = toY(this.domain()[0]);\n return series.map((s, si) => {\n const points: MkPoint[] = s.data.map((v, i) => ({ x: xAt(i), y: toY(v) }));\n return {\n name: s.name,\n color: this.colors()[si],\n points,\n line: mkLinePath(points),\n area: mkAreaPath(points, baseline),\n };\n });\n });\n\n /** Whether to paint the filled areas. */\n protected readonly fillAreas = computed(() => this.area() || this.stacked());\n\n /** Transparent hit bands (one per category) driving the shared tooltip. */\n protected readonly hitBands = computed(() => {\n const cats = this.categories();\n const { x, w, y, h } = this.plot();\n const bandW = cats.length ? w / cats.length : w;\n return cats.map((_, i) => ({\n index: i,\n x: this.xAt()(i) - bandW / 2,\n y,\n w: bandW,\n h,\n }));\n });\n\n protected readonly crosshairX = computed(() => {\n const i = this.hoverIndex();\n return i == null ? null : this.xAt()(i);\n });\n\n protected readonly legend = computed(() =>\n this.series().map((s, i) => ({ name: s.name, color: this.colors()[i] })),\n );\n\n /** Hovered-point markers + tooltip payload for the active category. */\n protected readonly activePoints = computed(() => {\n const i = this.hoverIndex();\n if (i == null) return [];\n return this.rendered().map((r) => ({\n color: r.color,\n name: r.name,\n x: r.points[i]?.x ?? 0,\n y: r.points[i]?.y ?? 0,\n value: this.series().find((s) => s.name === r.name)?.data[i] ?? 0,\n }));\n });\n\n protected readonly tooltip = computed(() => {\n const i = this.hoverIndex();\n const pts = this.activePoints();\n if (i == null || !pts.length) return null;\n const topY = Math.min(...pts.map((p) => p.y));\n return {\n left: (this.xAt()(i) / this.drawWidth()) * 100,\n top: (topY / this.height()) * 100,\n category: this.categories()[i],\n rows: pts.map((p) => ({\n color: p.color,\n name: p.name,\n value: mkFormatCompact(p.value),\n })),\n multi: this.series().length > 1,\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const s = this.series();\n if (!s.length) return 'Line chart, no data';\n return `Line chart of ${s.map((x) => x.name).join(', ')} over ${this.categories().length} points`;\n });\n\n protected emitPoint(index: number, event?: Event): void {\n if (!this.interactive()) return;\n if (event instanceof KeyboardEvent) {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n }\n this.pointClick.emit({\n index,\n category: this.categories()[index] ?? '',\n values: this.series().map((series) => ({ series, value: series.data[index] ?? 0 })),\n });\n }\n\n protected pointLabel(index: number): string {\n const values = this.series().map((s) => `${s.name} ${s.data[index] ?? 0}`).join(', ');\n return `${this.categories()[index] ?? ''}: ${values}`;\n }\n\n protected setHover(index: number | null): void {\n this.tapPin.hover(index);\n }\n\n protected pinHover(index: number, event: PointerEvent): void {\n this.tapPin.pin(index, event);\n }\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg\"\n [attr.viewBox]=\"'0 0 ' + drawWidth() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n [attr.aria-hidden]=\"interactive() ? null : true\"\n [attr.role]=\"interactive() ? 'group' : null\"\n [attr.aria-label]=\"interactive() ? resolvedLabel() : null\"\n focusable=\"false\"\n >\n <!-- Gridlines + value-axis labels -->\n @for (row of gridRows(); track row.value) {\n @if (showGrid()) {\n <line\n class=\"mk-chart__grid\"\n [attr.x1]=\"plot().x\"\n [attr.x2]=\"plot().x + plot().w\"\n [attr.y1]=\"row.y\"\n [attr.y2]=\"row.y\"\n />\n }\n <text\n class=\"mk-chart__axis-label mk-chart__axis-label--y\"\n [attr.x]=\"plot().x - 8\"\n [attr.y]=\"row.y\"\n >\n {{ row.label }}\n </text>\n }\n\n <!-- Areas + lines -->\n @for (r of rendered(); track r.name) {\n @if (fillAreas()) {\n <path class=\"mk-chart__area\" [attr.d]=\"r.area\" [style.fill]=\"r.color\" />\n }\n <path class=\"mk-chart__line\" [attr.d]=\"r.line\" [style.stroke]=\"r.color\" />\n @if (showDots()) {\n @for (p of r.points; track $index) {\n <circle\n class=\"mk-chart__dot\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"3\"\n [style.fill]=\"r.color\"\n />\n }\n }\n }\n\n <!-- Category labels -->\n @for (cat of categories(); track $index; let i = $index) {\n <text\n class=\"mk-chart__axis-label mk-chart__axis-label--x\"\n [attr.x]=\"plot().x + (categories().length > 1 ? (i * plot().w) / (categories().length - 1) : plot().w / 2)\"\n [attr.y]=\"height() - 10\"\n >\n {{ cat }}\n </text>\n }\n\n <!-- Hover crosshair + active point markers -->\n @if (crosshairX(); as cx) {\n <line\n class=\"mk-chart__crosshair\"\n [attr.x1]=\"cx\"\n [attr.x2]=\"cx\"\n [attr.y1]=\"plot().y\"\n [attr.y2]=\"plot().y + plot().h\"\n />\n @for (p of activePoints(); track p.name) {\n <circle\n class=\"mk-chart__dot\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"4\"\n [style.fill]=\"p.color\"\n />\n }\n }\n\n <!-- Transparent hit bands -->\n @for (band of hitBands(); track band.index) {\n <rect\n [attr.x]=\"band.x\"\n [attr.y]=\"band.y\"\n [attr.width]=\"band.w\"\n [attr.height]=\"band.h\"\n fill=\"transparent\"\n [class.mk-chart__band--interactive]=\"interactive()\"\n [attr.role]=\"interactive() ? 'button' : null\"\n [attr.tabindex]=\"interactive() ? 0 : null\"\n [attr.aria-label]=\"interactive() ? pointLabel(band.index) : null\"\n (pointerenter)=\"setHover(band.index)\"\n (pointerleave)=\"setHover(null)\"\n (pointerdown)=\"pinHover(band.index, $event)\"\n (click)=\"emitPoint(band.index)\"\n (keydown)=\"emitPoint(band.index, $event)\"\n (focus)=\"setHover(band.index)\"\n (blur)=\"setHover(null)\"\n />\n }\n </svg>\n\n @if (tooltip(); as t) {\n <div class=\"mk-chart__tooltip\" [style.left.%]=\"t.left\" [style.top.%]=\"t.top\">\n <span class=\"mk-chart__tooltip-title\">{{ t.category }}</span>\n @for (row of t.rows; track row.name) {\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__swatch\" [style.background]=\"row.color\"></span>\n @if (t.multi) {\n <span class=\"mk-chart__tooltip-name\">{{ row.name }}</span>\n }\n <span class=\"mk-chart__tooltip-value\">{{ row.value }}</span>\n </span>\n }\n </div>\n }\n</div>\n\n@if (legendVisible()) {\n <ul class=\"mk-chart__legend\">\n @for (item of legend(); track item.name) {\n <li class=\"mk-chart__legend-item\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartCategory }}</th>\n @for (s of series(); track s.name) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (cat of categories(); track cat; let c = $index) {\n <tr>\n <th scope=\"row\">{{ cat }}</th>\n @for (s of series(); track s.name) {\n <td>{{ s.data[c] }}</td>\n }\n </tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartTapPin } from './chart-tap-pin';\nimport {\n MkChartSlice,\n mkArcPath,\n mkChartColor,\n mkFormatCompact,\n} from './chart-utils';\n\ninterface SliceGeom {\n name: string;\n value: number;\n color: string;\n path: string;\n percent: number;\n midAngle: number;\n index: number;\n}\n\n/**\n * DonutChart — proportions of a whole as a ring (or a full pie when\n * `thickness` covers the radius). Dependency-free SVG on the validated\n * `--mk-chart-*` palette; ships a value/percent legend, per-slice hover\n * tooltips, an optional centre label, and a screen-reader data table.\n *\n * ```html\n * <mk-donut-chart centerLabel=\"1,240\" centerSublabel=\"Total\"\n * [slices]=\"[{ name: 'Direct', value: 540 }, { name: 'Search', value: 700 }]\" />\n * ```\n */\n@Component({\n selector: 'mk-donut-chart',\n templateUrl: './donut-chart.html',\n styleUrl: './charts.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-donut-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkDonutChart {\n protected readonly i18n = inject(MK_I18N);\n\n /** The slices; each `value` contributes to the whole. */\n readonly slices = input<readonly MkChartSlice[]>([]);\n /** Diameter in viewBox units (the SVG scales to its container). */\n readonly size = input(220, { transform: numberAttribute });\n /** Ring thickness. Set `0` (or ≥ radius) for a full pie. */\n readonly thickness = input(34, { transform: numberAttribute });\n /** Show the legend with values + percentages. */\n readonly showLegend = input(true, { transform: booleanAttribute });\n /** Big centre label (e.g. a total). Donut only. */\n readonly centerLabel = input<string>('');\n /** Small centre caption under the label. */\n readonly centerSublabel = input<string>('');\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n /**\n * Make slices (and legend rows) clickable and keyboard-focusable: they get\n * `role=\"button\"` + an accessible name and emit `sliceClick`. Off by default —\n * the chart stays a static picture with its screen-reader table.\n */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** A slice was clicked or activated with Enter / Space (needs `interactive`). */\n readonly sliceClick = output<{ slice: MkChartSlice; index: number }>();\n\n protected readonly hovered = signal<number | null>(null);\n /** Tap-to-pin: a touch tap on a slice pins the tooltip until a tap lands\n * outside the chart (mouse hover in/out is unaffected). */\n private readonly tapPin = mkChartTapPin<number>((i) => this.hovered.set(i));\n\n protected readonly total = computed(() =>\n this.slices().reduce((sum, s) => sum + Math.max(s.value, 0), 0),\n );\n\n protected readonly center = computed(() => this.size() / 2);\n protected readonly outerRadius = computed(() => this.size() / 2 - 2);\n protected readonly innerRadius = computed(() => {\n const outer = this.outerRadius();\n const t = this.thickness();\n return t <= 0 || t >= outer ? 0 : outer - t;\n });\n\n protected readonly geom = computed<SliceGeom[]>(() => {\n const total = this.total();\n if (total <= 0) return [];\n const cx = this.center();\n const cy = this.center();\n const outer = this.outerRadius();\n const inner = this.innerRadius();\n let angle = 0;\n return this.slices().map((s, i) => {\n const frac = Math.max(s.value, 0) / total;\n const start = angle;\n // Leave the smallest gap so a single 100% slice still renders as a ring.\n const end = angle + frac * Math.PI * 2 * 0.99999;\n angle += frac * Math.PI * 2;\n return {\n name: s.name,\n value: s.value,\n color: s.color ?? mkChartColor(i),\n path: mkArcPath(cx, cy, outer, inner, start, end),\n percent: Math.round(frac * 100),\n midAngle: (start + end) / 2,\n index: i,\n };\n });\n });\n\n protected readonly legend = computed(() =>\n this.geom().map((g) => ({\n name: g.name,\n color: g.color,\n value: mkFormatCompact(g.value),\n percent: g.percent,\n })),\n );\n\n protected readonly tooltip = computed(() => {\n const i = this.hovered();\n if (i == null) return null;\n const g = this.geom().find((x) => x.index === i);\n if (!g) return null;\n const r = (this.outerRadius() + this.innerRadius()) / 2;\n const x = this.center() + r * Math.sin(g.midAngle);\n const y = this.center() - r * Math.cos(g.midAngle);\n return {\n left: (x / this.size()) * 100,\n top: (y / this.size()) * 100,\n name: g.name,\n color: g.color,\n value: mkFormatCompact(g.value),\n percent: g.percent,\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const s = this.slices();\n if (!s.length) return 'Donut chart, no data';\n return `Donut chart with ${s.length} slices totalling ${mkFormatCompact(this.total())}`;\n });\n\n protected emitSlice(index: number, event?: Event): void {\n if (!this.interactive()) return;\n if (event instanceof KeyboardEvent) {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n }\n const slice = this.slices()[index];\n if (slice) this.sliceClick.emit({ slice, index });\n }\n\n protected sliceLabel(index: number): string {\n const s = this.slices()[index];\n return s ? `${s.name}: ${s.value}` : '';\n }\n\n protected setHover(index: number | null): void {\n this.tapPin.hover(index);\n }\n\n protected pinHover(index: number, event: PointerEvent): void {\n this.tapPin.pin(index, event);\n }\n}\n","<div class=\"mk-chart__frame mk-donut__frame\" [style.max-width.px]=\"size()\">\n <svg\n class=\"mk-chart__svg mk-donut__svg\"\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n preserveAspectRatio=\"xMidYMid meet\"\n [attr.aria-hidden]=\"interactive() ? null : true\"\n [attr.aria-label]=\"interactive() ? resolvedLabel() : null\"\n [attr.role]=\"interactive() ? 'group' : null\"\n focusable=\"false\"\n >\n @for (g of geom(); track g.index) {\n <path\n class=\"mk-chart__slice\"\n [class.mk-chart__slice--dim]=\"hovered() !== null && hovered() !== g.index\"\n [attr.d]=\"g.path\"\n [style.fill]=\"g.color\"\n [class.mk-chart__slice--interactive]=\"interactive()\"\n [attr.role]=\"interactive() ? 'button' : null\"\n [attr.tabindex]=\"interactive() ? 0 : null\"\n [attr.aria-label]=\"interactive() ? sliceLabel(g.index) : null\"\n (pointerenter)=\"setHover(g.index)\"\n (pointerleave)=\"setHover(null)\"\n (pointerdown)=\"pinHover(g.index, $event)\"\n (click)=\"emitSlice(g.index)\"\n (keydown)=\"emitSlice(g.index, $event)\"\n (focus)=\"setHover(g.index)\"\n (blur)=\"setHover(null)\"\n />\n }\n </svg>\n\n @if (innerRadius() > 0 && (centerLabel() || centerSublabel())) {\n <div class=\"mk-donut__center\">\n @if (centerLabel()) {\n <span class=\"mk-donut__center-label\">{{ centerLabel() }}</span>\n }\n @if (centerSublabel()) {\n <span class=\"mk-donut__center-sublabel\">{{ centerSublabel() }}</span>\n }\n </div>\n }\n\n @if (tooltip(); as t) {\n <div class=\"mk-chart__tooltip\" [style.left.%]=\"t.left\" [style.top.%]=\"t.top\">\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__swatch\" [style.background]=\"t.color\"></span>\n <span class=\"mk-chart__tooltip-name\">{{ t.name }}</span>\n <span class=\"mk-chart__tooltip-value\">{{ t.value }} ({{ t.percent }}%)</span>\n </span>\n </div>\n }\n</div>\n\n@if (showLegend()) {\n <ul class=\"mk-chart__legend mk-donut__legend\">\n @for (item of legend(); track item.name; let i = $index) {\n <li class=\"mk-chart__legend-item\">\n @if (interactive()) {\n <button type=\"button\" class=\"mk-chart__legend-button\" (click)=\"emitSlice(i)\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n <span class=\"mk-donut__legend-name\">{{ item.name }}</span>\n <span class=\"mk-donut__legend-value\">{{ item.value }} · {{ item.percent }}%</span>\n </button>\n } @else {\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n <span class=\"mk-donut__legend-name\">{{ item.name }}</span>\n <span class=\"mk-donut__legend-value\">{{ item.value }} · {{ item.percent }}%</span>\n }\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr><th scope=\"col\">{{ i18n.chartSlice }}</th><th scope=\"col\">{{ i18n.chartValue }}</th></tr>\n </thead>\n <tbody>\n @for (s of slices(); track s.name) {\n <tr><th scope=\"row\">{{ s.name }}</th><td>{{ s.value }}</td></tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { mkArcPath, mkFormatCompact } from './chart-utils';\n\n/**\n * Gauge — a single-metric radial dial (a KPI: \"68% of quota\"). Dependency-free\n * SVG: a track arc with a value arc filled proportionally to `value` on the\n * `[min, max]` scale, and a centred value + label. The sweep is configurable\n * (`arc`, default 270°). Exposes `role=\"meter\"` for assistive tech.\n *\n * ```html\n * <mk-gauge [value]=\"68\" label=\"of quota\" unit=\"%\" />\n * ```\n */\n@Component({\n selector: 'mk-gauge',\n templateUrl: './gauge.html',\n styleUrl: './gauge.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-gauge',\n role: 'meter',\n '[attr.aria-valuenow]': 'value()',\n '[attr.aria-valuemin]': 'min()',\n '[attr.aria-valuemax]': 'max()',\n '[attr.aria-valuetext]': 'centerText()',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkGauge {\n /** The current value. */\n readonly value = input(0, { transform: numberAttribute });\n /** Scale minimum. */\n readonly min = input(0, { transform: numberAttribute });\n /** Scale maximum. */\n readonly max = input(100, { transform: numberAttribute });\n /** Sweep of the arc in degrees (30–360). */\n readonly arc = input(270, { transform: numberAttribute });\n /** Intrinsic size (viewBox units; the SVG scales to its container). */\n readonly size = input(180, { transform: numberAttribute });\n /** Arc thickness. */\n readonly thickness = input(14, { transform: numberAttribute });\n /** Value-arc colour. */\n readonly color = input('var(--mk-primary)');\n /** Track (background arc) colour. */\n readonly trackColor = input('var(--mk-border-subtle)');\n /** Label under the value. */\n readonly label = input('');\n /** Unit appended to the value (e.g. `%`). */\n readonly unit = input('');\n /** Override the centred value text. */\n readonly valueText = input('');\n\n private readonly TAU = Math.PI * 2;\n\n protected readonly cx = computed(() => this.size() / 2);\n protected readonly cy = computed(() => this.size() / 2);\n private readonly rOuter = computed(() => this.size() / 2 - 2);\n private readonly rInner = computed(() =>\n Math.max(1, this.rOuter() - this.thickness()),\n );\n\n /** Value clamped to [min, max] then normalised to 0–1. */\n protected readonly fraction = computed(() => {\n const span = this.max() - this.min() || 1;\n return Math.max(0, Math.min(1, (this.value() - this.min()) / span));\n });\n\n private readonly sweep = computed(\n () => (Math.max(30, Math.min(360, this.arc())) * Math.PI) / 180,\n );\n /** Arc starts after half the gap, measured clockwise from 6 o'clock. */\n private readonly startAngle = computed(\n () => Math.PI + (this.TAU - this.sweep()) / 2,\n );\n\n protected readonly trackPath = computed(() =>\n mkArcPath(\n this.cx(),\n this.cy(),\n this.rOuter(),\n this.rInner(),\n this.startAngle(),\n this.startAngle() + this.sweep(),\n ),\n );\n\n protected readonly valuePath = computed(() => {\n const frac = this.fraction();\n if (frac <= 0) return '';\n return mkArcPath(\n this.cx(),\n this.cy(),\n this.rOuter(),\n this.rInner(),\n this.startAngle(),\n this.startAngle() + this.sweep() * frac,\n );\n });\n\n protected readonly centerText = computed(\n () => this.valueText() || `${mkFormatCompact(this.value())}${this.unit()}`,\n );\n\n protected readonly resolvedLabel = computed(() => {\n const l = this.label() ? ` ${this.label()}` : '';\n return `${this.centerText()}${l}`;\n });\n}\n","<svg\n class=\"mk-gauge__svg\"\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n preserveAspectRatio=\"xMidYMid meet\"\n aria-hidden=\"true\"\n focusable=\"false\"\n>\n <path\n class=\"mk-gauge__track\"\n [attr.d]=\"trackPath()\"\n [style.fill]=\"trackColor()\"\n />\n @if (valuePath()) {\n <path class=\"mk-gauge__value\" [attr.d]=\"valuePath()\" [style.fill]=\"color()\" />\n }\n <text\n class=\"mk-gauge__number\"\n [attr.x]=\"cx()\"\n [attr.y]=\"cy()\"\n text-anchor=\"middle\"\n dominant-baseline=\"central\"\n >\n {{ centerText() }}\n </text>\n @if (label()) {\n <text\n class=\"mk-gauge__label\"\n [attr.x]=\"cx()\"\n [attr.y]=\"cy() + size() * 0.14\"\n text-anchor=\"middle\"\n >\n {{ label() }}\n </text>\n }\n</svg>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartTapPin } from './chart-tap-pin';\nimport {\n mkChartColor,\n mkFormatCompact,\n mkLinearScale,\n mkNiceTicks,\n} from './chart-utils';\n\n/** A single plotted point. `size` (optional) turns it into a bubble. */\nexport interface MkScatterPoint {\n x: number;\n y: number;\n /** Value driving the bubble radius when `bubble` sizing is used. */\n size?: number;\n /** Optional label shown in the tooltip. */\n label?: string;\n}\n\n/** A named group of scatter points sharing a colour. */\nexport interface MkScatterSeries {\n name: string;\n color?: string;\n points: readonly MkScatterPoint[];\n}\n\nconst MARGIN = { top: 14, right: 16, bottom: 34, left: 48 };\n\ninterface RenderedPoint {\n cx: number;\n cy: number;\n r: number;\n color: string;\n seriesName: string;\n x: number;\n y: number;\n label?: string;\n}\n\n/**\n * ScatterChart — plot (x, y) points across two numeric axes to reveal\n * correlation and clusters. Give each point a `size` to render a bubble chart.\n * Dependency-free SVG on the validated `--mk-chart-*` palette; ships nice-tick\n * axes, a legend for ≥ 2 series, a per-point hover tooltip and a screen-reader\n * data table.\n *\n * ```html\n * <mk-scatter-chart\n * xLabel=\"Spend\" yLabel=\"Revenue\"\n * [series]=\"[{ name: 'Q3', points: pts() }]\" />\n * ```\n */\n@Component({\n selector: 'mk-scatter-chart',\n templateUrl: './scatter-chart.html',\n styleUrl: './charts.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-scatter-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkScatterChart {\n protected readonly i18n = inject(MK_I18N);\n\n /** One or more point series. */\n readonly series = input<readonly MkScatterSeries[]>([]);\n /** Intrinsic width (viewBox units; the SVG scales to its container). */\n readonly width = input(480, { transform: numberAttribute });\n /** Intrinsic height. */\n readonly height = input(300, { transform: numberAttribute });\n /** Radius of each point when not sizing by `size`. */\n readonly pointRadius = input(4, { transform: numberAttribute });\n /** Size points by their `size` value (bubble chart). */\n readonly bubble = input(false, { transform: booleanAttribute });\n /** Largest bubble radius when `bubble` is on. */\n readonly maxRadius = input(20, { transform: numberAttribute });\n /** Show gridlines. */\n readonly showGrid = input(true, { transform: booleanAttribute });\n /** Force the legend on/off (defaults to on when there are ≥ 2 series). */\n readonly showLegend = input<boolean | undefined>(undefined);\n /** x-axis title. */\n readonly xLabel = input<string>('');\n /** y-axis title. */\n readonly yLabel = input<string>('');\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n\n protected readonly hoverKey = signal<string | null>(null);\n /** Tap-to-pin: a touch tap on a point pins the tooltip until a tap lands\n * outside the chart (mouse hover in/out is unaffected). */\n private readonly tapPin = mkChartTapPin<string>((k) => this.hoverKey.set(k));\n\n protected readonly plot = computed(() => ({\n x: MARGIN.left,\n y: MARGIN.top,\n w: Math.max(this.width() - MARGIN.left - MARGIN.right, 1),\n h: Math.max(this.height() - MARGIN.top - MARGIN.bottom, 1),\n }));\n\n protected readonly colors = computed(() =>\n this.series().map((s, i) => s.color ?? mkChartColor(i)),\n );\n protected readonly legendVisible = computed(\n () => this.showLegend() ?? this.series().length > 1,\n );\n\n private readonly allPoints = computed(() =>\n this.series().flatMap((s) => s.points),\n );\n\n private readonly xExtent = computed<[number, number]>(() => {\n const xs = this.allPoints().map((p) => p.x);\n return xs.length ? [Math.min(...xs), Math.max(...xs)] : [0, 1];\n });\n private readonly yExtent = computed<[number, number]>(() => {\n const ys = this.allPoints().map((p) => p.y);\n return ys.length ? [Math.min(...ys), Math.max(...ys)] : [0, 1];\n });\n\n protected readonly xTicks = computed(() =>\n mkNiceTicks(this.xExtent()[0], this.xExtent()[1], 5),\n );\n protected readonly yTicks = computed(() =>\n mkNiceTicks(this.yExtent()[0], this.yExtent()[1], 5),\n );\n\n private readonly xScale = computed(() => {\n const t = this.xTicks();\n const { x, w } = this.plot();\n return mkLinearScale(t[0], t[t.length - 1], x, x + w);\n });\n private readonly yScale = computed(() => {\n const t = this.yTicks();\n const { y, h } = this.plot();\n // Invert: larger values sit higher on the screen.\n return mkLinearScale(t[0], t[t.length - 1], y + h, y);\n });\n\n private readonly sizeExtent = computed<[number, number]>(() => {\n const sizes = this.allPoints().map((p) => p.size ?? 0);\n return sizes.length ? [Math.min(...sizes), Math.max(...sizes)] : [0, 1];\n });\n\n private radiusFor(size: number | undefined): number {\n if (!this.bubble()) return this.pointRadius();\n const [lo, hi] = this.sizeExtent();\n const span = hi - lo || 1;\n const t = ((size ?? lo) - lo) / span;\n // Area-proportional so perceived size tracks value; floor at 3px.\n const min = 3;\n return min + Math.sqrt(t) * (this.maxRadius() - min);\n }\n\n /** Gridlines + axis-tick geometry. */\n protected readonly xGrid = computed(() => {\n const { y, h } = this.plot();\n return this.xTicks().map((value) => ({\n value,\n label: mkFormatCompact(value),\n x: this.xScale()(value),\n y1: y,\n y2: y + h,\n }));\n });\n protected readonly yGrid = computed(() => {\n const { x, w } = this.plot();\n return this.yTicks().map((value) => ({\n value,\n label: mkFormatCompact(value),\n y: this.yScale()(value),\n x1: x,\n x2: x + w,\n }));\n });\n\n /** Every point positioned for rendering. */\n protected readonly points = computed<RenderedPoint[]>(() => {\n const xs = this.xScale();\n const ys = this.yScale();\n return this.series().flatMap((s, si) =>\n s.points.map((p) => ({\n cx: xs(p.x),\n cy: ys(p.y),\n r: this.radiusFor(p.size),\n color: this.colors()[si],\n seriesName: s.name,\n x: p.x,\n y: p.y,\n label: p.label,\n })),\n );\n });\n\n protected keyOf(index: number): string {\n return `p${index}`;\n }\n\n protected readonly legend = computed(() =>\n this.series().map((s, i) => ({ name: s.name, color: this.colors()[i] })),\n );\n\n protected readonly tooltip = computed(() => {\n const key = this.hoverKey();\n if (key == null) return null;\n const idx = Number(key.slice(1));\n const p = this.points()[idx];\n if (!p) return null;\n return {\n left: (p.cx / this.width()) * 100,\n top: (p.cy / this.height()) * 100,\n color: p.color,\n title: p.label ?? p.seriesName,\n x: mkFormatCompact(p.x),\n y: mkFormatCompact(p.y),\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const s = this.series();\n if (!s.length) return 'Scatter chart, no data';\n const total = this.allPoints().length;\n return `Scatter chart of ${s.map((x) => x.name).join(', ')}, ${total} points`;\n });\n\n protected setHover(key: string | null): void {\n this.tapPin.hover(key);\n }\n\n protected pinHover(key: string, event: PointerEvent): void {\n this.tapPin.pin(key, event);\n }\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <!-- Horizontal gridlines + y-axis labels -->\n @for (row of yGrid(); track row.value) {\n @if (showGrid()) {\n <line\n class=\"mk-chart__grid\"\n [attr.x1]=\"row.x1\"\n [attr.x2]=\"row.x2\"\n [attr.y1]=\"row.y\"\n [attr.y2]=\"row.y\"\n />\n }\n <text\n class=\"mk-chart__axis-label mk-chart__axis-label--y\"\n [attr.x]=\"plot().x - 8\"\n [attr.y]=\"row.y\"\n >\n {{ row.label }}\n </text>\n }\n\n <!-- x-axis labels -->\n @for (col of xGrid(); track col.value) {\n <text\n class=\"mk-chart__axis-label mk-chart__axis-label--x\"\n [attr.x]=\"col.x\"\n [attr.y]=\"height() - 12\"\n >\n {{ col.label }}\n </text>\n }\n\n <!-- Axis titles -->\n @if (xLabel()) {\n <text\n class=\"mk-chart__axis-title mk-chart__axis-title--x\"\n [attr.x]=\"plot().x + plot().w / 2\"\n [attr.y]=\"height() - 1\"\n >\n {{ xLabel() }}\n </text>\n }\n @if (yLabel()) {\n <text\n class=\"mk-chart__axis-title mk-chart__axis-title--y\"\n [attr.transform]=\"'rotate(-90 10 ' + (plot().y + plot().h / 2) + ')'\"\n [attr.x]=\"10\"\n [attr.y]=\"plot().y + plot().h / 2\"\n >\n {{ yLabel() }}\n </text>\n }\n\n <!-- Points -->\n @for (p of points(); track $index; let i = $index) {\n <circle\n class=\"mk-chart__point\"\n [class.mk-chart__point--active]=\"hoverKey() === keyOf(i)\"\n [attr.cx]=\"p.cx\"\n [attr.cy]=\"p.cy\"\n [attr.r]=\"p.r\"\n [style.fill]=\"p.color\"\n (pointerenter)=\"setHover(keyOf(i))\"\n (pointerleave)=\"setHover(null)\"\n (pointerdown)=\"pinHover(keyOf(i), $event)\"\n />\n }\n </svg>\n\n @if (tooltip(); as t) {\n <div class=\"mk-chart__tooltip\" [style.left.%]=\"t.left\" [style.top.%]=\"t.top\">\n <span class=\"mk-chart__tooltip-title\">\n <span class=\"mk-chart__swatch\" [style.background]=\"t.color\"></span>\n {{ t.title }}\n </span>\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__tooltip-name\">{{ xLabel() || 'x' }}</span>\n <span class=\"mk-chart__tooltip-value\">{{ t.x }}</span>\n </span>\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__tooltip-name\">{{ yLabel() || 'y' }}</span>\n <span class=\"mk-chart__tooltip-value\">{{ t.y }}</span>\n </span>\n </div>\n }\n</div>\n\n@if (legendVisible()) {\n <ul class=\"mk-chart__legend\">\n @for (item of legend(); track item.name) {\n <li class=\"mk-chart__legend-item\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartSeries }}</th>\n <th scope=\"col\">{{ xLabel() || 'x' }}</th>\n <th scope=\"col\">{{ yLabel() || 'y' }}</th>\n </tr>\n </thead>\n <tbody>\n @for (s of series(); track s.name) {\n @for (p of s.points; track $index) {\n <tr>\n <th scope=\"row\">{{ s.name }}</th>\n <td>{{ p.x }}</td>\n <td>{{ p.y }}</td>\n </tr>\n }\n }\n </tbody>\n</table>\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { mkFormatCompact } from './chart-utils';\n\ninterface HeatCell {\n value: number | null;\n display: string;\n xLabel: string;\n bg: string;\n /** Draw the value with `--mk-text-inverse` (else `--mk-text`). */\n inverse: boolean;\n}\ninterface HeatRow {\n label: string;\n cells: HeatCell[];\n}\n\n/** An sRGB colour as 0–255 channels. */\nexport type MkRgb = readonly [number, number, number];\n\n/** The resolved colours a heatmap picks its cell text against. */\nexport interface MkHeatmapPalette {\n /** The `accent` input, resolved to sRGB. */\n accent: MkRgb;\n /** `--mk-surface-2` — the zero-intensity cell colour. */\n surface: MkRgb;\n /** `--mk-text`. */\n text: MkRgb;\n /** `--mk-text-inverse`. */\n textInverse: MkRgb;\n}\n\n/** Which text token a cell value is drawn with, and the intensity to paint the cell at. */\nexport interface MkHeatmapCellColors {\n /** Accent share of the cell background, 0–1. */\n intensity: number;\n /** `true` → `--mk-text-inverse`, `false` → `--mk-text`. */\n inverse: boolean;\n /** Contrast ratio of the chosen text against the cell background (1–21). */\n contrast: number;\n}\n\n/** WCAG AA minimum contrast for normal text — what cell values are held to. */\nexport const MK_HEATMAP_MIN_CONTRAST = 4.5;\n\n/** WCAG 2.x relative luminance of an sRGB colour. */\nexport function mkRelativeLuminance([r, g, b]: MkRgb): number {\n const lin = (c: number): number => {\n const s = c / 255;\n return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n}\n\n/** WCAG 2.x contrast ratio (1–21) between two colours. */\nexport function mkContrastRatio(a: MkRgb, b: MkRgb): number {\n const la = mkRelativeLuminance(a);\n const lb = mkRelativeLuminance(b);\n const [hi, lo] = la > lb ? [la, lb] : [lb, la];\n return (hi + 0.05) / (lo + 0.05);\n}\n\n/** What `color-mix(in srgb, a t%, b)` yields: a linear blend in gamma-encoded sRGB. */\nexport function mkMixRgb(a: MkRgb, b: MkRgb, t: number): MkRgb {\n const mix = (x: number, y: number): number => Math.round(x * t + y * (1 - t));\n return [mix(a[0], b[0]), mix(a[1], b[1]), mix(a[2], b[2])];\n}\n\n/**\n * Parse a CSS colour as the CSSOM serialises it — `rgb(r, g, b)` /\n * `rgba(r, g, b, a)` — or a `#rgb` / `#rrggbb` literal. `null` for anything\n * else (an unresolved `var()`, `color(...)`, …).\n */\nexport function mkParseRgb(text: string | null | undefined): MkRgb | null {\n const s = (text ?? '').trim();\n const fn = /^rgba?\\(\\s*(\\d+(?:\\.\\d+)?)[\\s,]+(\\d+(?:\\.\\d+)?)[\\s,]+(\\d+(?:\\.\\d+)?)/i.exec(s);\n if (fn) return [Number(fn[1]), Number(fn[2]), Number(fn[3])];\n const hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(s);\n if (!hex) return null;\n const h = hex[1].length === 3 ? [...hex[1]].map((c) => c + c).join('') : hex[1];\n return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];\n}\n\n/** Best of the two text tokens against the cell painted at intensity `t`. */\nfunction pickText(t: number, palette: MkHeatmapPalette): MkHeatmapCellColors {\n const bg = mkMixRgb(palette.accent, palette.surface, t);\n const onText = mkContrastRatio(palette.text, bg);\n const onInverse = mkContrastRatio(palette.textInverse, bg);\n return onInverse > onText\n ? { intensity: t, inverse: true, contrast: onInverse }\n : { intensity: t, inverse: false, contrast: onText };\n}\n\n/**\n * Choose the text token for a cell at intensity `t` (0–1) — light text on\n * dark cells, dark text on light cells, decided by contrast against the\n * actual blend rather than a fixed threshold.\n *\n * Every accent ramp has a crossover band where neither `--mk-text` nor\n * `--mk-text-inverse` reaches 4.5:1 (the cell is mid-luminance). When values\n * are printed in the cells, a cell in that band is painted at the nearest\n * intensity just outside it, so its value stays readable; the shift is a few\n * percent of the ramp and the cell keeps its order relative to its\n * neighbours. Without a resolved palette (server rendering, tests) a plain\n * threshold is used.\n */\nexport function mkHeatmapCellColors(\n t: number,\n palette: MkHeatmapPalette | null,\n showValues: boolean,\n): MkHeatmapCellColors {\n const clamped = Math.max(0, Math.min(1, t));\n if (!palette) return { intensity: clamped, inverse: clamped >= 0.55, contrast: NaN };\n const best = pickText(clamped, palette);\n if (!showValues || best.contrast >= MK_HEATMAP_MIN_CONTRAST) return best;\n // In the crossover band: step outward (down and up alternately, 1 % at a\n // time) to the closest intensity at which one of the tokens passes.\n for (let step = 1; step <= 100; step++) {\n const delta = step / 100;\n for (const candidate of [clamped - delta, clamped + delta]) {\n if (candidate < 0 || candidate > 1) continue;\n const pick = pickText(candidate, palette);\n if (pick.contrast >= MK_HEATMAP_MIN_CONTRAST) return pick;\n }\n }\n return best;\n}\n\n/**\n * Heatmap — a matrix of cells shaded by value intensity, for correlation\n * grids, activity-by-time tables and the like. Rendered as a semantic\n * `<table>` (so it is inherently screen-reader friendly) with cell colours\n * mixed from `accent` over the surface via `color-mix`, so it tracks the theme.\n *\n * Printed values (`showValues`) pick `--mk-text` or `--mk-text-inverse` per\n * cell by contrast against that cell's actual colour, in both themes — see\n * {@link mkHeatmapCellColors}.\n *\n * ```html\n * <mk-heatmap\n * [xLabels]=\"hours\" [yLabels]=\"days\" [data]=\"matrix()\" showValues />\n * ```\n */\n@Component({\n selector: 'mk-heatmap',\n templateUrl: './heatmap.html',\n styleUrl: './heatmap.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-heatmap',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkHeatmap {\n private readonly doc = inject(DOCUMENT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n /** Column labels (x axis). */\n readonly xLabels = input<readonly string[]>([]);\n /** Row labels (y axis). */\n readonly yLabels = input<readonly string[]>([]);\n /** Row-major matrix: `data[row][col]`. Use `null` for a blank cell. */\n readonly data = input<readonly (readonly (number | null)[])[]>([]);\n /** Override the low end of the colour domain (defaults to the data min). */\n readonly min = input<number | null>(null);\n /** Override the high end of the colour domain (defaults to the data max). */\n readonly max = input<number | null>(null);\n /** Base colour mixed over the surface for intensity. */\n readonly accent = input<string>('var(--mk-primary)');\n /** Print each cell's value inside it. */\n readonly showValues = input(false, { transform: booleanAttribute });\n /** Show the min→max colour scale legend. */\n readonly showScale = input(true, { transform: booleanAttribute });\n /** Formatter for cell + legend values. */\n readonly format = input<(value: number) => string>(mkFormatCompact);\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n\n /**\n * The accent and the text/surface tokens resolved through the CSSOM, so\n * each cell can pick a text colour that actually contrasts with its blend.\n * `null` until resolved (server, jsdom) — the cells then fall back to a\n * threshold.\n */\n protected readonly palette = signal<MkHeatmapPalette | null>(null);\n\n /** Bumped when the document theme changes so the palette is re-resolved. */\n private readonly themeTick = signal(0);\n\n constructor() {\n afterRenderEffect(() => {\n this.accent();\n this.themeTick();\n untracked(() => this.palette.set(this.resolvePalette()));\n });\n this.watchTheme();\n }\n\n private readonly domain = computed<[number, number]>(() => {\n const flat = this.data()\n .flat()\n .filter((v): v is number => v != null);\n const lo = this.min() ?? (flat.length ? Math.min(...flat) : 0);\n const hi = this.max() ?? (flat.length ? Math.max(...flat) : 1);\n return [lo, hi];\n });\n\n /** Fraction (0–1) of the domain a value sits at. */\n private ratio(value: number): number {\n const [lo, hi] = this.domain();\n const span = hi - lo || 1;\n return Math.max(0, Math.min(1, (value - lo) / span));\n }\n\n /** The `color-mix()` expression painting a cell at intensity `t`. */\n private cellBackground(t: number): string {\n return `color-mix(in srgb, ${this.accent()} ${Math.round(t * 100)}%, var(--mk-surface-2))`;\n }\n\n protected readonly rows = computed<HeatRow[]>(() => {\n const xs = this.xLabels();\n const ys = this.yLabels();\n const data = this.data();\n const fmt = this.format();\n const palette = this.palette();\n const showValues = this.showValues();\n return ys.map((yLabel, r) => ({\n label: yLabel,\n cells: xs.map((xLabel, c) => {\n const value = data[r]?.[c] ?? null;\n if (value == null) {\n return { value: null, display: '', xLabel, bg: 'transparent', inverse: false };\n }\n const colors = mkHeatmapCellColors(this.ratio(value), palette, showValues);\n return {\n value,\n display: fmt(value),\n xLabel,\n // Mix the accent over the surface; more intense = more accent.\n bg: this.cellBackground(colors.intensity),\n inverse: colors.inverse,\n };\n }),\n }));\n });\n\n /** Legend swatches from 0 → 1 intensity. */\n protected readonly scaleStops = computed(() => {\n const [lo, hi] = this.domain();\n const fmt = this.format();\n return {\n min: fmt(lo),\n max: fmt(hi),\n swatches: [0, 0.25, 0.5, 0.75, 1].map((t) => this.cellBackground(t)),\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const rows = this.yLabels().length;\n const cols = this.xLabels().length;\n return `Heatmap, ${rows} rows by ${cols} columns`;\n });\n\n /**\n * Resolve the accent and the tokens to sRGB through a hidden probe: the\n * probe's computed `color` is what the browser would paint, `var()`s and\n * `color-mix()` included. `null` when the environment cannot resolve them.\n */\n protected resolvePalette(): MkHeatmapPalette | null {\n const win = this.doc.defaultView;\n if (!win?.getComputedStyle) return null;\n const probe = this.doc.createElement('span');\n probe.setAttribute('aria-hidden', 'true');\n probe.style.position = 'absolute';\n probe.style.visibility = 'hidden';\n this.host.appendChild(probe);\n try {\n const read = (expr: string): MkRgb | null => {\n probe.style.color = '';\n probe.style.color = expr;\n return mkParseRgb(win.getComputedStyle(probe).color);\n };\n const accent = read(this.accent());\n const surface = read('var(--mk-surface-2)');\n const text = read('var(--mk-text)');\n const textInverse = read('var(--mk-text-inverse)');\n return accent && surface && text && textInverse\n ? { accent, surface, text, textInverse }\n : null;\n } finally {\n probe.remove();\n }\n }\n\n /**\n * Re-resolve when the theme flips: `data-theme` / class changes on the root\n * element (MkThemeService and most hand-rolled toggles) and the OS scheme.\n */\n private watchTheme(): void {\n const win = this.doc.defaultView;\n const root = this.doc.documentElement;\n if (!win || !root) return;\n const bump = (): void => this.themeTick.update((n) => n + 1);\n const destroyRef = inject(DestroyRef);\n if (typeof win.MutationObserver === 'function') {\n const observer = new win.MutationObserver(bump);\n observer.observe(root, { attributes: true, attributeFilter: ['data-theme', 'class', 'style'] });\n destroyRef.onDestroy(() => observer.disconnect());\n }\n const mql = win.matchMedia?.('(prefers-color-scheme: dark)');\n if (mql?.addEventListener) {\n mql.addEventListener('change', bump);\n destroyRef.onDestroy(() => mql.removeEventListener('change', bump));\n }\n }\n}\n","<!-- Focusable so keyboard users can scroll the overflowing grid (WCAG 2.1.1). -->\n<div\n class=\"mk-chart__frame mk-heatmap__scroll\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"resolvedLabel()\"\n>\n <table class=\"mk-heatmap__grid\">\n <caption class=\"mk-visually-hidden\">{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <td class=\"mk-heatmap__corner\"></td>\n @for (x of xLabels(); track $index) {\n <th scope=\"col\" class=\"mk-heatmap__col-head\">{{ x }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows(); track row.label) {\n <tr>\n <th scope=\"row\" class=\"mk-heatmap__row-head\">{{ row.label }}</th>\n @for (cell of row.cells; track $index) {\n <td\n class=\"mk-heatmap__cell\"\n [class.mk-heatmap__cell--inverse]=\"cell.inverse\"\n [class.mk-heatmap__cell--empty]=\"cell.value === null\"\n [style.background]=\"cell.bg\"\n [attr.title]=\"\n cell.value === null\n ? null\n : row.label + ' · ' + cell.xLabel + ': ' + cell.display\n \"\n >\n @if (cell.value !== null) {\n @if (showValues()) {\n <span class=\"mk-heatmap__value\">{{ cell.display }}</span>\n } @else {\n <!-- Colour must not be the only signal: expose the value to AT. -->\n <span class=\"mk-visually-hidden\">{{ cell.display }}</span>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n</div>\n\n@if (showScale()) {\n <div class=\"mk-heatmap__legend\" aria-hidden=\"true\">\n <span class=\"mk-heatmap__legend-label\">{{ scaleStops().min }}</span>\n <span class=\"mk-heatmap__legend-ramp\">\n @for (sw of scaleStops().swatches; track $index) {\n <span class=\"mk-heatmap__legend-swatch\" [style.background]=\"sw\"></span>\n }\n </span>\n <span class=\"mk-heatmap__legend-label\">{{ scaleStops().max }}</span>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkFormatCompact } from './chart-utils';\n\n/** One day's datum for `mk-calendar-heatmap`. */\nexport interface MkCalendarHeatmapEntry {\n /**\n * The day — a `Date`, or a string. `YYYY-MM-DD` strings are parsed as\n * **local** dates (never UTC-shifted); other strings go through `new Date()`.\n */\n date: Date | string;\n /** The day's value (e.g. an activity count). Multiple entries for the same day are summed. */\n value: number;\n}\n\n/** Payload of `mk-calendar-heatmap`'s `cellClick`. */\nexport interface MkCalendarHeatmapCell {\n /** The clicked day (local midnight). */\n date: Date;\n /** The day's aggregated value (0 when no entry exists). */\n value: number;\n}\n\ninterface DayCell {\n key: string;\n /** `null` for grid padding outside the displayed range. */\n date: Date | null;\n value: number;\n bg: string;\n title: string | null;\n}\ninterface WeekdayRow {\n label: string;\n /** Visually show the label (Mon/Wed/Fri style); hidden rows keep it for SR. */\n showLabel: boolean;\n cells: DayCell[];\n}\ninterface MonthSegment {\n key: string;\n label: string;\n /** Number of week columns the month header spans. */\n span: number;\n}\ninterface Layout {\n rows: WeekdayRow[];\n months: MonthSegment[];\n weekCount: number;\n dayCount: number;\n max: number;\n}\n\n/** Local midnight for `d` (drops the time-of-day). */\nfunction stripTime(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\n/** Parse an entry date; `YYYY-MM-DD` strings become local dates. */\nfunction parseDay(value: Date | string): Date {\n if (value instanceof Date) return stripTime(value);\n const iso = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(value);\n if (iso) return new Date(+iso[1], +iso[2] - 1, +iso[3]);\n return stripTime(new Date(value));\n}\n\nfunction dayKey(d: Date): string {\n return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n}\n\nfunction addDays(d: Date, days: number): Date {\n const next = new Date(d);\n next.setDate(next.getDate() + days);\n return next;\n}\n\n/**\n * Calendar heatmap — a GitHub-style year of daily squares: weeks as columns,\n * weekdays as rows, each day shaded by its value. Rendered as a semantic\n * `<table>` (month headers span their week columns, weekday names are row\n * headers, every cell carries its formatted value for screen readers) with\n * intensities mixed from `color` over the surface via `color-mix`, so it\n * tracks the theme. Values are bucketed linearly against the range maximum\n * into `levels` steps; days with value 0 (or no entry) render transparent.\n *\n * Shows the last 12 months ending today by default; set `year` for a fixed\n * calendar year.\n *\n * ```html\n * <mk-calendar-heatmap\n * [data]=\"contributions\"\n * [year]=\"2026\"\n * (cellClick)=\"openDay($event.date)\"\n * />\n * ```\n */\n@Component({\n selector: 'mk-calendar-heatmap',\n templateUrl: './calendar-heatmap.html',\n styleUrl: './calendar-heatmap.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-calendar-heatmap',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkCalendarHeatmap {\n /** The daily values. Days without an entry count as 0. */\n readonly data = input<readonly MkCalendarHeatmapEntry[]>([]);\n /** Show a fixed calendar year; unset shows the last 12 months ending today. */\n readonly year = input<number | null, number | string | null>(null, {\n transform: (value) => {\n if (value == null || value === '') return null;\n const parsed = numberAttribute(value);\n return Number.isFinite(parsed) ? parsed : null;\n },\n });\n /** First weekday of the columns: 0 = Sunday … 6 = Saturday. */\n readonly firstDayOfWeek = input(1, { transform: numberAttribute });\n /** Base colour mixed over the surface for intensity. */\n readonly color = input<string>('var(--mk-primary)');\n /** Number of intensity buckets in the ramp. */\n readonly levels = input(5, { transform: numberAttribute });\n /** Formatter for each cell's title / screen-reader text (and legend max). */\n readonly format = input<((date: Date, value: number) => string) | null>(null);\n /** Show the less→more colour ramp legend. */\n readonly showScale = input(true, { transform: booleanAttribute });\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n /** Emits the clicked day and its value. */\n readonly cellClick = output<MkCalendarHeatmapCell>();\n\n protected readonly i18n = inject(MK_I18N);\n\n /** Aggregated value per day key (duplicate entries are summed). */\n private readonly values = computed(() => {\n const map = new Map<string, { date: Date; value: number }>();\n for (const entry of this.data()) {\n const date = parseDay(entry.date);\n const key = dayKey(date);\n const previous = map.get(key);\n map.set(key, { date, value: (previous?.value ?? 0) + entry.value });\n }\n return map;\n });\n\n /** Displayed [start, end] range, both at local midnight, inclusive. */\n private readonly range = computed<[Date, Date]>(() => {\n const year = this.year();\n if (year != null) return [new Date(year, 0, 1), new Date(year, 11, 31)];\n const end = stripTime(new Date());\n const start = addDays(\n new Date(end.getFullYear() - 1, end.getMonth(), end.getDate()),\n 1,\n );\n return [start, end];\n });\n\n private readonly sanitizedLevels = computed(() =>\n Math.max(1, Math.round(this.levels()) || 1),\n );\n\n private readonly layout = computed<Layout>(() => {\n const [start, end] = this.range();\n const fdow = ((Math.round(this.firstDayOfWeek()) % 7) + 7) % 7;\n const levels = this.sanitizedLevels();\n const color = this.color();\n const values = this.values();\n const fmt = this.format() ?? this.defaultFormat;\n const names = this.i18n.dateNames;\n\n // Bucket against the maximum value inside the displayed range.\n let max = 0;\n for (const { date, value } of values.values()) {\n if (date >= start && date <= end) max = Math.max(max, value);\n }\n\n const gridStart = addDays(start, -((((start.getDay() - fdow) % 7) + 7) % 7));\n const weeks: DayCell[][] = [];\n const months: MonthSegment[] = [];\n let dayCount = 0;\n\n for (let weekStart = gridStart; weekStart <= end; weekStart = addDays(weekStart, 7)) {\n const week: DayCell[] = [];\n let firstInRange: Date | null = null;\n for (let i = 0; i < 7; i++) {\n const date = addDays(weekStart, i);\n if (date < start || date > end) {\n // Padding before the range start / after its end — blank, silent.\n week.push({\n key: `pad-${dayKey(date)}`,\n date: null,\n value: 0,\n bg: 'transparent',\n title: null,\n });\n continue;\n }\n firstInRange ??= date;\n dayCount++;\n const value = values.get(dayKey(date))?.value ?? 0;\n const level =\n value <= 0 || max <= 0\n ? 0\n : Math.min(levels, Math.max(1, Math.ceil((value / max) * levels)));\n week.push({\n key: dayKey(date),\n date,\n value,\n // Zero / no data stays transparent, like mk-heatmap's null cells.\n bg:\n level === 0\n ? 'transparent'\n : `color-mix(in srgb, ${color} ${Math.round((level / levels) * 100)}%, var(--mk-surface-2))`,\n title: fmt(date, value),\n });\n }\n weeks.push(week);\n\n // A week column belongs to the month of its first in-range day; group\n // consecutive columns of the same month into one spanning header.\n const monthOf = firstInRange ?? weekStart;\n const monthKey = `${monthOf.getFullYear()}-${monthOf.getMonth()}`;\n const last = months[months.length - 1];\n if (last && last.key === monthKey) last.span++;\n else {\n months.push({\n key: monthKey,\n label: names.monthsShort[monthOf.getMonth()] ?? '',\n span: 1,\n });\n }\n }\n\n const rows: WeekdayRow[] = Array.from({ length: 7 }, (_, i) => {\n const weekday = (fdow + i) % 7;\n return {\n label: names.weekdaysShort[weekday] ?? '',\n // Mon/Wed/Fri style regardless of the first day of the week.\n showLabel: weekday % 2 === 1,\n cells: weeks.map((week) => week[i]),\n };\n });\n\n return { rows, months, weekCount: weeks.length, dayCount, max };\n });\n\n protected readonly rows = computed(() => this.layout().rows);\n protected readonly monthSegments = computed(() => this.layout().months);\n\n /** Legend: 0 → max swatches mixed exactly like the cells. */\n protected readonly scaleStops = computed(() => {\n const levels = this.sanitizedLevels();\n const color = this.color();\n return {\n min: '0',\n max: mkFormatCompact(this.layout().max),\n swatches: Array.from(\n { length: levels + 1 },\n (_, i) =>\n `color-mix(in srgb, ${color} ${Math.round((i / levels) * 100)}%, var(--mk-surface-2))`,\n ),\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const { dayCount, weekCount } = this.layout();\n return `Calendar heatmap, ${dayCount} days over ${weekCount} weeks`;\n });\n\n private readonly defaultFormat = (date: Date, value: number): string =>\n `${date.toLocaleDateString()}: ${value}`;\n\n protected onCellClick(cell: DayCell): void {\n if (!cell.date) return;\n this.cellClick.emit({ date: cell.date, value: cell.value });\n }\n}\n","<!-- Focusable so keyboard users can scroll the overflowing grid (WCAG 2.1.1). -->\n<div\n class=\"mk-chart__frame mk-calendar-heatmap__scroll\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"resolvedLabel()\"\n>\n <table class=\"mk-calendar-heatmap__grid\">\n <caption class=\"mk-visually-hidden\">{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <td class=\"mk-calendar-heatmap__corner\"></td>\n @for (month of monthSegments(); track month.key) {\n <th\n scope=\"colgroup\"\n class=\"mk-calendar-heatmap__month\"\n [attr.colspan]=\"month.span\"\n >\n <!-- A 1–2 week segment is narrower than its label: keep the name\n for SR but do not let it stretch the week columns. -->\n <span [class.mk-visually-hidden]=\"month.span < 3\">\n {{ month.label }}\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows(); track row.label) {\n <tr>\n <th scope=\"row\" class=\"mk-calendar-heatmap__row-head\">\n <!-- Every row keeps its name for SR; only Mon/Wed/Fri-style rows show it. -->\n <span [class.mk-visually-hidden]=\"!row.showLabel\">{{ row.label }}</span>\n </th>\n @for (cell of row.cells; track cell.key) {\n @if (cell.date) {\n <td\n class=\"mk-calendar-heatmap__cell\"\n [class.mk-calendar-heatmap__cell--empty]=\"cell.value <= 0\"\n [style.background]=\"cell.bg\"\n [attr.title]=\"cell.title\"\n (click)=\"onCellClick(cell)\"\n >\n <!-- Colour must not be the only signal: expose the value to AT. -->\n <span class=\"mk-visually-hidden\">{{ cell.title }}</span>\n </td>\n } @else {\n <td\n class=\"mk-calendar-heatmap__cell mk-calendar-heatmap__cell--blank\"\n ></td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n</div>\n\n@if (showScale()) {\n <div class=\"mk-calendar-heatmap__legend\" aria-hidden=\"true\">\n <span class=\"mk-calendar-heatmap__legend-label\">{{ scaleStops().min }}</span>\n <span class=\"mk-calendar-heatmap__legend-ramp\">\n @for (swatch of scaleStops().swatches; track $index) {\n <span\n class=\"mk-calendar-heatmap__legend-swatch\"\n [style.background]=\"swatch\"\n ></span>\n }\n </span>\n <span class=\"mk-calendar-heatmap__legend-label\">{{ scaleStops().max }}</span>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport {\n MkChartSeries,\n mkChartColor,\n mkFormatCompact,\n mkNiceTicks,\n} from './chart-utils';\n\ninterface RadarPoint {\n x: number;\n y: number;\n}\ninterface RadarSeries {\n name: string;\n color: string;\n polygon: string;\n points: RadarPoint[];\n}\ninterface RadarAxis {\n label: string;\n x: number;\n y: number;\n lx: number;\n ly: number;\n anchor: 'start' | 'middle' | 'end';\n}\n\n/**\n * RadarChart — a radar / spider chart comparing several series across the same\n * set of axes (skills, product profiles, survey dimensions). Dependency-free\n * SVG on the validated `--mk-chart-*` palette; ships concentric grid rings, a\n * legend for ≥ 2 series and a screen-reader data table.\n *\n * ```html\n * <mk-radar-chart\n * [axes]=\"['Speed','Power','Range','Cost','Ease']\"\n * [series]=\"[{ name: 'Model A', data: [8,6,7,5,9] }]\" />\n * ```\n */\n@Component({\n selector: 'mk-radar-chart',\n templateUrl: './radar-chart.html',\n styleUrl: './charts.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-radar-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkRadarChart {\n protected readonly i18n = inject(MK_I18N);\n\n /** Axis labels (one spoke each). Series data align to this order. */\n readonly axes = input<readonly string[]>([]);\n /** One or more series (values align to `axes`). */\n readonly series = input<readonly MkChartSeries[]>([]);\n /** Domain maximum (defaults to a nice value above the data max). */\n readonly max = input<number | null>(null);\n /** Number of concentric grid rings. */\n readonly levels = input(4, { transform: numberAttribute });\n /** Intrinsic width (viewBox units; the SVG scales to its container). */\n readonly width = input(360, { transform: numberAttribute });\n /** Intrinsic height. */\n readonly height = input(360, { transform: numberAttribute });\n /** Draw a dot at each vertex. */\n readonly showDots = input(true, { transform: booleanAttribute });\n /** Force the legend on/off (defaults to on when there are ≥ 2 series). */\n readonly showLegend = input<boolean | undefined>(undefined);\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n\n private readonly cx = computed(() => this.width() / 2);\n private readonly cy = computed(() => this.height() / 2);\n private readonly radius = computed(\n () => Math.min(this.width(), this.height()) / 2 - 44,\n );\n\n protected readonly colors = computed(() =>\n this.series().map((s, i) => s.color ?? mkChartColor(i)),\n );\n protected readonly legendVisible = computed(\n () => this.showLegend() ?? this.series().length > 1,\n );\n\n private readonly domainMax = computed(() => {\n const explicit = this.max();\n if (explicit != null) return explicit;\n const values = this.series().flatMap((s) => s.data);\n const hi = values.length ? Math.max(...values) : 1;\n const ticks = mkNiceTicks(0, hi, this.levels());\n return ticks[ticks.length - 1] || 1;\n });\n\n /** Angle (radians) of axis `i`, starting at the top and going clockwise. */\n private angleAt(i: number): number {\n const n = Math.max(this.axes().length, 1);\n return -Math.PI / 2 + (i * 2 * Math.PI) / n;\n }\n\n private pointAt(i: number, value: number): RadarPoint {\n const t = this.domainMax() ? value / this.domainMax() : 0;\n const a = this.angleAt(i);\n return {\n x: this.cx() + Math.cos(a) * this.radius() * t,\n y: this.cy() + Math.sin(a) * this.radius() * t,\n };\n }\n\n /** Concentric grid ring polygons (outer → inner). */\n protected readonly rings = computed(() => {\n const levels = Math.max(this.levels(), 1);\n const n = this.axes().length;\n return Array.from({ length: levels }, (_, l) => {\n const t = (levels - l) / levels;\n const pts = Array.from({ length: n }, (_, i) => {\n const a = this.angleAt(i);\n return `${this.cx() + Math.cos(a) * this.radius() * t},${\n this.cy() + Math.sin(a) * this.radius() * t\n }`;\n });\n return { key: l, points: pts.join(' ') };\n });\n });\n\n /** Axis spokes + outer labels. */\n protected readonly axisSpokes = computed<RadarAxis[]>(() =>\n this.axes().map((label, i) => {\n const a = this.angleAt(i);\n const ex = this.cx() + Math.cos(a) * this.radius();\n const ey = this.cy() + Math.sin(a) * this.radius();\n const lx = this.cx() + Math.cos(a) * (this.radius() + 16);\n const ly = this.cy() + Math.sin(a) * (this.radius() + 16);\n const cos = Math.cos(a);\n const anchor = cos > 0.3 ? 'start' : cos < -0.3 ? 'end' : 'middle';\n return { label, x: ex, y: ey, lx, ly, anchor };\n }),\n );\n\n /** Per-series polygon + vertex geometry. */\n protected readonly rendered = computed<RadarSeries[]>(() =>\n this.series().map((s, si) => {\n const points = this.axes().map((_, i) => this.pointAt(i, s.data[i] ?? 0));\n return {\n name: s.name,\n color: this.colors()[si],\n polygon: points.map((p) => `${p.x},${p.y}`).join(' '),\n points,\n };\n }),\n );\n\n protected readonly legend = computed(() =>\n this.series().map((s, i) => ({ name: s.name, color: this.colors()[i] })),\n );\n\n protected readonly ringMax = computed(() => mkFormatCompact(this.domainMax()));\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const s = this.series();\n if (!s.length) return 'Radar chart, no data';\n return `Radar chart of ${s.map((x) => x.name).join(', ')} across ${this.axes().length} axes`;\n });\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <!-- Grid rings -->\n @for (ring of rings(); track ring.key) {\n <polygon class=\"mk-chart__grid mk-radar__ring\" [attr.points]=\"ring.points\" />\n }\n\n <!-- Axis spokes + labels -->\n @for (axis of axisSpokes(); track axis.label) {\n <line\n class=\"mk-chart__grid\"\n [attr.x1]=\"width() / 2\"\n [attr.y1]=\"height() / 2\"\n [attr.x2]=\"axis.x\"\n [attr.y2]=\"axis.y\"\n />\n <text\n class=\"mk-chart__axis-label mk-radar__axis-label\"\n [attr.x]=\"axis.lx\"\n [attr.y]=\"axis.ly\"\n [attr.text-anchor]=\"axis.anchor\"\n >\n {{ axis.label }}\n </text>\n }\n\n <!-- Series polygons -->\n @for (r of rendered(); track r.name) {\n <polygon\n class=\"mk-radar__area\"\n [attr.points]=\"r.polygon\"\n [style.fill]=\"r.color\"\n [style.stroke]=\"r.color\"\n />\n @if (showDots()) {\n @for (p of r.points; track $index) {\n <circle\n class=\"mk-chart__dot\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"3\"\n [style.fill]=\"r.color\"\n />\n }\n }\n }\n </svg>\n</div>\n\n@if (legendVisible()) {\n <ul class=\"mk-chart__legend\">\n @for (item of legend(); track item.name) {\n <li class=\"mk-chart__legend-item\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartAxis }}</th>\n @for (s of series(); track s.name) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (axis of axes(); track axis; let a = $index) {\n <tr>\n <th scope=\"row\">{{ axis }}</th>\n @for (s of series(); track s.name) {\n <td>{{ s.data[a] }}</td>\n }\n </tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartColor, mkFormatCompact } from './chart-utils';\n\n/** A single stage of the funnel (ordered largest → smallest conceptually). */\nexport interface MkFunnelSegment {\n /** Stage label (e.g. \"Visits\"). */\n label: string;\n /** Stage value; drives the band width. */\n value: number;\n /** Optional explicit colour; defaults to the palette by index. */\n color?: string;\n}\n\ninterface FunnelBand {\n label: string;\n value: number;\n valueLabel: string;\n /** Conversion relative to the first (top) segment, as a percentage. */\n percent: number;\n percentLabel: string;\n color: string;\n topWidth: number;\n bottomWidth: number;\n polygon: string;\n labelX: number;\n labelY: number;\n subY: number;\n}\n\nconst MARGIN = { top: 10, right: 12, bottom: 10, left: 12 };\n\n/**\n * FunnelChart — decreasing stacked trapezoids visualising conversion through a\n * sequence of stages. Each band's top width tracks its own value and its bottom\n * width tracks the next stage's value, so consecutive bands connect into a\n * funnel. Dependency-free SVG on the validated `--mk-chart-*` palette; each band\n * is labelled with its value and its conversion relative to the top stage, and a\n * screen-reader table mirrors the data.\n *\n * ```html\n * <mk-funnel-chart\n * [segments]=\"[\n * { label: 'Visits', value: 1000 },\n * { label: 'Signups', value: 400 },\n * { label: 'Paid', value: 120 },\n * ]\" />\n * ```\n */\n@Component({\n selector: 'mk-funnel-chart',\n templateUrl: './funnel-chart.html',\n styleUrl: './funnel-chart.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-funnel-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkFunnelChart {\n protected readonly i18n = inject(MK_I18N);\n\n /** The funnel stages, ordered largest → smallest conceptually. */\n readonly segments = input<readonly MkFunnelSegment[]>([]);\n /** Intrinsic width (viewBox units; the SVG scales to its container). */\n readonly width = input(420, { transform: numberAttribute });\n /** Intrinsic height. */\n readonly height = input(300, { transform: numberAttribute });\n /** Force the legend on/off (funnels label each band, so off by default). */\n readonly showLegend = input<boolean | undefined>(undefined);\n /** Render the value + conversion text on each band. */\n readonly showValues = input(true, { transform: booleanAttribute });\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n\n protected readonly plot = computed(() => ({\n x: MARGIN.left,\n y: MARGIN.top,\n w: Math.max(this.width() - MARGIN.left - MARGIN.right, 1),\n h: Math.max(this.height() - MARGIN.top - MARGIN.bottom, 1),\n }));\n\n protected readonly legendVisible = computed(() => this.showLegend() ?? false);\n\n private readonly maxValue = computed(() =>\n Math.max(1, ...this.segments().map((s) => Math.max(s.value, 0))),\n );\n\n private readonly topValue = computed(() => this.segments()[0]?.value ?? 0);\n\n /** One trapezoid per stage, stacked top → bottom. */\n protected readonly bands = computed<FunnelBand[]>(() => {\n const segments = this.segments();\n const n = segments.length;\n if (!n) return [];\n const { x, y, w, h } = this.plot();\n const max = this.maxValue();\n const top = this.topValue() || 1;\n const bandH = h / n;\n const centerX = x + w / 2;\n\n return segments.map((seg, i) => {\n const topVal = Math.max(seg.value, 0);\n // Bottom edge follows the next stage; the last band closes to itself.\n const bottomVal = Math.max(segments[i + 1]?.value ?? seg.value, 0);\n const topWidth = (topVal / max) * w;\n const bottomWidth = (bottomVal / max) * w;\n const yTop = y + i * bandH;\n const yBottom = yTop + bandH;\n const tl = centerX - topWidth / 2;\n const tr = centerX + topWidth / 2;\n const bl = centerX - bottomWidth / 2;\n const br = centerX + bottomWidth / 2;\n const percent = (seg.value / top) * 100;\n return {\n label: seg.label,\n value: seg.value,\n valueLabel: mkFormatCompact(seg.value),\n percent,\n percentLabel: `${Math.round(percent)}% of top`,\n color: seg.color ?? mkChartColor(i),\n topWidth,\n bottomWidth,\n polygon: `${tl},${yTop} ${tr},${yTop} ${br},${yBottom} ${bl},${yBottom}`,\n labelX: centerX,\n labelY: yTop + bandH / 2 - 4,\n subY: yTop + bandH / 2 + 12,\n };\n });\n });\n\n protected readonly legend = computed(() =>\n this.segments().map((s, i) => ({\n name: s.label,\n color: s.color ?? mkChartColor(i),\n })),\n );\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const segments = this.segments();\n if (!segments.length) return 'Funnel chart, no data';\n return `Funnel chart of ${segments.length} stages from ${segments[0].label} to ${segments[segments.length - 1].label}`;\n });\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <!-- Funnel bands (decreasing trapezoids) -->\n @for (band of bands(); track band.label) {\n <polygon\n class=\"mk-funnel-chart__band\"\n [attr.points]=\"band.polygon\"\n [style.fill]=\"band.color\"\n />\n }\n\n <!-- Band labels + conversion -->\n @if (showValues()) {\n @for (band of bands(); track band.label) {\n <text\n class=\"mk-funnel-chart__label\"\n [attr.x]=\"band.labelX\"\n [attr.y]=\"band.labelY\"\n >\n {{ band.label }}\n </text>\n <text\n class=\"mk-funnel-chart__sublabel\"\n [attr.x]=\"band.labelX\"\n [attr.y]=\"band.subY\"\n >\n {{ band.valueLabel }} · {{ band.percentLabel }}\n </text>\n }\n }\n </svg>\n</div>\n\n@if (legendVisible()) {\n <ul class=\"mk-chart__legend\">\n @for (item of legend(); track item.name) {\n <li class=\"mk-chart__legend-item\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartStage }}</th>\n <th scope=\"col\">{{ i18n.chartValue }}</th>\n <th scope=\"col\">{{ i18n.chartConversion }}</th>\n </tr>\n </thead>\n <tbody>\n @for (band of bands(); track band.label) {\n <tr>\n <th scope=\"row\">{{ band.label }}</th>\n <td>{{ band.valueLabel }}</td>\n <td>{{ band.percentLabel }}</td>\n </tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartTapPin } from './chart-tap-pin';\nimport { mkChartColor, mkFormatCompact } from './chart-utils';\n\n/** A single treemap tile: a labelled rectangle sized by `value`. */\nexport interface MkTreemapItem {\n /** Tile label (identity — shown on the tile when it fits, and in the tooltip). */\n label: string;\n /** Positive magnitude driving the tile's area. */\n value: number;\n /** Optional explicit colour; defaults to the validated palette by index. */\n color?: string;\n}\n\n/** A positioned tile in SVG user space, tagged with its source `index`. */\nexport interface MkTreemapRect {\n x: number;\n y: number;\n w: number;\n h: number;\n index: number;\n}\n\n/**\n * Worst (largest) aspect ratio produced by laying `areas` as one strip along a\n * side of length `side` — the squarify quality metric (Bruls/Huizing/van Wijk).\n */\nfunction worstRatio(areas: readonly number[], side: number): number {\n let sum = 0;\n let rmax = -Infinity;\n let rmin = Infinity;\n for (const a of areas) {\n sum += a;\n if (a > rmax) rmax = a;\n if (a < rmin) rmin = a;\n }\n if (areas.length === 0 || sum <= 0 || side <= 0) return Infinity;\n const s2 = sum * sum;\n const w2 = side * side;\n return Math.max((w2 * rmax) / s2, s2 / (w2 * rmin));\n}\n\n/**\n * Squarified treemap layout — pack `items` into the rectangle `(x, y, w, h)` as\n * nested tiles whose areas are proportional to `value`, greedily building rows\n * along the shorter side so tiles stay close to square. Returns exactly one\n * rect per input item, tagged with its original `index` (so callers can render\n * in input order). Framework-agnostic and pure.\n */\nexport function mkSquarify(\n items: readonly { value: number }[],\n x: number,\n y: number,\n w: number,\n h: number,\n): MkTreemapRect[] {\n const n = items.length;\n const result: MkTreemapRect[] = new Array(n);\n if (n === 0) return result;\n\n // Largest first, remembering where each came from; clamp negatives to 0.\n const nodes = items\n .map((it, index) => ({ value: Math.max(it.value, 0), index }))\n .sort((a, b) => b.value - a.value);\n\n const totalValue = nodes.reduce((s, node) => s + node.value, 0);\n const scale = totalValue > 0 ? (w * h) / totalValue : 0;\n const areas = nodes.map((node) => node.value * scale);\n\n // The remaining free rectangle we keep carving strips off.\n let rx = x;\n let ry = y;\n let rw = w;\n let rh = h;\n\n let i = 0;\n while (i < n) {\n const shortSide = Math.min(rw, rh);\n\n // Grow the current row while the worst aspect ratio keeps improving.\n const row: number[] = [];\n let j = i;\n while (j < n) {\n const candidate = row.concat(j).map((k) => areas[k]);\n const current = row.map((k) => areas[k]);\n if (row.length === 0 || worstRatio(candidate, shortSide) <= worstRatio(current, shortSide)) {\n row.push(j);\n j++;\n } else {\n break;\n }\n }\n\n const rowSum = row.reduce((s, k) => s + areas[k], 0);\n const thickness = shortSide > 0 ? rowSum / shortSide : 0;\n\n if (rw >= rh) {\n // Wider than tall: lay the row as a column of width `thickness`.\n let offset = ry;\n for (const k of row) {\n const cellH = rowSum > 0 ? (areas[k] / rowSum) * rh : 0;\n result[nodes[k].index] = {\n x: rx,\n y: offset,\n w: thickness,\n h: cellH,\n index: nodes[k].index,\n };\n offset += cellH;\n }\n rx += thickness;\n rw -= thickness;\n } else {\n // Taller than wide: lay the row as a band of height `thickness`.\n let offset = rx;\n for (const k of row) {\n const cellW = rowSum > 0 ? (areas[k] / rowSum) * rw : 0;\n result[nodes[k].index] = {\n x: offset,\n y: ry,\n w: cellW,\n h: thickness,\n index: nodes[k].index,\n };\n offset += cellW;\n }\n ry += thickness;\n rh -= thickness;\n }\n\n i = j;\n }\n\n return result;\n}\n\n/** Minimum tile size (px) before we bother drawing text on it. */\nconst MIN_TEXT_W = 40;\nconst MIN_TEXT_H = 24;\n\ninterface RenderedTile {\n x: number;\n y: number;\n w: number;\n h: number;\n color: string;\n label: string;\n value: number;\n valueText: string;\n pct: string;\n showText: boolean;\n showValue: boolean;\n clipId: string;\n cx: number;\n cy: number;\n index: number;\n}\n\n/**\n * Treemap — nested rectangles sized by value, using a squarified layout that\n * keeps tiles close to square. Dependency-free SVG on the validated\n * `--mk-chart-*` palette; ships in-tile labels (hidden when a tile is too\n * small), a hover tooltip with the share of total, and a screen-reader table.\n *\n * ```html\n * <mk-treemap [items]=\"[{ label: 'Ads', value: 40 }, { label: 'SEO', value: 25 }]\" />\n * ```\n */\n@Component({\n selector: 'mk-treemap',\n templateUrl: './treemap.html',\n styleUrl: './treemap.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-treemap',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkTreemap {\n protected readonly i18n = inject(MK_I18N);\n\n /** The tiles to pack, largest first (order-independent — sorted internally). */\n readonly items = input<readonly MkTreemapItem[]>([]);\n /** Intrinsic width (viewBox units; the SVG scales to its container). */\n readonly width = input(480, { transform: numberAttribute });\n /** Intrinsic height. */\n readonly height = input(320, { transform: numberAttribute });\n /** Draw each tile's value beneath its label when the tile is tall enough. */\n readonly showValues = input(true, { transform: booleanAttribute });\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n\n protected readonly hoverKey = signal<string | null>(null);\n /** Tap-to-pin: a touch tap on a tile pins the tooltip until a tap lands\n * outside the chart (mouse hover in/out is unaffected). */\n private readonly tapPin = mkChartTapPin<string>((k) => this.hoverKey.set(k));\n\n protected readonly total = computed(() =>\n this.items().reduce((s, it) => s + Math.max(it.value, 0), 0),\n );\n\n /** Every tile positioned and decorated for rendering (in input order). */\n protected readonly tiles = computed<RenderedTile[]>(() => {\n const items = this.items();\n const rects = mkSquarify(items, 0, 0, this.width(), this.height());\n const total = this.total();\n return items.map((it, i) => {\n const r = rects[i];\n const showText = r.w >= MIN_TEXT_W && r.h >= MIN_TEXT_H;\n const pct = total > 0 ? (Math.max(it.value, 0) / total) * 100 : 0;\n return {\n x: r.x,\n y: r.y,\n w: r.w,\n h: r.h,\n color: it.color ?? mkChartColor(i),\n label: it.label,\n value: it.value,\n valueText: mkFormatCompact(it.value),\n pct: `${pct.toFixed(1)}%`,\n showText,\n showValue: showText && this.showValues() && r.h >= MIN_TEXT_H + 16,\n clipId: `mk-treemap-clip-${i}`,\n cx: r.x + r.w / 2,\n cy: r.y + r.h / 2,\n index: i,\n };\n });\n });\n\n protected keyOf(index: number): string {\n return `t${index}`;\n }\n\n /** Rounded share of the total (e.g. `42%`) for the screen-reader table. */\n protected shareOf(value: number): string {\n const total = this.total();\n return `${total > 0 ? Math.round((Math.max(value, 0) / total) * 100) : 0}%`;\n }\n\n protected readonly tooltip = computed(() => {\n const key = this.hoverKey();\n if (key == null) return null;\n const tile = this.tiles()[Number(key.slice(1))];\n if (!tile) return null;\n return {\n left: (tile.cx / this.width()) * 100,\n top: (tile.cy / this.height()) * 100,\n color: tile.color,\n title: tile.label,\n value: tile.valueText,\n pct: tile.pct,\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const items = this.items();\n if (!items.length) return 'Treemap, no data';\n return `Treemap of ${items.length} items: ${items.map((it) => it.label).join(', ')}`;\n });\n\n protected setHover(key: string | null): void {\n this.tapPin.hover(key);\n }\n\n protected pinHover(key: string, event: PointerEvent): void {\n this.tapPin.pin(key, event);\n }\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg mk-treemap__svg\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <defs>\n @for (tile of tiles(); track tile.index) {\n <clipPath [attr.id]=\"tile.clipId\">\n <rect\n [attr.x]=\"tile.x\"\n [attr.y]=\"tile.y\"\n [attr.width]=\"tile.w\"\n [attr.height]=\"tile.h\"\n />\n </clipPath>\n }\n </defs>\n\n @for (tile of tiles(); track tile.index; let i = $index) {\n <g\n class=\"mk-treemap__tile\"\n [class.mk-treemap__tile--active]=\"hoverKey() === keyOf(i)\"\n (pointerenter)=\"setHover(keyOf(i))\"\n (pointerleave)=\"setHover(null)\"\n (pointerdown)=\"pinHover(keyOf(i), $event)\"\n >\n <rect\n class=\"mk-treemap__rect\"\n [attr.x]=\"tile.x\"\n [attr.y]=\"tile.y\"\n [attr.width]=\"tile.w\"\n [attr.height]=\"tile.h\"\n [style.fill]=\"tile.color\"\n />\n @if (tile.showText) {\n <text\n class=\"mk-treemap__label\"\n [attr.clip-path]=\"'url(#' + tile.clipId + ')'\"\n [attr.x]=\"tile.x + 6\"\n [attr.y]=\"tile.y + 16\"\n >\n {{ tile.label }}\n </text>\n @if (tile.showValue) {\n <text\n class=\"mk-treemap__value\"\n [attr.clip-path]=\"'url(#' + tile.clipId + ')'\"\n [attr.x]=\"tile.x + 6\"\n [attr.y]=\"tile.y + 30\"\n >\n {{ tile.valueText }}\n </text>\n }\n }\n </g>\n }\n </svg>\n\n @if (tooltip(); as t) {\n <div class=\"mk-chart__tooltip\" [style.left.%]=\"t.left\" [style.top.%]=\"t.top\">\n <span class=\"mk-chart__tooltip-title\">\n <span class=\"mk-chart__swatch\" [style.background]=\"t.color\"></span>\n {{ t.title }}\n </span>\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__tooltip-name\">{{ i18n.chartValue }}</span>\n <span class=\"mk-chart__tooltip-value\">{{ t.value }}</span>\n </span>\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__tooltip-name\">{{ i18n.chartShare }}</span>\n <span class=\"mk-chart__tooltip-value\">{{ t.pct }}</span>\n </span>\n </div>\n }\n</div>\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartLabel }}</th>\n <th scope=\"col\">{{ i18n.chartValue }}</th>\n <th scope=\"col\">{{ i18n.chartShare }}</th>\n </tr>\n </thead>\n <tbody>\n @for (item of items(); track $index) {\n <tr>\n <th scope=\"row\">{{ item.label }}</th>\n <td>{{ item.value }}</td>\n <td>{{ shareOf(item.value) }}</td>\n </tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\n\n/** Placeholder geometry for a {@link MkSkeleton}. */\nexport type MkSkeletonShape = 'text' | 'rect' | 'circle';\n\n/**\n * Skeleton — a shimmering placeholder shown while content loads. It is\n * `aria-hidden`; mark the surrounding region `aria-busy=\"true\"` so assistive\n * tech knows content is pending. The shimmer stops under\n * `prefers-reduced-motion`.\n *\n * ```html\n * <mk-skeleton shape=\"circle\" [width]=\"40\" [height]=\"40\" />\n * <mk-skeleton shape=\"text\" [lines]=\"3\" />\n * <mk-skeleton shape=\"rect\" width=\"100%\" [height]=\"180\" />\n * ```\n */\n@Component({\n selector: 'mk-skeleton',\n templateUrl: './skeleton.html',\n styleUrl: './skeleton.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-skeleton',\n 'aria-hidden': 'true',\n '[class.mk-skeleton--text]': \"shape() === 'text'\",\n '[class.mk-skeleton--rect]': \"shape() === 'rect'\",\n '[class.mk-skeleton--circle]': \"shape() === 'circle'\",\n '[style.width]': 'styleWidth()',\n '[style.height]': 'styleHeight()',\n },\n})\nexport class MkSkeleton {\n /** Placeholder geometry. */\n readonly shape = input<MkSkeletonShape>('text');\n /** Width — a number (px) or any CSS length/percentage string. */\n readonly width = input<string | number>();\n /** Height — a number (px) or any CSS length/percentage string. */\n readonly height = input<string | number>();\n /** Number of lines to render for `shape=\"text\"`. */\n readonly lines = input(1, { transform: numberAttribute });\n\n private toCss(v: string | number | undefined): string | null {\n if (v === undefined || v === null || v === '') return null;\n return typeof v === 'number' ? `${v}px` : v;\n }\n\n protected readonly styleWidth = computed(() => {\n if (this.shape() === 'circle') {\n return this.toCss(this.width() ?? this.height()) ?? '2.5rem';\n }\n return this.toCss(this.width()) ?? '100%';\n });\n\n protected readonly styleHeight = computed(() => {\n if (this.shape() === 'circle') {\n return this.toCss(this.height() ?? this.width()) ?? '2.5rem';\n }\n if (this.shape() === 'text') return null; // lines define the height\n return this.toCss(this.height()) ?? '1rem';\n });\n\n /** Line index array for the text variant (at least one line). */\n protected readonly lineArray = computed(() =>\n Array.from({ length: Math.max(1, this.lines()) }),\n );\n\n /** Last line of a multi-line block is shortened for a natural look. */\n protected lineWidth(index: number): string {\n const count = this.lineArray().length;\n return count > 1 && index === count - 1 ? '60%' : '100%';\n }\n}\n","@if (shape() === 'text') {\n @for (line of lineArray(); track $index) {\n <span class=\"mk-skeleton__line\" [style.width]=\"lineWidth($index)\"></span>\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkSkeleton } from './skeleton';\n\n/** Ready-made loading layouts for {@link MkSkeletonPreset}. */\nexport type MkSkeletonPresetKind = 'paragraph' | 'card' | 'list' | 'table';\n\n/**\n * SkeletonPreset — composite loading placeholders assembled from\n * {@link MkSkeleton}: a `paragraph`, a media `card`, an avatar `list` or a\n * `table`. Announces \"Loading\" to assistive tech; swap it for real content once\n * loaded.\n *\n * ```html\n * <mk-skeleton-preset preset=\"card\" />\n * <mk-skeleton-preset preset=\"list\" [rows]=\"5\" />\n * <mk-skeleton-preset preset=\"table\" [rows]=\"4\" [columns]=\"5\" />\n * ```\n */\n@Component({\n selector: 'mk-skeleton-preset',\n templateUrl: './skeleton-preset.html',\n styleUrl: './skeleton-preset.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkSkeleton],\n host: {\n class: 'mk-skeleton-preset',\n role: 'status',\n 'aria-busy': 'true',\n '[attr.aria-label]': 'loadingLabel()',\n '[attr.data-preset]': 'preset()',\n },\n})\nexport class MkSkeletonPreset {\n protected readonly i18n = inject(MK_I18N);\n\n /** Which layout to render. */\n readonly preset = input<MkSkeletonPresetKind>('paragraph');\n /** Number of rows (paragraph lines / list items / table body rows). */\n readonly rows = input(3, { transform: numberAttribute });\n /** Number of columns (table only). */\n readonly columns = input(4, { transform: numberAttribute });\n /** Accessible loading label. */\n readonly loadingLabel = input(this.i18n.loading);\n\n protected readonly rowRange = computed(() =>\n Array.from({ length: Math.max(1, this.rows()) }, (_, i) => i),\n );\n protected readonly colRange = computed(() =>\n Array.from({ length: Math.max(1, this.columns()) }, (_, i) => i),\n );\n}\n","@switch (preset()) {\n @case ('card') {\n <mk-skeleton shape=\"rect\" width=\"100%\" [height]=\"150\" />\n <mk-skeleton shape=\"rect\" width=\"60%\" [height]=\"18\" />\n <mk-skeleton shape=\"text\" [lines]=\"2\" />\n }\n @case ('list') {\n @for (r of rowRange(); track r) {\n <div class=\"mk-skeleton-preset__row\">\n <mk-skeleton shape=\"circle\" [width]=\"40\" [height]=\"40\" />\n <div class=\"mk-skeleton-preset__lines\">\n <mk-skeleton shape=\"rect\" width=\"40%\" [height]=\"13\" />\n <mk-skeleton shape=\"rect\" width=\"72%\" [height]=\"11\" />\n </div>\n </div>\n }\n }\n @case ('table') {\n <div class=\"mk-skeleton-preset__thead\" [style.grid-template-columns]=\"'repeat(' + colRange().length + ', 1fr)'\">\n @for (c of colRange(); track c) {\n <mk-skeleton shape=\"rect\" width=\"70%\" [height]=\"13\" />\n }\n </div>\n @for (r of rowRange(); track r) {\n <div class=\"mk-skeleton-preset__trow\" [style.grid-template-columns]=\"'repeat(' + colRange().length + ', 1fr)'\">\n @for (c of colRange(); track c) {\n <mk-skeleton shape=\"rect\" width=\"85%\" [height]=\"11\" />\n }\n </div>\n }\n }\n @default {\n <mk-skeleton shape=\"rect\" width=\"45%\" [height]=\"18\" />\n <mk-skeleton shape=\"text\" [lines]=\"rows()\" />\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n afterNextRender,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { MkSize } from '@mk-kit/ui/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkFieldContext } from '@mk-kit/ui/core';\nimport { mkInjectFieldTouched } from '@mk-kit/ui/core/signal-forms';\n\n/**\n * InlineEdit — click a piece of text to edit it in place. The display is a\n * button that swaps to an input on click (or Enter/Space); Enter or blur saves,\n * Escape reverts. Ideal for editable labels in tables and detail panels.\n * Implements `ControlValueAccessor` + a two-way `value` model of `string`.\n *\n * ```html\n * <mk-inline-edit [(value)]=\"title\" placeholder=\"Untitled\" />\n * <mk-inline-edit multiline [(value)]=\"notes\" />\n * ```\n */\n@Component({\n selector: 'mk-inline-edit',\n templateUrl: './inline-edit.html',\n styleUrl: './inline-edit.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-inline-edit',\n '[class.mk-inline-edit--sm]': \"effectiveSize() === 'sm'\",\n '[class.mk-inline-edit--lg]': \"effectiveSize() === 'lg'\",\n '[class.mk-inline-edit--editing]': 'editing()',\n '[class.mk-inline-edit--invalid]': 'isInvalid()',\n '[class.mk-inline-edit--disabled]': 'isDisabled()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MkInlineEdit),\n multi: true,\n },\n ],\n})\nexport class MkInlineEdit implements ControlValueAccessor {\n private readonly injector = inject(Injector);\n private readonly field = inject(MkFieldContext, { optional: true });\n /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */\n private readonly fieldTouched = mkInjectFieldTouched();\n protected readonly i18n = inject(MK_I18N);\n private readonly displayRef =\n viewChild<ElementRef<HTMLButtonElement>>('display');\n private readonly inputRef =\n viewChild<ElementRef<HTMLInputElement | HTMLTextAreaElement>>('input');\n\n /** Two-way edited value. */\n readonly value = model<string>('');\n /** Shown (muted) when the value is empty. */\n readonly placeholder = input(this.i18n.empty);\n /** Use a multi-line textarea; Enter inserts a newline, blur/✓ saves. */\n readonly multiline = input(false, { transform: booleanAttribute });\n /** Save when the field loses focus (otherwise blur cancels). */\n readonly saveOnBlur = input(true, { transform: booleanAttribute });\n /** Accessible label for the edit trigger + field. */\n readonly ariaLabel = input(this.i18n.edit);\n /** Disable editing. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Force the invalid visual + `aria-invalid` when used standalone. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Control size. Ignored when nested in an `mk-form-field`. */\n readonly size = input<MkSize>('md');\n\n /** Emitted with the new value when an edit is saved. */\n readonly saved = output<string>();\n /** Emitted when an edit is cancelled. */\n readonly cancelled = output<void>();\n\n protected readonly editing = signal(false);\n protected readonly draft = signal('');\n private readonly cvaDisabled = signal(false);\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n readonly fieldId = this.field?.controlId ?? mkUniqueId('mk-inline-edit');\n\n protected readonly effectiveSize = computed<MkSize>(() =>\n this.field ? this.field.size() : this.size(),\n );\n protected readonly isDisabled = computed(\n () => this.disabled() || this.cvaDisabled(),\n );\n protected readonly isInvalid = computed(\n () => (this.invalid() && this.fieldTouched()) || (this.field?.hasError() ?? false),\n );\n protected readonly labelledBy = computed(() => this.field?.labelId ?? null);\n protected readonly describedBy = computed(\n () => this.field?.describedBy() ?? null,\n );\n protected readonly displayText = computed(() => this.value() || '');\n\n protected startEdit(): void {\n if (this.isDisabled() || this.editing()) return;\n this.draft.set(this.value());\n this.editing.set(true);\n afterNextRender(() => this.inputRef()?.nativeElement.focus(), {\n injector: this.injector,\n });\n }\n\n protected onInput(event: Event): void {\n this.draft.set((event.target as HTMLInputElement).value);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.cancel();\n } else if (event.key === 'Enter' && !this.multiline()) {\n event.preventDefault();\n this.save();\n }\n }\n\n protected onBlur(): void {\n if (!this.editing()) return;\n this.saveOnBlur() ? this.save() : this.cancel();\n }\n\n protected save(): void {\n if (!this.editing()) return;\n this.editing.set(false);\n const next = this.draft();\n if (next !== this.value()) {\n this.value.set(next);\n this.onChange(next);\n this.saved.emit(next);\n }\n this.onTouched();\n this.restoreFocus();\n }\n\n protected cancel(): void {\n if (!this.editing()) return;\n this.editing.set(false);\n this.cancelled.emit();\n this.restoreFocus();\n }\n\n private restoreFocus(): void {\n afterNextRender(() => this.displayRef()?.nativeElement.focus(), {\n injector: this.injector,\n });\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n writeValue(value: string | null): void {\n this.value.set(value ?? '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n","@if (editing()) {\n @if (multiline()) {\n <textarea\n #input\n class=\"mk-inline-edit__input mk-inline-edit__input--multiline\"\n [id]=\"fieldId\"\n [value]=\"draft()\"\n [attr.aria-label]=\"labelledBy() ? null : ariaLabel()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n rows=\"3\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n ></textarea>\n } @else {\n <input\n #input\n type=\"text\"\n class=\"mk-inline-edit__input\"\n [id]=\"fieldId\"\n [value]=\"draft()\"\n [attr.aria-label]=\"labelledBy() ? null : ariaLabel()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n }\n @if (multiline()) {\n <div class=\"mk-inline-edit__actions\">\n <button\n type=\"button\"\n class=\"mk-inline-edit__action\"\n [attr.aria-label]=\"i18n.save\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"save()\"\n >\n ✓\n </button>\n <button\n type=\"button\"\n class=\"mk-inline-edit__action\"\n [attr.aria-label]=\"i18n.cancel\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"cancel()\"\n >\n ✕\n </button>\n </div>\n }\n} @else {\n <button\n #display\n type=\"button\"\n class=\"mk-inline-edit__display\"\n [class.mk-inline-edit__display--empty]=\"!displayText()\"\n [disabled]=\"isDisabled()\"\n (click)=\"startEdit()\"\n >\n <span class=\"mk-visually-hidden\">{{ ariaLabel() }}</span>\n <span class=\"mk-inline-edit__text\">{{ displayText() || placeholder() }}</span>\n @if (!isDisabled()) {\n <svg\n class=\"mk-inline-edit__pencil\"\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M11.5 1.5l3 3L5 14l-3.5.5L2 11l9.5-9.5z\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linejoin=\"round\"\n />\n </svg>\n }\n </button>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n effect,\n untracked,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** A duration split into whole day/hour/minute/second parts. */\nexport interface MkDurationParts {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\n/**\n * Split a positive millisecond duration into whole days, hours, minutes and\n * seconds. Negative inputs clamp to zero.\n *\n * ```ts\n * mkSplitDuration(90_061_000); // { days: 1, hours: 1, minutes: 1, seconds: 1 }\n * ```\n */\nexport function mkSplitDuration(ms: number): MkDurationParts {\n const total = Math.max(0, Math.floor(ms / 1000));\n return {\n days: Math.floor(total / 86_400),\n hours: Math.floor((total % 86_400) / 3_600),\n minutes: Math.floor((total % 3_600) / 60),\n seconds: total % 60,\n };\n}\n\n/**\n * Countdown — ticks every second and shows the time remaining until a target\n * instant as days / hours / minutes / seconds. Emits {@link finished} once when\n * the target passes and then keeps showing zeros (or {@link finishedText}).\n *\n * ```html\n * <mk-countdown [to]=\"launchDate\" (finished)=\"onLaunch()\" />\n * ```\n */\n@Component({\n selector: 'mk-countdown',\n templateUrl: './countdown.html',\n styleUrl: './countdown.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-countdown',\n role: 'timer',\n },\n})\nexport class MkCountdown {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n protected readonly i18n = inject(MK_I18N);\n\n /** The target instant to count down to. */\n readonly to = input<Date | null>(null);\n /** Show the days segment; when false, days roll into the hours value. */\n readonly showDays = input(true, { transform: booleanAttribute });\n /** Show the textual label beneath each value. */\n readonly showLabels = input(true, { transform: booleanAttribute });\n /** Zero-pad values to two digits. */\n readonly pad = input(true, { transform: booleanAttribute });\n /** Text to show instead of zeros once the countdown finishes. */\n readonly finishedText = input('');\n\n /** Fires exactly once when the target instant is reached. */\n readonly finished = output<void>();\n\n /** Current wall-clock time, updated every tick. */\n protected readonly now = signal(Date.now());\n\n /** Remaining milliseconds, clamped at zero. */\n protected readonly remaining = computed(() => {\n const target = this.to();\n if (!target) return 0;\n return Math.max(0, target.getTime() - this.now());\n });\n\n protected readonly parts = computed(() => {\n const { days, hours, minutes, seconds } = mkSplitDuration(this.remaining());\n return this.showDays()\n ? { days, hours, minutes, seconds }\n : { days: 0, hours: days * 24 + hours, minutes, seconds };\n });\n\n protected readonly isDone = computed(() => !!this.to() && this.remaining() === 0);\n\n /**\n * Text for the polite live region. Deliberately formatted WITHOUT the\n * seconds segment so the string (and therefore the announcement) only\n * changes when a minute rolls over, instead of chattering every second.\n * When the countdown reaches zero it switches to a final \"finished\"\n * announcement ({@link finishedText} when provided).\n */\n protected readonly liveText = computed(() => {\n if (this.isDone()) return this.finishedText() || this.i18n.countdownFinished;\n const p = this.parts();\n const segs = this.showDays()\n ? [`${p.days} ${this.i18n.countdownDays}`]\n : [];\n return [\n ...segs,\n `${p.hours} ${this.i18n.countdownHours}`,\n `${p.minutes} ${this.i18n.countdownMinutes}`,\n ].join(', ');\n });\n\n private hasFinished = false;\n private intervalId?: number;\n /** Set once the first render has happened (browser only). */\n private viewReady = false;\n\n constructor() {\n // Re-arm whenever the target moves into the future again (e.g. a \"next\n // round\" pattern swapping `to` after completion): reset `finished` and\n // restart the stopped interval.\n effect(() => {\n const target = this.to();\n if (target && target.getTime() > untracked(this.now)) {\n this.hasFinished = false;\n if (this.viewReady && !this.document.hidden) {\n untracked(() => {\n this.tick();\n this.startInterval();\n });\n }\n }\n });\n afterNextRender(() => {\n if (!this.isBrowser) return;\n this.viewReady = true;\n this.document.addEventListener('visibilitychange', this.onVisibilityChange);\n this.tick();\n this.startInterval();\n });\n }\n\n /**\n * No ticking while the tab is hidden — every tick is a change-detection\n * pass in a zoneless app. On return, resync immediately from `Date.now()`\n * so the display never shows stale time.\n */\n private readonly onVisibilityChange = (): void => {\n if (this.document.hidden) {\n this.stopInterval();\n } else {\n this.tick();\n this.startInterval();\n }\n };\n\n private startInterval(): void {\n if (!this.isBrowser || this.intervalId != null) return;\n // Nothing left to count (no target, or already at zero) — stay idle\n // until the `to` input moves into the future again.\n if (this.remaining() === 0) return;\n this.intervalId = this.document.defaultView?.setInterval(() => this.tick(), 1000);\n }\n\n private stopInterval(): void {\n if (this.intervalId != null) {\n this.document.defaultView?.clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n }\n\n private tick(): void {\n this.now.set(Date.now());\n if (this.remaining() === 0) {\n // Reached zero — stop ticking entirely; the effect on `to` re-arms.\n this.stopInterval();\n if (!this.hasFinished && this.isDone()) {\n this.hasFinished = true;\n this.finished.emit();\n }\n }\n }\n\n protected format(value: number): string {\n return this.pad() ? String(value).padStart(2, '0') : String(value);\n }\n\n ngOnDestroy(): void {\n this.stopInterval();\n if (this.viewReady) {\n this.document.removeEventListener('visibilitychange', this.onVisibilityChange);\n }\n }\n}\n","@if (isDone() && finishedText()) {\n <span class=\"mk-countdown__done\">{{ finishedText() }}</span>\n} @else {\n @if (showDays()) {\n <span class=\"mk-countdown__segment\">\n <span class=\"mk-countdown__value\">{{ format(parts().days) }}</span>\n @if (showLabels()) {\n <span class=\"mk-countdown__label\">{{ i18n.countdownDays }}</span>\n }\n </span>\n <span class=\"mk-countdown__sep\" aria-hidden=\"true\">:</span>\n }\n <span class=\"mk-countdown__segment\">\n <span class=\"mk-countdown__value\">{{ format(parts().hours) }}</span>\n @if (showLabels()) {\n <span class=\"mk-countdown__label\">{{ i18n.countdownHours }}</span>\n }\n </span>\n <span class=\"mk-countdown__sep\" aria-hidden=\"true\">:</span>\n <span class=\"mk-countdown__segment\">\n <span class=\"mk-countdown__value\">{{ format(parts().minutes) }}</span>\n @if (showLabels()) {\n <span class=\"mk-countdown__label\">{{ i18n.countdownMinutes }}</span>\n }\n </span>\n <span class=\"mk-countdown__sep\" aria-hidden=\"true\">:</span>\n <span class=\"mk-countdown__segment\">\n <span class=\"mk-countdown__value\">{{ format(parts().seconds) }}</span>\n @if (showLabels()) {\n <span class=\"mk-countdown__label\">{{ i18n.countdownSeconds }}</span>\n }\n </span>\n}\n\n<!-- Minute-granular so the polite region doesn't re-announce every second. -->\n<span class=\"mk-countdown__sr\" aria-live=\"polite\" aria-atomic=\"true\">{{ liveText() }}</span>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n booleanAttribute,\n contentChildren,\n input,\n viewChild,\n} from '@angular/core';\n\n/** Layout for {@link MkDescriptionList}. */\nexport type MkDescriptionLayout = 'grid' | 'stacked';\n\n/**\n * A single term/detail row of {@link MkDescriptionList}: `term` becomes the\n * `<dt>`, the projected content the `<dd>`. The row itself renders nothing —\n * the list reads its rows and writes `<dt>`/`<dd>` as direct children of the\n * `<dl>`, which is what HTML and assistive tech require (a wrapper element\n * between `<dl>` and `<dt>` fails axe `definition-list` / `dlitem`).\n */\n@Component({\n selector: 'mk-desc-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<ng-template #content><ng-content /></ng-template>`,\n styles: [':host{display:none;}'],\n host: { class: 'mk-desc-item' },\n})\nexport class MkDescItem {\n /** The term (label) shown in the `<dt>`. */\n readonly term = input('');\n /** The row's detail content, rendered by the list inside its `<dd>`. @internal */\n readonly content = viewChild.required<TemplateRef<unknown>>('content');\n}\n\n/**\n * DescriptionList — a semantic `<dl>` of term/detail pairs for entity-detail and\n * metadata panels. Project {@link MkDescItem} rows; values may be rich content\n * (badges, links, …). In `grid` layout terms align in a shared column; in\n * `stacked` each term sits above its value.\n *\n * ```html\n * <mk-description-list>\n * <mk-desc-item term=\"Status\"><mk-badge tone=\"success\">Active</mk-badge></mk-desc-item>\n * <mk-desc-item term=\"Owner\">Ada Lovelace</mk-desc-item>\n * </mk-description-list>\n * ```\n *\n * Only `mk-desc-item` children are rendered; the `<dl>` always contains plain\n * `<dt>`/`<dd>` pairs.\n */\n@Component({\n selector: 'mk-description-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `<dl\n class=\"mk-description-list__dl\"\n [attr.data-layout]=\"layout()\"\n [class.mk-description-list__dl--divided]=\"divided()\"\n >\n @for (item of items(); track item) {\n <dt class=\"mk-description-list__term\">{{ item.term() }}</dt>\n <dd class=\"mk-description-list__details\">\n <ng-container *ngTemplateOutlet=\"item.content()\" />\n </dd>\n }\n </dl>`,\n styleUrl: './description-list.scss',\n host: { class: 'mk-description-list' },\n})\nexport class MkDescriptionList {\n /** `grid` aligns terms in a column; `stacked` puts each term above its value. */\n readonly layout = input<MkDescriptionLayout>('grid');\n /** Draw a divider between rows. */\n readonly divided = input(false, { transform: booleanAttribute });\n\n protected readonly items = contentChildren(MkDescItem);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { MkCopyToClipboard } from '@mk-kit/ui/directives';\nimport { mkHighlight, type MkCodeLanguage } from '@mk-kit/ui/core';\n\n/**\n * Code — a read-only, themed code block with syntax highlighting, an optional\n * filename header, line numbers and a copy button. Highlighting reuses the same\n * dependency-free tokenizer as {@link MkCodeEditor}. For an editable field use\n * `mk-code-editor` instead.\n *\n * ```html\n * <mk-code language=\"json\" filename=\"config.json\" [code]=\"json\" />\n * ```\n */\n@Component({\n selector: 'mk-code',\n templateUrl: './code.html',\n styleUrl: './code.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkCopyToClipboard],\n host: {\n class: 'mk-code',\n '[class.mk-code--wrap]': 'wrap()',\n },\n})\nexport class MkCode {\n /** The source to display. */\n readonly code = input('');\n /** Language for highlighting. */\n readonly language = input<MkCodeLanguage>('plaintext');\n /** Optional filename shown in a header bar. */\n readonly filename = input<string>('');\n /** Show a line-number gutter. */\n readonly lineNumbers = input(false, { transform: booleanAttribute });\n /** Show the copy button. */\n readonly copyable = input(true, { transform: booleanAttribute });\n /** Soft-wrap long lines instead of scrolling horizontally. */\n readonly wrap = input(false, { transform: booleanAttribute });\n\n protected readonly highlighted = computed(() =>\n mkHighlight(this.code(), this.language()),\n );\n\n protected readonly lines = computed(() => {\n const count = this.code() ? this.code().split('\\n').length : 1;\n return Array.from({ length: count }, (_, i) => i + 1);\n });\n\n /** Whether to render the header bar (filename and/or copy button). */\n protected readonly hasHeader = computed(\n () => !!this.filename() || this.copyable(),\n );\n\n /**\n * Accessible name of the focusable scroll region: the filename when set,\n * else a generic \"Code\". (No MK_I18N key covers this today — the block\n * editor's `blockCode` string is scoped to the editor palette.)\n */\n protected readonly scrollLabel = computed(() => this.filename() || 'Code');\n}\n","@if (hasHeader()) {\n <div class=\"mk-code__header\">\n <span class=\"mk-code__filename\">{{ filename() }}</span>\n @if (copyable()) {\n <button\n type=\"button\"\n class=\"mk-code__copy\"\n [mkCopyToClipboard]=\"code()\"\n #copier=\"mkCopyToClipboard\"\n [attr.aria-label]=\"copier.justCopied() ? 'Copied' : 'Copy code'\"\n >\n {{ copier.justCopied() ? '✓ Copied' : 'Copy' }}\n </button>\n }\n </div>\n}\n\n<!-- Focusable so keyboard users can scroll the overflowing code (WCAG 2.1.1). -->\n<div\n class=\"mk-code__scroll\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"scrollLabel()\"\n>\n @if (lineNumbers()) {\n <div class=\"mk-code__gutter\" aria-hidden=\"true\">\n @for (n of lines(); track n) {\n <span class=\"mk-code__lineno\">{{ n }}</span>\n }\n </div>\n }\n <pre class=\"mk-code__pre\"><code [innerHTML]=\"highlighted()\"></code></pre>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n PLATFORM_ID,\n TemplateRef,\n afterNextRender,\n computed,\n contentChild,\n inject,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\n\n/**\n * VirtualScroll — renders only the rows visible in the viewport (plus a small\n * overscan), so a list of thousands of fixed-height items stays smooth. Give\n * the host a height and provide a row template:\n *\n * ```html\n * <mk-virtual-scroll [items]=\"rows\" [itemHeight]=\"40\" style=\"height: 20rem;\">\n * <ng-template let-row let-i=\"index\">{{ i }} — {{ row.name }}</ng-template>\n * </mk-virtual-scroll>\n * ```\n */\n@Component({\n selector: 'mk-virtual-scroll',\n templateUrl: './virtual-scroll.html',\n styleUrl: './virtual-scroll.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: { class: 'mk-virtual-scroll' },\n})\nexport class MkVirtualScroll {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly viewportRef =\n viewChild<ElementRef<HTMLElement>>('viewport');\n\n /** The full list of items. */\n readonly items = input<readonly unknown[]>([]);\n /** Fixed height of each row in px. */\n readonly itemHeight = input(40, { transform: numberAttribute });\n /** Extra rows rendered above/below the viewport to smooth fast scrolls. */\n readonly overscan = input(4, { transform: numberAttribute });\n\n /** The row template (`<ng-template let-item let-i=\"index\">`). */\n protected readonly template = contentChild(TemplateRef);\n\n protected readonly scrollTop = signal(0);\n protected readonly viewportHeight = signal(0);\n\n /** Total scrollable height (sizes the scrollbar). */\n protected readonly totalHeight = computed(\n () => this.items().length * this.itemHeight(),\n );\n\n /**\n * The [start, end) index window currently rendered. Custom equality means\n * per-pixel scrolling only re-renders when the window actually shifts.\n */\n private readonly range = computed(\n () => {\n const ih = this.itemHeight() || 1;\n const count = this.items().length;\n const visible = Math.ceil(this.viewportHeight() / ih);\n const start = Math.max(0, Math.floor(this.scrollTop() / ih) - this.overscan());\n const end = Math.min(count, start + visible + this.overscan() * 2);\n return { start, end };\n },\n { equal: (a, b) => a.start === b.start && a.end === b.end },\n );\n\n /** Offset of the first rendered row from the top. */\n protected readonly offset = computed(() => this.range().start * this.itemHeight());\n\n /** The rendered slice, each with its absolute index. */\n protected readonly visibleItems = computed(() => {\n const { start, end } = this.range();\n return this.items()\n .slice(start, end)\n .map((item, i) => ({ item, index: start + i }));\n });\n\n constructor() {\n afterNextRender(() => {\n this.measure();\n const view = this.viewportRef()?.nativeElement;\n if (view && this.isBrowser && 'ResizeObserver' in window) {\n this.resizeObserver = new ResizeObserver(() => this.measure());\n this.resizeObserver.observe(view);\n }\n });\n }\n\n private resizeObserver?: ResizeObserver;\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n private measure(): void {\n const view = this.viewportRef()?.nativeElement;\n if (view) this.viewportHeight.set(view.clientHeight);\n }\n\n protected onScroll(event: Event): void {\n this.scrollTop.set((event.target as HTMLElement).scrollTop);\n }\n}\n","<div #viewport class=\"mk-virtual-scroll__viewport\" tabindex=\"0\" (scroll)=\"onScroll($event)\">\n <div class=\"mk-virtual-scroll__spacer\" [style.height.px]=\"totalHeight()\">\n <div\n class=\"mk-virtual-scroll__content\"\n [style.transform]=\"'translateY(' + offset() + 'px)'\"\n >\n @for (row of visibleItems(); track row.index) {\n <div class=\"mk-virtual-scroll__item\" [style.height.px]=\"itemHeight()\">\n <ng-container\n [ngTemplateOutlet]=\"template() ?? null\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item, index: row.index }\"\n />\n </div>\n }\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n model,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** Horizontal movement (px) before a pointer gesture commits to a swipe. */\nconst SWIPE_START_PX = 30;\n\n/**\n * A single slide inside {@link MkCarousel}. Mark each slide element with\n * `mkCarouselSlide`; the carousel wires ARIA + visibility.\n */\n@Directive({\n selector: '[mkCarouselSlide]',\n host: {\n class: 'mk-carousel__slide',\n role: 'group',\n 'aria-roledescription': 'slide',\n },\n})\nexport class MkCarouselSlide {\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n}\n\n/**\n * Carousel — an accessible slides/gallery. Project slides marked with\n * `mkCarouselSlide`; get prev/next arrows, dot indicators, Arrow-key\n * navigation, pointer swipe (touch or mouse drag; vertical page scroll stays\n * native) and optional autoplay that pauses on hover/focus. The current slide\n * is a two-way `index` model.\n *\n * ```html\n * <mk-carousel ariaLabel=\"Featured\" autoplay>\n * <div mkCarouselSlide>…</div>\n * <div mkCarouselSlide>…</div>\n * </mk-carousel>\n * ```\n */\n@Component({\n selector: 'mk-carousel',\n templateUrl: './carousel.html',\n styleUrl: './carousel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-carousel' },\n})\nexport class MkCarousel {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly document = inject(DOCUMENT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly slides = contentChildren(MkCarouselSlide);\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n\n /** Two-way current slide index. */\n readonly index = model(0);\n /** Accessible label for the carousel region. */\n readonly ariaLabel = input(this.i18n.carouselLabel);\n /** Wrap around at the ends. */\n readonly loop = input(true, { transform: booleanAttribute });\n /** Show the dot indicators. */\n readonly showDots = input(true, { transform: booleanAttribute });\n /** Show the prev/next arrows. */\n readonly showArrows = input(true, { transform: booleanAttribute });\n /**\n * Advance automatically. Pauses transiently on hover/focus/pointer-down and\n * shows a persistent pause/play toggle (`userPaused`). Never runs when the\n * user prefers reduced motion.\n */\n readonly autoplay = input(false, { transform: booleanAttribute });\n /** Autoplay interval in ms. */\n readonly interval = input(5000, { transform: numberAttribute });\n\n /**\n * Persistent, user-controlled pause (WCAG 2.2.2). Latched by the pause/play\n * toggle; the transient hover/focus pause never overrides it. Two-way so\n * consumers can bind or preset it.\n */\n readonly userPaused = model(false);\n\n /** Transient pause (hover / focus / pointer held down inside the viewport). */\n protected readonly paused = signal(false);\n /** True while the autoplay interval is actually running. */\n protected readonly playing = signal(false);\n /** True while the browser tab is hidden — no advancing (or CD) in the dark. */\n private readonly pageHidden = signal(false);\n /** True while the carousel is fully scrolled out of the viewport. */\n private readonly offscreen = signal(false);\n private timer?: ReturnType<typeof setInterval>;\n private io?: IntersectionObserver;\n\n protected readonly count = computed(() => this.slides().length);\n protected readonly dots = computed(() =>\n Array.from({ length: this.count() }, (_, i) => i),\n );\n protected readonly liveText = computed(() =>\n this.count() ? this.i18n.slideOf(this.index() + 1, this.count()) : '',\n );\n /**\n * Silence the live region while the slideshow is auto-advancing — otherwise\n * every auto-advance is announced forever. Announce again as soon as the\n * user is in control (paused, latched, or autoplay off).\n */\n protected readonly liveMode = computed(() => (this.playing() ? 'off' : 'polite'));\n\n /** Resolved text direction ('ltr' until measured in the browser). */\n private readonly dir = signal<'ltr' | 'rtl'>('ltr');\n\n /** Live swipe gesture, or null when no pointer is being tracked. */\n private swipe: {\n startX: number;\n startY: number;\n startT: number;\n /** True once the gesture committed to a horizontal drag. */\n active: boolean;\n } | null = null;\n /** Visual drag offset (px) applied on top of the slide position. */\n private readonly dragOffset = signal(0);\n /** True while a horizontal drag is in flight (kills the track transition). */\n protected readonly dragging = signal(false);\n\n /**\n * Track offset — in RTL the flex track lays out right-to-left, so moving to\n * the next slide means translating in the positive X direction. While a\n * swipe is in flight the pixel drag offset rides on top.\n */\n protected readonly trackTransform = computed(() => {\n const sign = this.dir() === 'rtl' ? 1 : -1;\n const base = sign * this.index() * 100;\n const offset = this.dragOffset();\n return offset\n ? `translateX(calc(${base}% + ${offset}px))`\n : `translateX(${base}%)`;\n });\n\n constructor() {\n afterNextRender(() => {\n const { direction } = getComputedStyle(this.host.nativeElement);\n this.dir.set(direction === 'rtl' ? 'rtl' : 'ltr');\n // Autoplay only runs while the tab is visible…\n this.pageHidden.set(this.document.hidden ?? false);\n this.document.addEventListener('visibilitychange', this.onVisibilityChange);\n // …and while the carousel itself is at least partially on screen\n // (guarded — jsdom has no IntersectionObserver).\n if (typeof IntersectionObserver !== 'undefined') {\n this.io = new IntersectionObserver((entries) => {\n const entry = entries[entries.length - 1];\n this.offscreen.set(!entry.isIntersecting);\n });\n this.io.observe(this.host.nativeElement);\n }\n });\n // Reflect the active slide onto each slide element (visibility + a11y).\n effect(() => {\n const active = this.index();\n this.slides().forEach((slide, i) => {\n const el = slide.el.nativeElement;\n const hidden = i !== active;\n el.setAttribute('aria-hidden', String(hidden));\n if (hidden) el.setAttribute('inert', '');\n else el.removeAttribute('inert');\n el.setAttribute('aria-label', this.i18n.slideOf(i + 1, this.slides().length));\n });\n });\n // Autoplay lifecycle. Never starts under prefers-reduced-motion — the\n // motion itself must stop, not just the CSS transition. Also idles while\n // the tab is hidden or the carousel is fully offscreen: in a zoneless app\n // every unseen advance is a wasted change-detection pass.\n effect(() => {\n const on =\n this.autoplay() &&\n !this.paused() &&\n !this.userPaused() &&\n !this.pageHidden() &&\n !this.offscreen() &&\n this.count() > 1;\n this.stopTimer();\n const start = on && this.isBrowser && !this.prefersReducedMotion();\n this.playing.set(start);\n if (start) {\n this.timer = setInterval(() => this.next(), this.interval());\n }\n });\n }\n\n /** Go to slide `i` (clamped, or wrapped when `loop`). */\n goTo(i: number): void {\n const count = this.count();\n if (count === 0) return;\n if (this.loop()) {\n this.index.set((i + count) % count);\n } else {\n this.index.set(Math.max(0, Math.min(count - 1, i)));\n }\n }\n\n next(): void {\n this.goTo(this.index() + 1);\n }\n\n prev(): void {\n this.goTo(this.index() - 1);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n this.next();\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n this.prev();\n }\n }\n\n protected pause(): void {\n this.paused.set(true);\n }\n protected resume(): void {\n this.paused.set(false);\n }\n\n /** Latches / releases the persistent pause (the toolbar toggle button). */\n protected toggleUserPause(): void {\n this.userPaused.update((v) => !v);\n }\n\n /**\n * Touch users can't hover — holding a pointer down pauses autoplay\n * transiently. It also arms swipe tracking, except on the carousel's own\n * controls (play/pause, arrows), which must stay plain tappable buttons.\n */\n protected onPointerDown(event: PointerEvent): void {\n this.pause();\n const target = event.target as HTMLElement | null;\n if (this.count() < 2 || target?.closest?.('button')) return;\n this.swipe = {\n startX: event.clientX ?? 0,\n startY: event.clientY ?? 0,\n startT: performance.now(),\n active: false,\n };\n }\n\n protected onPointerMove(event: PointerEvent): void {\n const swipe = this.swipe;\n if (!swipe) return;\n const dx = (event.clientX ?? 0) - swipe.startX;\n const dy = (event.clientY ?? 0) - swipe.startY;\n if (!swipe.active) {\n // Mostly vertical — hand the gesture back to native page scroll\n // (touch-action: pan-y keeps that scroll running throughout).\n if (Math.abs(dy) > Math.abs(dx) && Math.abs(dy) > SWIPE_START_PX) {\n this.swipe = null;\n return;\n }\n // Commit to a horizontal drag only past the threshold.\n if (Math.abs(dx) < SWIPE_START_PX || Math.abs(dx) <= Math.abs(dy)) return;\n swipe.active = true;\n this.dragging.set(true);\n try {\n // Keep receiving moves when a mouse drag leaves the viewport.\n (event.currentTarget as HTMLElement | null)?.setPointerCapture?.(\n event.pointerId,\n );\n } catch {\n /* jsdom / detached target */\n }\n }\n this.dragOffset.set(dx);\n }\n\n protected onPointerUp(event: PointerEvent): void {\n // A mouse release while still hovering must not undo the hover pause.\n if (event.pointerType !== 'mouse') this.resume();\n\n const swipe = this.swipe;\n this.swipe = null;\n if (!swipe?.active) return;\n this.dragging.set(false);\n this.dragOffset.set(0); // springs back / snaps via the track transition\n\n const viewport = event.currentTarget as HTMLElement | null;\n if (event.type === 'pointercancel') return;\n\n const dx = (event.clientX ?? 0) - swipe.startX;\n const elapsed = performance.now() - swipe.startT;\n // Velocity only counts for gestures long enough to measure — guards\n // against nonsense values from near-zero durations.\n const velocity = elapsed >= 50 ? dx / elapsed : 0;\n const width = viewport?.offsetWidth || 360;\n if (Math.abs(dx) > width * 0.25 || Math.abs(velocity) > 0.5) {\n // In RTL the track lays out right-to-left, so dragging towards positive\n // X reveals the NEXT slide; in LTR it's the opposite.\n const toNext = this.dir() === 'rtl' ? dx > 0 : dx < 0;\n if (toNext) this.next();\n else this.prev();\n }\n // A real drag happened — swallow the click that follows so links/buttons\n // inside the slide don't activate from a swipe.\n if (viewport) this.suppressNextClick(viewport);\n }\n\n /**\n * Capture-phase, one-shot click swallow: the browser fires a synthetic click\n * right after pointerup, which would activate whatever link/button the drag\n * ended on. The safety timeout covers gestures that produce no click at all.\n */\n private suppressNextClick(viewport: HTMLElement): void {\n const swallow = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n };\n viewport.addEventListener('click', swallow, { capture: true, once: true });\n setTimeout(\n () => viewport.removeEventListener('click', swallow, { capture: true }),\n 400,\n );\n }\n\n private prefersReducedMotion(): boolean {\n return (\n this.document.defaultView?.matchMedia?.('(prefers-reduced-motion: reduce)')\n .matches ?? false\n );\n }\n\n private readonly onVisibilityChange = (): void => {\n this.pageHidden.set(this.document.hidden ?? false);\n };\n\n private stopTimer(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n ngOnDestroy(): void {\n this.stopTimer();\n if (this.isBrowser) {\n this.document.removeEventListener('visibilitychange', this.onVisibilityChange);\n }\n this.io?.disconnect();\n this.io = undefined;\n }\n}\n","<div\n class=\"mk-carousel__viewport\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n [attr.aria-label]=\"ariaLabel()\"\n tabindex=\"0\"\n (keydown)=\"onKeydown($event)\"\n (mouseenter)=\"pause()\"\n (mouseleave)=\"resume()\"\n (focusin)=\"pause()\"\n (focusout)=\"resume()\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n>\n @if (autoplay()) {\n <button\n type=\"button\"\n class=\"mk-carousel__playpause\"\n [attr.aria-label]=\"userPaused() ? i18n.playSlideshow : i18n.pauseSlideshow\"\n [attr.aria-pressed]=\"userPaused()\"\n (click)=\"toggleUserPause()\"\n >\n <span aria-hidden=\"true\">{{ userPaused() ? '▶' : '⏸' }}</span>\n </button>\n }\n <div\n class=\"mk-carousel__track\"\n [class.mk-carousel__track--dragging]=\"dragging()\"\n [style.transform]=\"trackTransform()\"\n >\n <ng-content />\n </div>\n\n @if (showArrows() && count() > 1) {\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--prev\"\n [attr.aria-label]=\"i18n.previousSlide\"\n (click)=\"prev()\"\n >\n <span aria-hidden=\"true\">‹</span>\n </button>\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--next\"\n [attr.aria-label]=\"i18n.nextSlide\"\n (click)=\"next()\"\n >\n <span aria-hidden=\"true\">›</span>\n </button>\n }\n</div>\n\n@if (showDots() && count() > 1) {\n <div class=\"mk-carousel__dots\">\n @for (dot of dots(); track dot) {\n <button\n type=\"button\"\n class=\"mk-carousel__dot\"\n [class.mk-carousel__dot--active]=\"dot === index()\"\n [attr.aria-current]=\"dot === index() || null\"\n [attr.aria-label]=\"i18n.goToSlide(dot + 1)\"\n (click)=\"goTo(dot)\"\n ></button>\n }\n </div>\n}\n\n<div class=\"mk-visually-hidden\" [attr.aria-live]=\"liveMode()\">{{ liveText() }}</div>\n","/** Delegates to `@mk-kit/core` — the exported names are unchanged. */\nexport {\n mkComputeDiff,\n mkDiffStats,\n type MkDiffOp,\n type MkDiffOptions,\n type MkDiffRow,\n type MkDiffSegment,\n type MkDiffStats,\n} from '@mk-kit/core';\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport {\n type MkDiffRow,\n mkComputeDiff,\n mkDiffStats,\n} from './diff-util';\n\n/** How {@link MkDiff} lays out the comparison. */\nexport type MkDiffMode = 'unified' | 'split';\n\ninterface SplitRow {\n left: MkDiffRow | null;\n right: MkDiffRow | null;\n}\n\n/**\n * Diff — a text comparison view for revisions (before ⇄ after). Computes an LCS\n * line diff with optional intra-line word highlighting and renders a `unified`\n * (single-column, +/-) or `split` (side-by-side) view with line numbers and an\n * add/remove summary.\n *\n * ```html\n * <mk-diff [before]=\"v1\" [after]=\"v2\" mode=\"split\" />\n * ```\n */\n@Component({\n selector: 'mk-diff',\n templateUrl: './diff.html',\n styleUrl: './diff.scss',\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-diff',\n '[class.mk-diff--split]': \"mode() === 'split'\",\n },\n})\nexport class MkDiff {\n protected readonly i18n = inject(MK_I18N);\n\n /** The original (\"before\") text. */\n readonly before = input('');\n /** The new (\"after\") text. */\n readonly after = input('');\n /** Layout: single-column `unified` or side-by-side `split`. */\n readonly mode = input<MkDiffMode>('unified');\n /** Highlight the specific words that changed within a line. */\n readonly wordHighlight = input(true, { transform: booleanAttribute });\n /** Show line-number gutters. */\n readonly lineNumbers = input(true, { transform: booleanAttribute });\n /** Ignore trailing whitespace when comparing lines. */\n readonly ignoreTrailingWhitespace = input(false, {\n transform: booleanAttribute,\n });\n /** Show the +added / −removed summary header. */\n readonly showStats = input(true, { transform: booleanAttribute });\n /** Column labels (split view header / a11y). */\n readonly beforeLabel = input(this.i18n.diffBefore);\n readonly afterLabel = input(this.i18n.diffAfter);\n\n protected readonly rows = computed(() =>\n mkComputeDiff(this.before(), this.after(), {\n wordHighlight: this.wordHighlight(),\n ignoreTrailingWhitespace: this.ignoreTrailingWhitespace(),\n }),\n );\n\n protected readonly stats = computed(() => mkDiffStats(this.rows()));\n\n /** Rows paired into two columns for the split view. */\n protected readonly splitRows = computed<SplitRow[]>(() => {\n const rows = this.rows();\n const out: SplitRow[] = [];\n let i = 0;\n while (i < rows.length) {\n if (rows[i].op === 'equal') {\n out.push({ left: rows[i], right: rows[i] });\n i++;\n continue;\n }\n let d = i;\n while (d < rows.length && rows[d].op === 'delete') d++;\n let s = d;\n while (s < rows.length && rows[s].op === 'insert') s++;\n const dels = rows.slice(i, d);\n const ins = rows.slice(d, s);\n const max = Math.max(dels.length, ins.length);\n for (let k = 0; k < max; k++) {\n out.push({ left: dels[k] ?? null, right: ins[k] ?? null });\n }\n i = s;\n }\n return out;\n });\n\n protected marker(op: MkDiffRow['op']): string {\n return op === 'insert' ? '+' : op === 'delete' ? '-' : ' ';\n }\n}\n","@if (showStats()) {\n <div class=\"mk-diff__header\">\n <span class=\"mk-diff__label\">{{ beforeLabel() }} → {{ afterLabel() }}</span>\n <span class=\"mk-diff__stats\" [attr.aria-label]=\"i18n.diffChanges\">\n <span class=\"mk-diff__stat mk-diff__stat--add\">+{{ stats().added }}</span>\n <span class=\"mk-diff__stat mk-diff__stat--del\">−{{ stats().removed }}</span>\n </span>\n </div>\n}\n\n<!-- Shared code cell (word segments when present, else plain text). -->\n<ng-template #cell let-row>\n @if (row.segments) {\n @for (seg of row.segments; track $index) {\n <span [class.mk-diff__word]=\"seg.changed\">{{ seg.text }}</span>\n }\n } @else {\n {{ row.text }}\n }\n</ng-template>\n\n<!-- The bodies scroll horizontally, so they are focusable labelled regions to\n stay keyboard-scrollable. Changed lines carry a visually-hidden\n \"Added:\"/\"Removed:\" prefix — color alone never marks a change. -->\n@if (mode() === 'split') {\n <div\n class=\"mk-diff__body mk-diff__body--split\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.diffChanges\"\n >\n @for (row of splitRows(); track $index) {\n <div\n class=\"mk-diff__cell\"\n [class.mk-diff__cell--delete]=\"row.left?.op === 'delete'\"\n [class.mk-diff__cell--empty]=\"!row.left\"\n >\n @if (lineNumbers()) {\n <span class=\"mk-diff__num\">{{ row.left?.beforeNo ?? '' }}</span>\n }\n @if (row.left?.op === 'delete') {\n <span class=\"mk-visually-hidden\">{{ i18n.diffRemovedLine }}</span>\n }\n <span class=\"mk-diff__marker\" aria-hidden=\"true\">{{\n row.left ? marker(row.left.op) : ''\n }}</span>\n <code class=\"mk-diff__code\">@if (row.left) {\n <ng-container [ngTemplateOutlet]=\"cell\" [ngTemplateOutletContext]=\"{ $implicit: row.left }\" />\n }</code>\n </div>\n <div\n class=\"mk-diff__cell\"\n [class.mk-diff__cell--insert]=\"row.right?.op === 'insert'\"\n [class.mk-diff__cell--empty]=\"!row.right\"\n >\n @if (lineNumbers()) {\n <span class=\"mk-diff__num\">{{ row.right?.afterNo ?? '' }}</span>\n }\n @if (row.right?.op === 'insert') {\n <span class=\"mk-visually-hidden\">{{ i18n.diffAddedLine }}</span>\n }\n <span class=\"mk-diff__marker\" aria-hidden=\"true\">{{\n row.right ? marker(row.right.op) : ''\n }}</span>\n <code class=\"mk-diff__code\">@if (row.right) {\n <ng-container [ngTemplateOutlet]=\"cell\" [ngTemplateOutletContext]=\"{ $implicit: row.right }\" />\n }</code>\n </div>\n }\n </div>\n} @else {\n <div\n class=\"mk-diff__body\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.diffChanges\"\n >\n @for (row of rows(); track $index) {\n <div\n class=\"mk-diff__row\"\n [class.mk-diff__row--insert]=\"row.op === 'insert'\"\n [class.mk-diff__row--delete]=\"row.op === 'delete'\"\n >\n @if (lineNumbers()) {\n <span class=\"mk-diff__num\">{{ row.beforeNo ?? '' }}</span>\n <span class=\"mk-diff__num\">{{ row.afterNo ?? '' }}</span>\n }\n @if (row.op === 'insert') {\n <span class=\"mk-visually-hidden\">{{ i18n.diffAddedLine }}</span>\n } @else if (row.op === 'delete') {\n <span class=\"mk-visually-hidden\">{{ i18n.diffRemovedLine }}</span>\n }\n <span class=\"mk-diff__marker\" aria-hidden=\"true\">{{ marker(row.op) }}</span>\n <code class=\"mk-diff__code\"><ng-container [ngTemplateOutlet]=\"cell\" [ngTemplateOutletContext]=\"{ $implicit: row }\" /></code>\n </div>\n }\n </div>\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n booleanAttribute,\n computed,\n contentChild,\n input,\n model,\n output,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MkDrag, MkDropList, mkMoveItemInArray } from '@mk-kit/ui/dnd';\nimport type { MkDropEvent } from '@mk-kit/ui/dnd';\n\n/** Stable empty fallback so out-of-range lookups don't allocate per call. */\nconst NO_CONNECTIONS: string[] = [];\n\n/** A single draggable card on a {@link MkKanban} board. */\nexport interface MkKanbanCard {\n /** Stable identity used for tracking and move events. */\n id: unknown;\n /** Text shown by the default card renderer. */\n title: string;\n /** Arbitrary extra fields for custom card templates. */\n [key: string]: unknown;\n}\n\n/** A column (bucket) of {@link MkKanbanCard}s on a {@link MkKanban} board. */\nexport interface MkKanbanColumn {\n /** Stable identity used for tracking and move events. */\n id: unknown;\n /** Heading shown in the column header and used as its aria-label. */\n title: string;\n /** The ordered cards contained in this column. */\n cards: MkKanbanCard[];\n}\n\n/**\n * Emitted by {@link MkKanban} after a card has been moved (between or within\n * columns) and the two-way `columns` model has been updated.\n */\nexport interface MkKanbanCardMovedEvent {\n /** The card that was moved. */\n card: MkKanbanCard;\n /** `id` of the column the card came from. */\n from: unknown;\n /** `id` of the column the card was dropped into. */\n to: unknown;\n /** The card's index within the source column before the move. */\n fromIndex: number;\n /** The card's index within the destination column after the move. */\n toIndex: number;\n}\n\n/**\n * Kanban board — a horizontal row of columns whose cards can be dragged and\n * reordered within a column or transferred between columns. Built on the dnd\n * group's connected `[mkDropList]` / `[mkDrag]` directives, so it inherits both\n * pointer and keyboard dragging (WCAG 2.1.1) for free.\n *\n * Bind `columns` two-way; the model is updated immutably on each drop. Project\n * an `<ng-template>` to render custom card content — it receives the card as\n * `$implicit` and the owning column as `column`:\n *\n * ```html\n * <mk-kanban [(columns)]=\"board\" (cardMoved)=\"onMoved($event)\">\n * <ng-template #cardTemplate let-card let-column=\"column\">\n * <strong>{{ card.title }}</strong>\n * </ng-template>\n * </mk-kanban>\n * ```\n */\n@Component({\n selector: 'mk-kanban',\n templateUrl: './kanban.html',\n styleUrl: './kanban.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkDropList, MkDrag, NgTemplateOutlet],\n host: { class: 'mk-kanban' },\n})\nexport class MkKanban {\n /** The board's columns and their cards (two-way). Updated on every drop. */\n readonly columns = model<MkKanbanColumn[]>([]);\n\n /** Disable all dragging on the board. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Emitted after the model is updated when a card is moved. */\n readonly cardMoved = output<MkKanbanCardMovedEvent>();\n\n /** Optional consumer-projected card renderer (`$implicit` = card). */\n protected readonly cardTemplate = contentChild<TemplateRef<unknown>>(TemplateRef);\n\n /** Board-scoped prefix so this board's drop-list ids never collide. */\n private readonly boardId = mkUniqueId('mk-kanban');\n\n /** Column count as its own computed so id arrays survive card-only updates. */\n private readonly columnCount = computed(() => this.columns().length);\n\n /** Stable drop-list id per column, positionally matched to `columns()`. */\n protected readonly listIds = computed(() =>\n Array.from({ length: this.columnCount() }, (_, i) => `${this.boardId}-col-${i}`),\n );\n\n /**\n * Per-column connected-target ids (every other column's list). One stable\n * array per column, recomputed only when the column count changes — a fresh\n * array per change-detection pass would dirty each `MkDropList`'s\n * `connectedTo` input identity on every cycle.\n */\n private readonly connections = computed(() => {\n const ids = this.listIds();\n return ids.map((_, i) => ids.filter((_, j) => j !== i));\n });\n\n /** Ids of every other column's list — the connected transfer targets for `i`. */\n protected connectedTo(index: number): string[] {\n return this.connections()[index] ?? NO_CONNECTIONS;\n }\n\n /**\n * Apply a drop from the dnd module. Reads the source/target columns from the\n * event's containers (matched by their drop-list ids), updates the two-way\n * `columns` model immutably, then emits {@link cardMoved}.\n */\n protected onDrop(event: MkDropEvent<MkKanbanCard>): void {\n const ids = this.listIds();\n const fromCol = ids.indexOf(event.previousContainer.id());\n const toCol = ids.indexOf(event.container.id());\n if (fromCol === -1 || toCol === -1) return;\n this.moveCard(fromCol, toCol, event.previousIndex, event.currentIndex);\n }\n\n /**\n * Immutably move the card at `fromIndex` of column `fromCol` to `toIndex` of\n * column `toCol`, updating the model and emitting {@link cardMoved}. Column\n * indices refer to positions in `columns()`.\n */\n private moveCard(\n fromCol: number,\n toCol: number,\n fromIndex: number,\n toIndex: number,\n ): void {\n const cols = this.columns();\n const source = cols[fromCol];\n const target = cols[toCol];\n if (!source || !target) return;\n const card = source.cards[fromIndex];\n if (!card) return;\n\n const next = cols.map((col, i) => {\n if (fromCol === toCol && i === fromCol) {\n const cards = [...col.cards];\n mkMoveItemInArray(cards, fromIndex, toIndex);\n return { ...col, cards };\n }\n if (i === fromCol) {\n return { ...col, cards: col.cards.filter((_, idx) => idx !== fromIndex) };\n }\n if (i === toCol) {\n const cards = [...col.cards];\n cards.splice(Math.max(0, Math.min(toIndex, cards.length)), 0, card);\n return { ...col, cards };\n }\n return col;\n });\n\n this.columns.set(next);\n this.cardMoved.emit({\n card,\n from: source.id,\n to: target.id,\n fromIndex,\n toIndex,\n });\n }\n}\n","<div class=\"mk-kanban__board\">\n @for (column of columns(); track column.id; let colIndex = $index) {\n <section\n class=\"mk-kanban__column\"\n role=\"region\"\n [attr.aria-label]=\"column.title\"\n >\n <header class=\"mk-kanban__column-header\">\n <span class=\"mk-kanban__column-title\">{{ column.title }}</span>\n <span class=\"mk-kanban__column-count\" aria-hidden=\"true\">\n {{ column.cards.length }}\n </span>\n </header>\n\n <div\n mkDropList\n class=\"mk-kanban__cards\"\n [mkDropListData]=\"column.cards\"\n [mkDropListId]=\"listIds()[colIndex]\"\n [mkDropListLabel]=\"column.title\"\n [mkDropListConnectedTo]=\"connectedTo(colIndex)\"\n [mkDropListDisabled]=\"disabled()\"\n mkDropListOrientation=\"vertical\"\n (mkDropListDropped)=\"onDrop($event)\"\n >\n @for (card of column.cards; track card.id) {\n <div\n mkDrag\n class=\"mk-kanban__card\"\n [mkDragData]=\"card\"\n [mkDragDisabled]=\"disabled()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"cardTemplate() ?? defaultCard\"\n [ngTemplateOutletContext]=\"{ $implicit: card, column: column }\"\n />\n </div>\n }\n </div>\n </section>\n }\n</div>\n\n<ng-template #defaultCard let-card>\n <span class=\"mk-kanban__card-title\">{{ card.title }}</span>\n</ng-template>\n","/**\n * Dependency-free QR Code encoder.\n *\n * A from-scratch implementation of the QR encoding algorithm (ISO/IEC 18004):\n * byte-mode (UTF-8) data encoding, Reed–Solomon error correction over GF(256),\n * matrix construction with function patterns, all eight data masks scored by\n * the four penalty rules, and BCH format/version information.\n *\n * Scope: byte mode only, versions 1–10 (module counts 21…57), ECC levels\n * L/M/Q/H. That covers roughly 7–271 UTF-8 bytes depending on the ECC level.\n * Numeric/alphanumeric/kanji modes and versions ≥ 11 are intentionally out of\n * scope — everything is encoded as UTF-8 bytes, which is always valid.\n *\n * The single public entry point is {@link mkEncodeQr}, a pure function.\n */\n\nexport type MkQrEcc = 'L' | 'M' | 'Q' | 'H';\n\nconst ECC_INDEX: Record<MkQrEcc, number> = { L: 0, M: 1, Q: 2, H: 3 };\n\n/** ECC-level bits used inside the 15-bit format string (L=01, M=00, Q=11, H=10). */\nconst ECC_FORMAT_BITS: Record<MkQrEcc, number> = { L: 1, M: 0, Q: 3, H: 2 };\n\n/**\n * Error-correction block layout per version (1–10) and ECC level.\n *\n * Each entry is `[ecCodewordsPerBlock, numBlocksGroup1, dataCodewordsPerBlockGroup1,\n * numBlocksGroup2, dataCodewordsPerBlockGroup2]`. Group-2 blocks (when present)\n * hold exactly one more data codeword than group-1 blocks. Indexed\n * `ECC_BLOCKS[version][ECC_INDEX[ecc]]`; index 0 is an unused placeholder.\n */\nconst ECC_BLOCKS: number[][][] = [\n [], // version 0 — unused\n // v1\n [\n [7, 1, 19, 0, 0],\n [10, 1, 16, 0, 0],\n [13, 1, 13, 0, 0],\n [17, 1, 9, 0, 0],\n ],\n // v2\n [\n [10, 1, 34, 0, 0],\n [16, 1, 28, 0, 0],\n [22, 1, 22, 0, 0],\n [28, 1, 16, 0, 0],\n ],\n // v3\n [\n [15, 1, 55, 0, 0],\n [26, 1, 44, 0, 0],\n [18, 2, 17, 0, 0],\n [22, 2, 13, 0, 0],\n ],\n // v4\n [\n [20, 1, 80, 0, 0],\n [18, 2, 32, 0, 0],\n [26, 2, 24, 0, 0],\n [16, 4, 9, 0, 0],\n ],\n // v5\n [\n [26, 1, 108, 0, 0],\n [24, 2, 43, 0, 0],\n [18, 2, 15, 2, 16],\n [22, 2, 11, 2, 12],\n ],\n // v6\n [\n [18, 2, 68, 0, 0],\n [16, 4, 27, 0, 0],\n [24, 4, 19, 0, 0],\n [28, 4, 15, 0, 0],\n ],\n // v7\n [\n [20, 2, 78, 0, 0],\n [18, 4, 31, 0, 0],\n [18, 2, 14, 4, 15],\n [26, 4, 13, 1, 14],\n ],\n // v8\n [\n [24, 2, 97, 0, 0],\n [22, 2, 38, 2, 39],\n [22, 4, 18, 2, 19],\n [26, 4, 14, 2, 15],\n ],\n // v9\n [\n [30, 2, 116, 0, 0],\n [22, 3, 36, 2, 37],\n [20, 4, 16, 4, 17],\n [24, 4, 12, 4, 13],\n ],\n // v10\n [\n [18, 2, 68, 2, 69],\n [26, 4, 43, 1, 44],\n [24, 6, 19, 2, 20],\n [28, 6, 15, 2, 16],\n ],\n];\n\n/** Highest supported version. */\nconst MAX_VERSION = ECC_BLOCKS.length - 1;\n\n/**\n * Alignment-pattern centre coordinates per version. Alignment patterns are\n * placed at every (row, col) pair drawn from this list, except the three that\n * would collide with the finder patterns (the three outer corners).\n */\nconst ALIGN_POSITIONS: number[][] = [\n [], // 0\n [], // 1 — none\n [6, 18], // 2\n [6, 22], // 3\n [6, 26], // 4\n [6, 30], // 5\n [6, 34], // 6\n [6, 22, 38], // 7\n [6, 24, 42], // 8\n [6, 26, 46], // 9\n [6, 28, 50], // 10\n];\n\n// ── GF(256) arithmetic ──────────────────────────────────────────────────────\n// Galois field with primitive polynomial 0x11D (x^8 + x^4 + x^3 + x^2 + 1).\n\nconst GF_EXP = new Uint8Array(512);\nconst GF_LOG = new Uint8Array(256);\n(() => {\n let x = 1;\n for (let i = 0; i < 255; i++) {\n GF_EXP[i] = x;\n GF_LOG[x] = i;\n x <<= 1;\n if (x & 0x100) x ^= 0x11d;\n }\n for (let i = 255; i < 512; i++) GF_EXP[i] = GF_EXP[i - 255];\n})();\n\nfunction gfMul(a: number, b: number): number {\n if (a === 0 || b === 0) return 0;\n return GF_EXP[GF_LOG[a] + GF_LOG[b]];\n}\n\n/** Reed–Solomon generator polynomial (divisor) of the given degree. */\nfunction rsGenerator(degree: number): number[] {\n const result = new Array<number>(degree).fill(0);\n result[degree - 1] = 1; // start with the monomial 1 (coefficients low→high position)\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = gfMul(result[j], root);\n if (j + 1 < result.length) result[j] ^= result[j + 1];\n }\n root = gfMul(root, 0x02);\n }\n return result;\n}\n\n/** Reed–Solomon remainder (the ECC codewords) of `data` divided by `divisor`. */\nfunction rsRemainder(data: number[], divisor: number[]): number[] {\n const result = new Array<number>(divisor.length).fill(0);\n for (const b of data) {\n const factor = b ^ (result.shift() as number);\n result.push(0);\n for (let i = 0; i < divisor.length; i++) result[i] ^= gfMul(divisor[i], factor);\n }\n return result;\n}\n\n// ── Bit helpers ─────────────────────────────────────────────────────────────\n\nfunction getBit(x: number, i: number): boolean {\n return ((x >>> i) & 1) !== 0;\n}\n\n/** UTF-8 encode a string to a plain byte array (no runtime dependency). */\nfunction utf8Bytes(text: string): number[] {\n if (typeof TextEncoder !== 'undefined') {\n return Array.from(new TextEncoder().encode(text));\n }\n // Minimal fallback for environments without TextEncoder.\n const out: number[] = [];\n for (let i = 0; i < text.length; i++) {\n let code = text.charCodeAt(i);\n if (code >= 0xd800 && code <= 0xdbff && i + 1 < text.length) {\n const next = text.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n code = 0x10000 + ((code - 0xd800) << 10) + (next - 0xdc00);\n i++;\n }\n }\n if (code < 0x80) out.push(code);\n else if (code < 0x800) out.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n else if (code < 0x10000)\n out.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));\n else\n out.push(\n 0xf0 | (code >> 18),\n 0x80 | ((code >> 12) & 0x3f),\n 0x80 | ((code >> 6) & 0x3f),\n 0x80 | (code & 0x3f),\n );\n }\n return out;\n}\n\n// ── Capacity / version selection ────────────────────────────────────────────\n\n/** Total data codewords available at a given version + ECC level. */\nfunction dataCodewordCount(version: number, ecc: MkQrEcc): number {\n const [, g1n, g1d, g2n, g2d] = ECC_BLOCKS[version][ECC_INDEX[ecc]];\n return g1n * g1d + g2n * g2d;\n}\n\n/** Byte-mode character-count-indicator width: 8 bits for v1–9, 16 bits for v10+. */\nfunction charCountBits(version: number): number {\n return version < 10 ? 8 : 16;\n}\n\n/** Smallest supporting version, or throw if the payload is too large. */\nfunction selectVersion(byteLen: number, ecc: MkQrEcc): number {\n for (let v = 1; v <= MAX_VERSION; v++) {\n const needed = 4 + charCountBits(v) + byteLen * 8;\n if (needed <= dataCodewordCount(v, ecc) * 8) return v;\n }\n throw new Error(\n `mkEncodeQr: payload of ${byteLen} bytes is too large for QR versions 1–${MAX_VERSION} at ECC level ${ecc}.`,\n );\n}\n\n// ── Data codewords (encoding + padding + RS + interleaving) ──────────────────\n\nfunction buildCodewords(bytes: number[], version: number, ecc: MkQrEcc): number[] {\n const totalData = dataCodewordCount(version, ecc);\n const capacityBits = totalData * 8;\n\n // Bit buffer.\n const bits: number[] = [];\n const push = (val: number, len: number) => {\n for (let i = len - 1; i >= 0; i--) bits.push((val >> i) & 1);\n };\n\n push(0b0100, 4); // byte mode indicator\n push(bytes.length, charCountBits(version)); // character count\n for (const b of bytes) push(b, 8); // UTF-8 payload\n\n // Terminator: up to 4 zero bits, not exceeding capacity.\n push(0, Math.min(4, capacityBits - bits.length));\n // Pad to a byte boundary.\n while (bits.length % 8 !== 0) bits.push(0);\n\n // Convert to data codeword bytes.\n const dataCodewords: number[] = [];\n for (let i = 0; i < bits.length; i += 8) {\n let b = 0;\n for (let j = 0; j < 8; j++) b = (b << 1) | bits[i + j];\n dataCodewords.push(b);\n }\n // Pad bytes 0xEC / 0x11 alternating until full.\n const pad = [0xec, 0x11];\n for (let i = 0; dataCodewords.length < totalData; i++) dataCodewords.push(pad[i % 2]);\n\n // Split into ECC blocks.\n const [ecPerBlock, g1n, g1d, g2n] = ECC_BLOCKS[version][ECC_INDEX[ecc]];\n const totalBlocks = g1n + g2n;\n const divisor = rsGenerator(ecPerBlock);\n\n const dataBlocks: number[][] = [];\n const eccBlocks: number[][] = [];\n let offset = 0;\n for (let b = 0; b < totalBlocks; b++) {\n const len = b < g1n ? g1d : g1d + 1;\n const block = dataCodewords.slice(offset, offset + len);\n offset += len;\n dataBlocks.push(block);\n eccBlocks.push(rsRemainder(block, divisor));\n }\n\n // Interleave data codewords, then ECC codewords.\n const result: number[] = [];\n const maxData = Math.max(...dataBlocks.map((b) => b.length));\n for (let i = 0; i < maxData; i++) {\n for (const block of dataBlocks) if (i < block.length) result.push(block[i]);\n }\n for (let i = 0; i < ecPerBlock; i++) {\n for (const block of eccBlocks) result.push(block[i]);\n }\n return result;\n}\n\n// ── Matrix construction ─────────────────────────────────────────────────────\n\ninterface Grid {\n size: number;\n modules: boolean[][]; // true = dark\n fn: boolean[][]; // true = function module (not maskable, not data)\n}\n\nfunction makeGrid(version: number): Grid {\n const size = version * 4 + 17;\n const modules = Array.from({ length: size }, () => new Array<boolean>(size).fill(false));\n const fn = Array.from({ length: size }, () => new Array<boolean>(size).fill(false));\n return { size, modules, fn };\n}\n\nfunction setFn(g: Grid, r: number, c: number, dark: boolean): void {\n g.modules[r][c] = dark;\n g.fn[r][c] = true;\n}\n\nfunction drawFinder(g: Grid, cr: number, cc: number): void {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const r = cr + dy;\n const c = cc + dx;\n if (r < 0 || r >= g.size || c < 0 || c >= g.size) continue;\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n // dark for the 3×3 centre (dist ≤ 1) and the outer ring (dist 3);\n // white for the inner ring (dist 2) and the separator (dist 4).\n setFn(g, r, c, dist !== 2 && dist !== 4);\n }\n }\n}\n\nfunction drawAlignment(g: Grid, cr: number, cc: number): void {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n setFn(g, cr + dy, cc + dx, dist !== 1);\n }\n }\n}\n\nfunction drawFunctionPatterns(g: Grid, version: number, ecc: MkQrEcc): void {\n const n = g.size;\n\n // Timing patterns (drawn first; overlaps with finders are overwritten below).\n for (let i = 0; i < n; i++) {\n setFn(g, 6, i, i % 2 === 0);\n setFn(g, i, 6, i % 2 === 0);\n }\n\n // Three finder patterns (+ their separators).\n drawFinder(g, 3, 3);\n drawFinder(g, 3, n - 4);\n drawFinder(g, n - 4, 3);\n\n // Alignment patterns — all pairs except the three finder corners.\n const pos = ALIGN_POSITIONS[version];\n const last = pos.length - 1;\n for (let i = 0; i < pos.length; i++) {\n for (let j = 0; j < pos.length; j++) {\n if ((i === 0 && j === 0) || (i === 0 && j === last) || (i === last && j === 0)) continue;\n drawAlignment(g, pos[i], pos[j]);\n }\n }\n\n // Dark module.\n setFn(g, n - 8, 8, true);\n\n // Reserve format-info area (placeholder) and draw version info (v ≥ 7).\n drawFormatBits(g, ecc, 0);\n drawVersion(g, version);\n}\n\nfunction drawFormatBits(g: Grid, ecc: MkQrEcc, mask: number): void {\n const data = (ECC_FORMAT_BITS[ecc] << 3) | mask;\n let rem = data;\n for (let i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >>> 9) * 0x537);\n const bits = ((data << 10) | rem) ^ 0x5412; // 15-bit format string\n const n = g.size;\n\n // First copy — around the top-left finder.\n for (let i = 0; i <= 5; i++) setFn(g, 8, i, getBit(bits, i));\n setFn(g, 8, 7, getBit(bits, 6));\n setFn(g, 8, 8, getBit(bits, 7));\n setFn(g, 7, 8, getBit(bits, 8));\n for (let i = 9; i < 15; i++) setFn(g, 14 - i, 8, getBit(bits, i));\n\n // Second copy — split across the top-right and bottom-left finders.\n for (let i = 0; i < 8; i++) setFn(g, n - 1 - i, 8, getBit(bits, i));\n for (let i = 8; i < 15; i++) setFn(g, 8, n - 15 + i, getBit(bits, i));\n}\n\nfunction drawVersion(g: Grid, version: number): void {\n if (version < 7) return;\n let rem = version;\n for (let i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25);\n const bits = (version << 12) | rem; // 18-bit version string\n const n = g.size;\n for (let i = 0; i < 18; i++) {\n const bit = getBit(bits, i);\n const a = n - 11 + (i % 3);\n const b = Math.floor(i / 3);\n setFn(g, a, b, bit);\n setFn(g, b, a, bit);\n }\n}\n\n/** Place the interleaved codeword bit stream in the zig-zag pattern. */\nfunction placeData(g: Grid, codewords: number[]): void {\n const n = g.size;\n let bitIndex = 0;\n const totalBits = codewords.length * 8;\n const nextBit = (): boolean => {\n if (bitIndex >= totalBits) return false; // remainder bits are 0\n const bit = getBit(codewords[bitIndex >> 3], 7 - (bitIndex & 7));\n bitIndex++;\n return bit;\n };\n\n let upward = true;\n for (let col = n - 1; col > 0; col -= 2) {\n if (col === 6) col--; // skip the vertical timing column\n for (let i = 0; i < n; i++) {\n const row = upward ? n - 1 - i : i;\n for (let c = 0; c < 2; c++) {\n const cc = col - c;\n if (!g.fn[row][cc]) g.modules[row][cc] = nextBit();\n }\n }\n upward = !upward;\n }\n}\n\n// ── Masking ─────────────────────────────────────────────────────────────────\n\nfunction maskCondition(mask: number, r: number, c: number): boolean {\n switch (mask) {\n case 0:\n return (r + c) % 2 === 0;\n case 1:\n return r % 2 === 0;\n case 2:\n return c % 3 === 0;\n case 3:\n return (r + c) % 3 === 0;\n case 4:\n return (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0;\n case 5:\n return ((r * c) % 2) + ((r * c) % 3) === 0;\n case 6:\n return (((r * c) % 2) + ((r * c) % 3)) % 2 === 0;\n case 7:\n return (((r + c) % 2) + ((r * c) % 3)) % 2 === 0;\n default:\n return false;\n }\n}\n\n/** XOR the mask onto every non-function module (self-inverse). */\nfunction applyMask(g: Grid, mask: number): void {\n for (let r = 0; r < g.size; r++) {\n for (let c = 0; c < g.size; c++) {\n if (!g.fn[r][c] && maskCondition(mask, r, c)) g.modules[r][c] = !g.modules[r][c];\n }\n }\n}\n\nconst FINDER_LINE = [true, false, true, true, true, false, true, false, false, false, false];\nconst FINDER_LINE_REV = [...FINDER_LINE].reverse();\n\nfunction matchesAt(get: (i: number) => boolean, pattern: boolean[], start: number): boolean {\n for (let i = 0; i < pattern.length; i++) if (get(start + i) !== pattern[i]) return false;\n return true;\n}\n\n/** The four penalty rules; lower is better. */\nfunction penaltyScore(g: Grid): number {\n const n = g.size;\n const m = g.modules;\n let score = 0;\n\n // Rule 1 — runs of ≥ 5 same-colour modules in each row and column.\n for (let r = 0; r < n; r++) {\n let color = m[r][0];\n let run = 1;\n for (let c = 1; c < n; c++) {\n if (m[r][c] === color) run++;\n else {\n if (run >= 5) score += run - 2;\n color = m[r][c];\n run = 1;\n }\n }\n if (run >= 5) score += run - 2;\n }\n for (let c = 0; c < n; c++) {\n let color = m[0][c];\n let run = 1;\n for (let r = 1; r < n; r++) {\n if (m[r][c] === color) run++;\n else {\n if (run >= 5) score += run - 2;\n color = m[r][c];\n run = 1;\n }\n }\n if (run >= 5) score += run - 2;\n }\n\n // Rule 2 — 2×2 blocks of the same colour.\n for (let r = 0; r < n - 1; r++) {\n for (let c = 0; c < n - 1; c++) {\n const v = m[r][c];\n if (v === m[r][c + 1] && v === m[r + 1][c] && v === m[r + 1][c + 1]) score += 3;\n }\n }\n\n // Rule 3 — finder-like 1:1:3:1:1 pattern with 4 light modules on one side.\n for (let r = 0; r < n; r++) {\n for (let c = 0; c <= n - 11; c++) {\n const get = (i: number) => m[r][i];\n if (matchesAt(get, FINDER_LINE, c) || matchesAt(get, FINDER_LINE_REV, c)) score += 40;\n }\n }\n for (let c = 0; c < n; c++) {\n for (let r = 0; r <= n - 11; r++) {\n const get = (i: number) => m[i][c];\n if (matchesAt(get, FINDER_LINE, r) || matchesAt(get, FINDER_LINE_REV, r)) score += 40;\n }\n }\n\n // Rule 4 — deviation of the dark-module ratio from 50%.\n let dark = 0;\n for (let r = 0; r < n; r++) for (let c = 0; c < n; c++) if (m[r][c]) dark++;\n const percent = (dark * 100) / (n * n);\n score += Math.floor(Math.abs(percent - 50) / 5) * 10;\n\n return score;\n}\n\n// ── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Encode `text` (UTF-8, byte mode) as a QR code module matrix.\n *\n * @param text The payload. May be empty.\n * @param ecc Error-correction level: `L` (~7%), `M` (~15%), `Q` (~25%), `H` (~30%).\n * @returns A square `boolean[][]` where `true` marks a dark module. The side\n * length is `17 + 4 * version` (21 for v1 … 57 for v10).\n * @throws If the payload does not fit in versions 1–10 at the chosen ECC level.\n */\nexport function mkEncodeQr(text: string, ecc: MkQrEcc): boolean[][] {\n const bytes = utf8Bytes(text);\n const version = selectVersion(bytes.length, ecc);\n const codewords = buildCodewords(bytes, version, ecc);\n\n const g = makeGrid(version);\n drawFunctionPatterns(g, version, ecc);\n placeData(g, codewords);\n\n // Choose the mask with the lowest penalty.\n let bestMask = 0;\n let bestScore = Infinity;\n for (let mask = 0; mask < 8; mask++) {\n applyMask(g, mask);\n drawFormatBits(g, ecc, mask);\n const score = penaltyScore(g);\n if (score < bestScore) {\n bestScore = score;\n bestMask = mask;\n }\n applyMask(g, mask); // undo (XOR is self-inverse)\n }\n applyMask(g, bestMask);\n drawFormatBits(g, ecc, bestMask);\n\n return g.modules;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkEncodeQr, MkQrEcc } from './qr-encode';\n\n/**\n * QR Code — a dependency-free QR generator rendered as an SVG. The entire\n * encoding (byte mode, Reed–Solomon ECC, masking, format info) is implemented\n * from scratch in {@link mkEncodeQr}; no npm library is used. Dark modules are\n * drawn as `<rect>`s over a background rectangle that also fills the quiet zone,\n * so the code is theme-aware (`var(--mk-text)` on `var(--mk-surface)`) and\n * fully overridable. Exposes `role=\"img\"` with an `aria-label` for assistive\n * tech.\n *\n * Supports versions 1–10 and ECC levels L/M/Q/H (byte mode / UTF-8).\n *\n * ```html\n * <mk-qr-code value=\"https://example.com\" ecc=\"M\" [size]=\"200\" />\n * ```\n */\n@Component({\n selector: 'mk-qr-code',\n templateUrl: './qr-code.html',\n styleUrl: './qr-code.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-qr-code',\n role: 'img',\n '[attr.aria-label]': 'effectiveLabel()',\n },\n})\nexport class MkQrCode {\n protected readonly i18n = inject(MK_I18N);\n\n /** The text to encode (UTF-8, byte mode). */\n readonly value = input.required<string>();\n /** Error-correction level: `L` (~7%), `M` (~15%), `Q` (~25%), `H` (~30%). */\n readonly ecc = input<MkQrEcc>('M');\n /** Rendered pixel size of the (square) SVG. */\n readonly size = input(160, { transform: numberAttribute });\n /** Width of the light margin around the code, in modules (spec recommends 4). */\n readonly quietZone = input(4, { transform: numberAttribute });\n /** Dark-module colour. */\n readonly color = input('var(--mk-text)');\n /** Background / quiet-zone colour. */\n readonly background = input('var(--mk-surface)');\n /**\n * Accessible label for the image. When omitted, the label carries the\n * encoded content (`QR code: <value>`) so AT users learn what the code says.\n */\n readonly label = input('');\n\n /** The label actually exposed on the host: `label`, or a generated default. */\n protected readonly effectiveLabel = computed(\n () => this.label() || this.i18n.qrCodeLabel(this.value()),\n );\n\n /** The module matrix (`true` = dark); empty if encoding fails (e.g. too long). */\n protected readonly matrix = computed<boolean[][]>(() => {\n try {\n return mkEncodeQr(this.value() ?? '', this.ecc());\n } catch {\n return [];\n }\n });\n\n /** Quiet zone clamped to a non-negative integer. */\n protected readonly quiet = computed(() => Math.max(0, Math.round(this.quietZone())));\n\n /** Side length of the viewBox in modules (code + both quiet-zone margins). */\n protected readonly dimension = computed(() => this.matrix().length + 2 * this.quiet());\n\n /** Top-left coordinates (in module units) of every dark module. */\n protected readonly modules = computed(() => {\n const m = this.matrix();\n const q = this.quiet();\n const out: { x: number; y: number }[] = [];\n for (let r = 0; r < m.length; r++) {\n const row = m[r];\n for (let c = 0; c < row.length; c++) {\n if (row[c]) out.push({ x: c + q, y: r + q });\n }\n }\n return out;\n });\n}\n","<svg\n class=\"mk-qr-code__svg\"\n [attr.viewBox]=\"'0 0 ' + dimension() + ' ' + dimension()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n preserveAspectRatio=\"xMidYMid meet\"\n shape-rendering=\"crispEdges\"\n aria-hidden=\"true\"\n focusable=\"false\"\n>\n <rect\n class=\"mk-qr-code__bg\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"dimension()\"\n [attr.height]=\"dimension()\"\n [style.fill]=\"background()\"\n />\n @for (module of modules(); track $index) {\n <rect\n class=\"mk-qr-code__module\"\n [attr.x]=\"module.x\"\n [attr.y]=\"module.y\"\n width=\"1\"\n height=\"1\"\n [style.fill]=\"color()\"\n />\n }\n</svg>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n numberAttribute,\n signal,\n untracked,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** One rendered node of the JSON tree. */\nexport interface MkJsonNode {\n /** Property name / array index; `null` for the root. */\n key: string | null;\n /** Node kind (drives colouring + expandability). */\n type: 'object' | 'array' | 'string' | 'number' | 'boolean' | 'null' | 'circular';\n /** Display text for primitives. */\n display: string;\n /** Children for objects/arrays. */\n children: MkJsonNode[];\n /** Unique path (e.g. `$.users[0].name`) used for expansion tracking. */\n path: string;\n /** Nesting depth (root = 0). */\n depth: number;\n}\n\n/** Build the node tree for a JSON-ish value (circular refs marked). */\nexport function mkBuildJsonTree(value: unknown): MkJsonNode {\n const seen = new WeakSet<object>();\n\n const build = (\n v: unknown,\n key: string | null,\n path: string,\n depth: number,\n ): MkJsonNode => {\n if (v === null || v === undefined) {\n return { key, type: 'null', display: String(v), children: [], path, depth };\n }\n if (typeof v === 'string') {\n return { key, type: 'string', display: JSON.stringify(v), children: [], path, depth };\n }\n if (typeof v === 'number' || typeof v === 'bigint') {\n return { key, type: 'number', display: String(v), children: [], path, depth };\n }\n if (typeof v === 'boolean') {\n return { key, type: 'boolean', display: String(v), children: [], path, depth };\n }\n if (typeof v === 'object') {\n if (seen.has(v)) {\n return { key, type: 'circular', display: '[Circular]', children: [], path, depth };\n }\n seen.add(v);\n if (Array.isArray(v)) {\n const children = v.map((item, i) =>\n build(item, String(i), `${path}[${i}]`, depth + 1),\n );\n seen.delete(v);\n return { key, type: 'array', display: '', children, path, depth };\n }\n const children = Object.entries(v as Record<string, unknown>).map(\n ([k, item]) => build(item, k, `${path}.${k}`, depth + 1),\n );\n seen.delete(v);\n return { key, type: 'object', display: '', children, path, depth };\n }\n // Functions/symbols — not JSON, shown as text.\n return { key, type: 'null', display: String(v), children: [], path, depth };\n };\n\n return build(value, null, '$', 0);\n}\n\n/**\n * JsonViewer — a read-only, collapsible tree for JSON-ish data: objects and\n * arrays fold behind disclosure buttons (with a `{…} n items` preview),\n * primitives are colour-coded by type, and circular references render as\n * `[Circular]` instead of recursing. `expandDepth` controls how much is open\n * initially; `expandAll()` / `collapseAll()` are available on the component.\n *\n * The complement of `mk-code-editor`: the editor edits JSON text, this\n * explores JSON *data* (API responses, entity payloads, config dumps).\n *\n * ```html\n * <mk-json-viewer [data]=\"response\" [expandDepth]=\"2\" />\n * ```\n */\n@Component({\n selector: 'mk-json-viewer',\n templateUrl: './json-viewer.html',\n styleUrl: './json-viewer.scss',\n exportAs: 'mkJsonViewer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: {\n class: 'mk-json-viewer',\n // The host scrolls horizontally; make it keyboard-scrollable (WCAG 2.1.1).\n role: 'region',\n tabindex: '0',\n '[attr.aria-label]': 'ariaLabel()',\n },\n})\nexport class MkJsonViewer {\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n\n /** The value to display (any JSON-serialisable data). */\n readonly data = input.required<unknown>();\n /** How many levels start expanded (root = level 1). */\n readonly expandDepth = input(1, { transform: numberAttribute });\n /** Accessible label of the tree region. */\n readonly ariaLabel = input<string>(this.i18n.jsonLabel, {\n alias: 'aria-label',\n });\n\n /**\n * Paths currently expanded. Mutated in place — a toggle is O(1) instead of\n * copying the whole set — with `expansionVersion` bumped so signal-driven\n * bindings re-evaluate. Always read through {@link isExpanded}.\n */\n private readonly expanded = new Set<string>();\n /** Bumped on every expansion change; the reactive face of `expanded`. */\n private readonly expansionVersion = signal(0);\n\n /** The built node tree. */\n protected readonly root = computed(() => mkBuildJsonTree(this.data()));\n\n /**\n * Collapsed previews, cached per node so template bindings don't rebuild the\n * string on every change-detection pass. Keyed weakly: entries die with the\n * tree when `data` changes.\n */\n private readonly previews = new WeakMap<MkJsonNode, string>();\n\n constructor() {\n // Reset expansion to `expandDepth` whenever the data (or depth) changes.\n effect(() => {\n const root = this.root();\n const depth = this.expandDepth();\n untracked(() => this.replaceExpanded(collectToDepth(root, depth)));\n });\n }\n\n protected isExpanded(path: string): boolean {\n this.expansionVersion(); // Track: re-evaluate when expansion changes.\n return this.expanded.has(path);\n }\n\n protected toggle(path: string): void {\n if (!this.expanded.delete(path)) this.expanded.add(path);\n this.expansionVersion.update((v) => v + 1);\n }\n\n /** Expand every object/array node. */\n expandAll(): void {\n this.replaceExpanded(collectToDepth(this.root(), Number.POSITIVE_INFINITY));\n }\n\n /** Collapse everything (the root stays visible). */\n collapseAll(): void {\n this.replaceExpanded(EMPTY_PATHS);\n }\n\n /** Swap the expansion set's contents and notify bindings. */\n private replaceExpanded(paths: ReadonlySet<string>): void {\n this.expanded.clear();\n for (const path of paths) this.expanded.add(path);\n this.expansionVersion.update((v) => v + 1);\n }\n\n /** Collapsed preview, e.g. `{…}` / `[…]` + item count (cached per node). */\n protected preview(node: MkJsonNode): string {\n let text = this.previews.get(node);\n if (text === undefined) {\n const braces = node.type === 'array' ? '[…]' : '{…}';\n text = `${braces} ${this.i18n.groupCount(node.children.length)}`;\n this.previews.set(node, text);\n }\n return text;\n }\n}\n\nconst EMPTY_PATHS: ReadonlySet<string> = new Set();\n\n/** All container paths with depth < `maxDepth`. */\nfunction collectToDepth(root: MkJsonNode, maxDepth: number): Set<string> {\n const paths = new Set<string>();\n const walk = (node: MkJsonNode): void => {\n if (node.children.length === 0 && node.type !== 'object' && node.type !== 'array') {\n return;\n }\n if (node.type === 'object' || node.type === 'array') {\n if (node.depth < maxDepth) paths.add(node.path);\n node.children.forEach(walk);\n }\n };\n walk(root);\n return paths;\n}\n","<div class=\"mk-json-viewer__root\" role=\"group\" [attr.aria-label]=\"ariaLabel()\">\n <ng-container\n *ngTemplateOutlet=\"nodeTpl; context: { $implicit: root() }\"\n />\n</div>\n\n<ng-template #nodeTpl let-node>\n @if (node.type === 'object' || node.type === 'array') {\n <div class=\"mk-json-viewer__node\">\n <button\n type=\"button\"\n class=\"mk-json-viewer__toggle\"\n [attr.aria-expanded]=\"isExpanded(node.path)\"\n [attr.aria-label]=\"node.key === null ? ariaLabel() : null\"\n (click)=\"toggle(node.path)\"\n >\n <span class=\"mk-json-viewer__chevron\" aria-hidden=\"true\"></span>\n @if (node.key !== null) {\n <span class=\"mk-json-viewer__key\">{{ node.key }}</span>\n <span class=\"mk-json-viewer__colon\" aria-hidden=\"true\">:</span>\n }\n @if (!isExpanded(node.path)) {\n <span class=\"mk-json-viewer__preview\">{{ preview(node) }}</span>\n } @else {\n <span class=\"mk-json-viewer__brace\" aria-hidden=\"true\">{{\n node.type === 'array' ? '[' : '{'\n }}</span>\n }\n </button>\n @if (isExpanded(node.path)) {\n <ul class=\"mk-json-viewer__children\">\n @for (child of node.children; track child.path) {\n <li>\n <ng-container\n *ngTemplateOutlet=\"nodeTpl; context: { $implicit: child }\"\n />\n </li>\n } @empty {\n <li class=\"mk-json-viewer__empty\">{{ i18n.noData }}</li>\n }\n </ul>\n <span class=\"mk-json-viewer__brace\" aria-hidden=\"true\">{{\n node.type === 'array' ? ']' : '}'\n }}</span>\n }\n </div>\n } @else {\n <div class=\"mk-json-viewer__leaf\">\n @if (node.key !== null) {\n <span class=\"mk-json-viewer__key\">{{ node.key }}</span>\n <span class=\"mk-json-viewer__colon\" aria-hidden=\"true\">:</span>\n }\n <span\n class=\"mk-json-viewer__value\"\n [class.mk-json-viewer__value--string]=\"node.type === 'string'\"\n [class.mk-json-viewer__value--number]=\"node.type === 'number'\"\n [class.mk-json-viewer__value--boolean]=\"node.type === 'boolean'\"\n [class.mk-json-viewer__value--null]=\"\n node.type === 'null' || node.type === 'circular'\n \"\n >{{ node.display }}</span\n >\n </div>\n }\n</ng-template>\n","/** Delegates to `@mk-kit/core` — the exported names are unchanged. */\nexport { mkParseAnsi, mkStripAnsi, type MkAnsiSpan } from '@mk-kit/core';\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n PLATFORM_ID,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkCopyToClipboard } from '@mk-kit/ui/directives';\nimport { type MkAnsiSpan, mkParseAnsi, mkStripAnsi } from './ansi';\n\n/** One render token of a log line: a styled run, optionally a search match. */\nexport interface MkLogToken {\n text: string;\n /** Space-joined `mk-ansi--*` classes ('' for plain text). */\n cls: string;\n /** True when the token is part of a search-query match. */\n mark: boolean;\n}\n\ninterface MkLogLine {\n /** Absolute index within the (ring-buffered) lines. */\n index: number;\n tokens: MkLogToken[];\n}\n\n/** Rows rendered above/below the viewport to smooth fast scrolls. */\nconst OVERSCAN = 6;\n/** Upper bound on the wrap-mode parse cache before it is reset. */\nconst PARSE_CACHE_MAX = 20_000;\n\n/**\n * LogViewer — a virtualized, tail-following log / terminal pane. Renders only\n * the visible window of a (ring-buffered) line array, parses ANSI SGR colour\n * codes into theme-aware spans, follows new output at the bottom until the\n * user scrolls away, and highlights plain-string search matches.\n *\n * ```html\n * <mk-log-viewer\n * [lines]=\"lines()\"\n * [(follow)]=\"follow\"\n * [query]=\"search()\"\n * (matches)=\"count.set($event)\"\n * />\n * ```\n *\n * Wrap mode (`[wrap]=\"true\"` or the toolbar toggle) soft-wraps long lines;\n * because wrapped rows have no fixed height, wrap mode renders **without**\n * virtualization — fine up to a few thousand lines, so keep `maxLines`\n * modest when wrapping is expected.\n *\n * `query` is matched as a case-insensitive plain string — no regex.\n */\n@Component({\n selector: 'mk-log-viewer',\n templateUrl: './log-viewer.html',\n styleUrl: './log-viewer.scss',\n exportAs: 'mkLogViewer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkCopyToClipboard],\n host: { class: 'mk-log-viewer' },\n})\nexport class MkLogViewer {\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly viewportRef =\n viewChild<ElementRef<HTMLElement>>('viewport');\n\n /** The log lines (may contain ANSI SGR escape sequences). */\n readonly lines = input<readonly string[]>([]);\n /** Stick to the bottom as new lines arrive (two-way; detaches on scroll-up). */\n readonly follow = model(true);\n /** Soft-wrap long lines (two-way; disables virtualization — see class docs). */\n readonly wrap = model(false);\n /** Parse ANSI SGR colour codes; `false` renders lines verbatim. */\n readonly ansi = input(true, { transform: booleanAttribute });\n /** Case-insensitive plain-string search; matches are highlighted. */\n readonly query = input('');\n /** Ring buffer size: oldest lines are dropped beyond this. */\n readonly maxLines = input(10_000, { transform: numberAttribute });\n /** Fixed row height in px (drives virtualization; also sets line-height). */\n readonly itemHeight = input(20, { transform: numberAttribute });\n /** Hide the built-in toolbar row. */\n readonly hideToolbar = input(false, { transform: booleanAttribute });\n /** Accessible label of the log region. */\n readonly ariaLabel = input<string>(this.i18n.logViewerLabel, {\n alias: 'aria-label',\n });\n\n /** Emits the total number of `query` matches whenever it changes. */\n readonly matches = output<number>();\n\n // --- Ring buffer ----------------------------------------------------------\n\n /** The lines actually shown: the newest `maxLines` of `lines`. */\n protected readonly buffered = computed<readonly string[]>(() => {\n const lines = this.lines();\n const max = Math.max(1, this.maxLines());\n return lines.length > max ? lines.slice(lines.length - max) : lines;\n });\n\n // --- Virtual window (same technique as MkVirtualScroll) -------------------\n\n protected readonly scrollTop = signal(0);\n protected readonly viewportHeight = signal(0);\n\n protected readonly totalHeight = computed(\n () => this.buffered().length * this.itemHeight(),\n );\n\n private readonly range = computed(\n () => {\n const ih = this.itemHeight() || 1;\n const count = this.buffered().length;\n const visible = Math.ceil(this.viewportHeight() / ih);\n const start = Math.max(0, Math.floor(this.scrollTop() / ih) - OVERSCAN);\n const end = Math.min(count, start + visible + OVERSCAN * 2);\n return { start, end };\n },\n { equal: (a, b) => a.start === b.start && a.end === b.end },\n );\n\n protected readonly offset = computed(\n () => this.range().start * this.itemHeight(),\n );\n\n /** The virtualized window — only ~viewport+overscan lines are parsed. */\n protected readonly visibleLines = computed<MkLogLine[]>(() => {\n const { start, end } = this.range();\n const lines = this.buffered();\n const out: MkLogLine[] = [];\n for (let i = start; i < end; i++) out.push(this.renderLine(lines[i], i, false));\n return out;\n });\n\n /** Wrap mode: every line, non-virtualized (parse memoized per content). */\n protected readonly wrappedLines = computed<MkLogLine[]>(() =>\n this.buffered().map((line, i) => this.renderLine(line, i, true)),\n );\n\n // --- Search ---------------------------------------------------------------\n\n /** Total number of case-insensitive plain-string matches of `query`. */\n readonly matchCount = computed(() => {\n const q = this.query().toLowerCase();\n if (!q) return 0;\n const useAnsi = this.ansi();\n let count = 0;\n for (const raw of this.buffered()) {\n const text = (useAnsi ? mkStripAnsi(raw) : raw).toLowerCase();\n for (let i = text.indexOf(q); i !== -1; i = text.indexOf(q, i + q.length)) {\n count++;\n }\n }\n return count;\n });\n\n // --- Copy -----------------------------------------------------------------\n\n /** The full buffer as plain text (escapes stripped) for copy-all. */\n protected readonly allText = computed(() => {\n const useAnsi = this.ansi();\n return this.buffered()\n .map((line) => (useAnsi ? mkStripAnsi(line) : line))\n .join('\\n');\n });\n\n /**\n * Wrap-mode parse cache, keyed by line content: appending N lines re-parses\n * only the N new ones (duplicate lines share one entry — harmless, spans\n * are immutable render data). Virtual mode skips it: parsing the ~30-row\n * window per render is cheaper than any bookkeeping.\n */\n private readonly parseCache = new Map<string, MkAnsiSpan[]>();\n\n /** Guards against treating our own scrollTop writes as user scrolling. */\n private programmaticScroll = false;\n private resizeObserver?: ResizeObserver;\n\n constructor() {\n afterNextRender(() => {\n this.measure();\n const view = this.viewportRef()?.nativeElement;\n if (view && this.isBrowser && 'ResizeObserver' in window) {\n this.resizeObserver = new ResizeObserver(() => {\n this.measure();\n // Keep the tail pinned when the pane itself resizes.\n if (this.follow()) this.scrollToBottom();\n });\n this.resizeObserver.observe(view);\n }\n });\n\n // Follow mode: pin to the bottom after any render that changed the\n // content (new lines, wrap toggle) or re-enabled follow.\n afterRenderEffect(() => {\n this.buffered();\n this.wrap();\n if (this.follow()) untracked(() => this.scrollToBottom());\n });\n\n // Surface the match count as an output.\n effect(() => this.matches.emit(this.matchCount()));\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n /** Re-enable follow mode and jump to the newest line. */\n protected resumeFollow(): void {\n this.follow.set(true);\n this.scrollToBottom();\n }\n\n protected onScroll(event: Event): void {\n const view = event.target as HTMLElement;\n this.scrollTop.set(view.scrollTop);\n if (this.programmaticScroll) {\n this.programmaticScroll = false;\n return;\n }\n const distance = view.scrollHeight - view.clientHeight - view.scrollTop;\n const threshold = Math.max(this.itemHeight() * 2, 32);\n if (distance > threshold) {\n if (this.follow()) this.follow.set(false);\n } else if (!this.follow()) {\n // Scrolled back to the tail — re-stick, like every log UI.\n this.follow.set(true);\n }\n }\n\n private scrollToBottom(): void {\n const view = this.viewportRef()?.nativeElement;\n if (!view) return;\n const target = view.scrollHeight - view.clientHeight;\n if (view.scrollTop >= target) return; // already at the bottom\n this.programmaticScroll = true;\n view.scrollTop = target;\n this.scrollTop.set(view.scrollTop);\n }\n\n private measure(): void {\n const view = this.viewportRef()?.nativeElement;\n if (view) this.viewportHeight.set(view.clientHeight);\n }\n\n // --- Line rendering -------------------------------------------------------\n\n private parse(raw: string, cached: boolean): MkAnsiSpan[] {\n if (!cached) return mkParseAnsi(raw);\n let spans = this.parseCache.get(raw);\n if (!spans) {\n if (this.parseCache.size >= PARSE_CACHE_MAX) this.parseCache.clear();\n spans = mkParseAnsi(raw);\n this.parseCache.set(raw, spans);\n }\n return spans;\n }\n\n /** Turn one raw line into render tokens (ANSI spans split at matches). */\n private renderLine(raw: string, index: number, cached: boolean): MkLogLine {\n const spans: readonly MkAnsiSpan[] = this.ansi()\n ? this.parse(raw, cached)\n : raw\n ? [{ text: raw, classes: [] }]\n : [];\n\n const q = this.query().toLowerCase();\n const tokens: MkLogToken[] = [];\n\n if (!q) {\n for (const s of spans) {\n if (s.text) tokens.push({ text: s.text, cls: s.classes.join(' '), mark: false });\n }\n } else {\n // Match ranges over the line's plain text…\n const plain = spans.map((s) => s.text).join('');\n const lower = plain.toLowerCase();\n const ranges: [number, number][] = [];\n for (let i = lower.indexOf(q); i !== -1; i = lower.indexOf(q, i + q.length)) {\n ranges.push([i, i + q.length]);\n }\n // …then split each styled span at the range boundaries.\n let offset = 0;\n for (const s of spans) {\n const cls = s.classes.join(' ');\n const start = offset;\n const end = offset + s.text.length;\n let pos = start;\n for (const [rs, re] of ranges) {\n if (re <= start) continue;\n if (rs >= end) break;\n const from = Math.max(rs, start);\n const to = Math.min(re, end);\n if (from > pos) {\n tokens.push({ text: s.text.slice(pos - start, from - start), cls, mark: false });\n }\n tokens.push({ text: s.text.slice(from - start, to - start), cls, mark: true });\n pos = to;\n }\n if (pos < end) {\n tokens.push({ text: s.text.slice(pos - start), cls, mark: false });\n }\n offset = end;\n }\n }\n\n // A blank line still occupies a row (white-space: pre keeps the space).\n if (tokens.length === 0) tokens.push({ text: ' ', cls: '', mark: false });\n return { index, tokens };\n }\n}\n","@if (!hideToolbar()) {\n <div class=\"mk-log-viewer__toolbar\">\n <ng-content />\n <span class=\"mk-log-viewer__toolbar-spacer\"></span>\n <button\n type=\"button\"\n class=\"mk-log-viewer__tool\"\n [class.mk-log-viewer__tool--active]=\"wrap()\"\n [attr.aria-pressed]=\"wrap()\"\n (click)=\"wrap.set(!wrap())\"\n >\n {{ i18n.logWrapLines }}\n </button>\n <button\n type=\"button\"\n class=\"mk-log-viewer__tool\"\n [mkCopyToClipboard]=\"allText()\"\n #copier=\"mkCopyToClipboard\"\n >\n {{ copier.justCopied() ? '✓ ' + i18n.logCopyAll : i18n.logCopyAll }}\n </button>\n </div>\n}\n\n<div class=\"mk-log-viewer__body\">\n <!--\n role=\"log\" makes additions politely announced without re-reading the whole\n buffer; tabindex=\"0\" keeps the overflowing region keyboard-scrollable.\n Tokens are emitted on one line: the rows render `white-space: pre`, so any\n inter-element template whitespace would corrupt log alignment.\n -->\n <div\n #viewport\n class=\"mk-log-viewer__viewport\"\n role=\"log\"\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabel()\"\n (scroll)=\"onScroll($event)\"\n >\n @if (wrap()) {\n <div class=\"mk-log-viewer__lines mk-log-viewer__lines--wrap\">\n @for (line of wrappedLines(); track line.index) {\n <div class=\"mk-log-viewer__line\">@for (t of line.tokens; track $index) {@if (t.mark) {<mark class=\"mk-log-viewer__match {{ t.cls }}\">{{ t.text }}</mark>} @else {<span class=\"{{ t.cls }}\">{{ t.text }}</span>}}</div>\n }\n </div>\n } @else {\n <div class=\"mk-log-viewer__spacer\" [style.height.px]=\"totalHeight()\">\n <div\n class=\"mk-log-viewer__window\"\n [style.transform]=\"'translateY(' + offset() + 'px)'\"\n >\n @for (line of visibleLines(); track line.index) {\n <div\n class=\"mk-log-viewer__line\"\n [style.height.px]=\"itemHeight()\"\n [style.line-height.px]=\"itemHeight()\"\n >@for (t of line.tokens; track $index) {@if (t.mark) {<mark class=\"mk-log-viewer__match {{ t.cls }}\">{{ t.text }}</mark>} @else {<span class=\"{{ t.cls }}\">{{ t.text }}</span>}}</div>\n }\n </div>\n </div>\n }\n </div>\n\n @if (!follow()) {\n <button\n type=\"button\"\n class=\"mk-log-viewer__follow\"\n (click)=\"resumeFollow()\"\n >\n {{ i18n.logFollow }} <span aria-hidden=\"true\">↓</span>\n </button>\n }\n</div>\n\n@if (query()) {\n <span class=\"mk-visually-hidden\" aria-live=\"polite\">\n {{ i18n.resultsCount(matchCount()) }}\n </span>\n}\n","/** Delegates to `@mk-kit/core` — the exported names are unchanged. */\nexport {\n mkParseMarkdown,\n mkRenderMarkdown,\n type MkMarkdownAlign,\n type MkMarkdownBlock,\n type MkMarkdownInline,\n type MkMarkdownList,\n type MkMarkdownListItem,\n type MkMarkdownParseOptions,\n type MkMarkdownRenderOptions,\n} from '@mk-kit/core';\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { mkParseMarkdown, mkRenderMarkdown } from './markdown-parse';\n\n/**\n * Markdown — renders a CommonMark subset (see {@link mkParseMarkdown} for the\n * exact syntax list) with zero runtime dependencies. Built for admin-app\n * content: changelogs, AI output, user notes.\n *\n * SECURITY MODEL: raw HTML in the source is never passed through — it is\n * always escaped and shown as text, and link/image URLs are restricted to\n * http/https/mailto/relative, so the rendered string contains only markup the\n * renderer itself generates. It is bound via `[innerHTML]` and additionally\n * passes through Angular's `DomSanitizer` (no `bypassSecurityTrustHtml`),\n * which keeps every element and attribute the renderer emits.\n *\n * ```html\n * <mk-markdown [source]=\"changelog\" linkTarget=\"_blank\" />\n * ```\n */\n@Component({\n selector: 'mk-markdown',\n templateUrl: './markdown.html',\n styleUrl: './markdown.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // Unencapsulated: the markup arrives via [innerHTML], which emulated\n // encapsulation attributes never reach. Every rule in markdown.scss is\n // namespaced under `.mk-markdown` so nothing leaks.\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mk-markdown' },\n})\nexport class MkMarkdown {\n /** Markdown source text. */\n readonly source = input('');\n /** Turn bare `http(s)://…` URLs into links. Off by default. */\n readonly autolink = input(false, { transform: booleanAttribute });\n /** Link target; `'_blank'` also adds `rel=\"noopener noreferrer\"`. */\n readonly linkTarget = input<'' | '_blank'>('');\n\n /** The rendered (safe-by-construction) HTML string. */\n protected readonly html = computed(() =>\n mkRenderMarkdown(mkParseMarkdown(this.source(), { autolink: this.autolink() }), {\n linkTarget: this.linkTarget(),\n }),\n );\n}\n","<!-- Safe by construction: the renderer escapes all source text, and Angular's\n sanitizer re-checks the markup here (same pattern as mk-code). -->\n<div class=\"mk-markdown__body\" [innerHTML]=\"html()\"></div>\n","/**\n * Data Display components group barrel for @mk-kit/ui.\n * Re-exports every public symbol from each component folder.\n * (Icon, chip and table are their own entry points — import\n * `@mk-kit/ui/icon` / `/chip` / `/table` directly.)\n */\nexport * from './card';\nexport * from './divider';\nexport * from './badge';\nexport * from './tag';\nexport * from './avatar';\nexport * from './list';\nexport * from './empty-state';\nexport * from './timeline';\nexport * from './org-chart';\nexport * from './stat-card';\nexport * from './profile-card';\nexport * from './progress-bar';\nexport * from './progress-ring';\nexport * from './spinner';\nexport * from './charts';\nexport * from './skeleton';\nexport * from './inline-edit';\nexport * from './countdown';\nexport * from './description-list';\nexport * from './code';\nexport * from './virtual-scroll';\nexport * from './carousel';\nexport * from './diff';\nexport * from './kanban';\nexport * from './qr-code';\nexport * from './json-viewer';\nexport * from './log-viewer';\nexport * from './markdown';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["MARGIN","DOCUMENT"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mk-kit-ui-data.mjs","sources":["../../../projects/mk-kit/data/card/card.ts","../../../projects/mk-kit/data/card/card.html","../../../projects/mk-kit/data/card/card-parts.ts","../../../projects/mk-kit/data/divider/divider.ts","../../../projects/mk-kit/data/divider/divider.html","../../../projects/mk-kit/data/tag/tag.ts","../../../projects/mk-kit/data/tag/tag.html","../../../projects/mk-kit/data/avatar/avatar.ts","../../../projects/mk-kit/data/avatar/avatar.html","../../../projects/mk-kit/data/avatar/avatar-group.ts","../../../projects/mk-kit/data/avatar/avatar-group.html","../../../projects/mk-kit/data/list/list.ts","../../../projects/mk-kit/data/list/list.html","../../../projects/mk-kit/data/list/list-item.ts","../../../projects/mk-kit/data/list/list-item.html","../../../projects/mk-kit/data/timeline/timeline.ts","../../../projects/mk-kit/data/timeline/timeline-item.ts","../../../projects/mk-kit/data/timeline/timeline-item.html","../../../projects/mk-kit/data/org-chart/org-chart.ts","../../../projects/mk-kit/data/org-chart/org-chart.html","../../../projects/mk-kit/data/stat-card/stat-card.ts","../../../projects/mk-kit/data/stat-card/stat-card.html","../../../projects/mk-kit/data/profile-card/profile-card.ts","../../../projects/mk-kit/data/profile-card/profile-card.html","../../../projects/mk-kit/data/progress-bar/progress-bar.ts","../../../projects/mk-kit/data/progress-bar/progress-bar.html","../../../projects/mk-kit/data/progress-ring/progress-ring.ts","../../../projects/mk-kit/data/progress-ring/progress-ring.html","../../../projects/mk-kit/data/charts/chart-utils.ts","../../../projects/mk-kit/data/charts/sparkline.ts","../../../projects/mk-kit/data/charts/sparkline.html","../../../projects/mk-kit/data/charts/chart-autowidth.ts","../../../projects/mk-kit/data/charts/chart-tap-pin.ts","../../../projects/mk-kit/data/charts/bar-chart.ts","../../../projects/mk-kit/data/charts/bar-chart.html","../../../projects/mk-kit/data/charts/line-chart.ts","../../../projects/mk-kit/data/charts/line-chart.html","../../../projects/mk-kit/data/charts/donut-chart.ts","../../../projects/mk-kit/data/charts/donut-chart.html","../../../projects/mk-kit/data/charts/gauge.ts","../../../projects/mk-kit/data/charts/gauge.html","../../../projects/mk-kit/data/charts/scatter-chart.ts","../../../projects/mk-kit/data/charts/scatter-chart.html","../../../projects/mk-kit/data/charts/heatmap.ts","../../../projects/mk-kit/data/charts/heatmap.html","../../../projects/mk-kit/data/charts/calendar-heatmap.ts","../../../projects/mk-kit/data/charts/calendar-heatmap.html","../../../projects/mk-kit/data/charts/radar-chart.ts","../../../projects/mk-kit/data/charts/radar-chart.html","../../../projects/mk-kit/data/charts/funnel-chart.ts","../../../projects/mk-kit/data/charts/funnel-chart.html","../../../projects/mk-kit/data/charts/treemap.ts","../../../projects/mk-kit/data/charts/treemap.html","../../../projects/mk-kit/data/skeleton/skeleton.ts","../../../projects/mk-kit/data/skeleton/skeleton.html","../../../projects/mk-kit/data/skeleton/skeleton-preset.ts","../../../projects/mk-kit/data/skeleton/skeleton-preset.html","../../../projects/mk-kit/data/inline-edit/inline-edit.ts","../../../projects/mk-kit/data/inline-edit/inline-edit.html","../../../projects/mk-kit/data/countdown/countdown.ts","../../../projects/mk-kit/data/countdown/countdown.html","../../../projects/mk-kit/data/description-list/description-list.ts","../../../projects/mk-kit/data/code/code.ts","../../../projects/mk-kit/data/code/code.html","../../../projects/mk-kit/data/virtual-scroll/virtual-scroll.ts","../../../projects/mk-kit/data/virtual-scroll/virtual-scroll.html","../../../projects/mk-kit/data/carousel/carousel.ts","../../../projects/mk-kit/data/carousel/carousel.html","../../../projects/mk-kit/data/diff/diff-util.ts","../../../projects/mk-kit/data/diff/diff.ts","../../../projects/mk-kit/data/diff/diff.html","../../../projects/mk-kit/data/qr-code/qr-encode.ts","../../../projects/mk-kit/data/qr-code/qr-code.ts","../../../projects/mk-kit/data/qr-code/qr-code.html","../../../projects/mk-kit/data/json-viewer/json-viewer.ts","../../../projects/mk-kit/data/json-viewer/json-viewer.html","../../../projects/mk-kit/data/log-viewer/ansi.ts","../../../projects/mk-kit/data/log-viewer/log-viewer.ts","../../../projects/mk-kit/data/log-viewer/log-viewer.html","../../../projects/mk-kit/data/markdown/markdown-parse.ts","../../../projects/mk-kit/data/markdown/markdown.ts","../../../projects/mk-kit/data/markdown/markdown.html","../../../projects/mk-kit/data/index.ts","../../../projects/mk-kit/data/mk-kit-ui-data.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Surface treatment for a {@link MkCard}. */\nexport type MkCardVariant = 'elevated' | 'outlined' | 'filled';\n/** Internal padding scale for a {@link MkCard}. */\nexport type MkCardPadding = 'none' | 'sm' | 'md' | 'lg';\n\n/**\n * Card — a themed surface container that groups related content. Compose it\n * with the projected `mk-card-header`, `mk-card-title` and `mk-card-footer`\n * parts, or drop plain content straight into the body.\n *\n * ```html\n * <mk-card variant=\"elevated\">\n * <mk-card-header>\n * <mk-card-title>Monthly revenue</mk-card-title>\n * </mk-card-header>\n * Body content goes here.\n * <mk-card-footer>\n * <button mkButton variant=\"ghost\">Details</button>\n * </mk-card-footer>\n * </mk-card>\n * ```\n */\n@Component({\n selector: 'mk-card',\n templateUrl: './card.html',\n styleUrl: './card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-card',\n '[class.mk-card--elevated]': \"variant() === 'elevated'\",\n '[class.mk-card--outlined]': \"variant() === 'outlined'\",\n '[class.mk-card--filled]': \"variant() === 'filled'\",\n '[attr.data-padding]': 'padding()',\n },\n})\nexport class MkCard {\n /** Surface treatment: raised shadow, hairline border, or tinted fill. */\n readonly variant = input<MkCardVariant>('elevated');\n /** Internal spacing applied to the body, header and footer. */\n readonly padding = input<MkCardPadding>('md');\n}\n","<ng-content select=\"mk-card-header, [mkCardHeader]\" />\n<div class=\"mk-card__body\">\n <ng-content />\n</div>\n<ng-content select=\"mk-card-footer, [mkCardFooter]\" />\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * Card header region — a padded band separated from the body by a hairline\n * border. Typically wraps a {@link MkCardTitle} and optional actions.\n */\n@Component({\n selector: 'mk-card-header, [mkCardHeader]',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-card-header' },\n styles: [\n `:host {\n display: flex;\n align-items: center;\n gap: var(--mk-space-3);\n padding: var(--mk-card-pad, var(--mk-space-5));\n border-bottom: var(--mk-border-width) solid var(--mk-border);\n }`,\n ],\n})\nexport class MkCardHeader {}\n\n/**\n * Card title — semantic heading text for a card header. Renders as bold,\n * emphasised text; wrap the projected content in your own heading element if a\n * specific heading level is required for the document outline.\n */\n@Component({\n selector: 'mk-card-title',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-card-title' },\n styles: [\n `:host {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n font-size: var(--mk-font-size-lg);\n font-weight: var(--mk-font-weight-semibold);\n line-height: var(--mk-line-height-snug);\n color: var(--mk-text);\n }`,\n ],\n})\nexport class MkCardTitle {}\n\n/**\n * Card footer region — a padded band separated from the body by a hairline\n * border, usually holding actions aligned to the end.\n */\n@Component({\n selector: 'mk-card-footer, [mkCardFooter]',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-card-footer' },\n styles: [\n `:host {\n display: flex;\n align-items: center;\n gap: var(--mk-space-3);\n padding: var(--mk-card-pad, var(--mk-space-5));\n border-top: var(--mk-border-width) solid var(--mk-border);\n }`,\n ],\n})\nexport class MkCardFooter {}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/** Axis a {@link MkDivider} is drawn along. */\nexport type MkDividerOrientation = 'horizontal' | 'vertical';\n\n/**\n * Divider — a themed separator rule. Renders horizontally by default; set\n * `orientation=\"vertical\"` for an inline vertical rule. Project content to\n * label a horizontal divider (the label sits centred between two rules).\n *\n * ```html\n * <mk-divider />\n * <mk-divider>OR</mk-divider>\n * <mk-divider orientation=\"vertical\" />\n * ```\n */\n@Component({\n selector: 'mk-divider',\n templateUrl: './divider.html',\n styleUrl: './divider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-divider',\n role: 'separator',\n '[class.mk-divider--vertical]': \"orientation() === 'vertical'\",\n '[attr.aria-orientation]': 'orientation()',\n },\n})\nexport class MkDivider {\n /** Axis the rule is drawn along. */\n readonly orientation = input<MkDividerOrientation>('horizontal');\n}\n","<span class=\"mk-divider__label\"><ng-content /></span>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { MkSize, MkTone } from '@mk-kit/ui/core';\n\n/** Visual treatment for a {@link MkTag}. */\nexport type MkTagVariant = 'solid' | 'soft' | 'outline';\n\n/**\n * Tag — a non-interactive label for categories, keywords or metadata. Unlike\n * {@link MkChip} it carries no interaction; use it purely for display.\n *\n * ```html\n * <mk-tag>Design</mk-tag>\n * <mk-tag tone=\"info\" variant=\"outline\">Beta</mk-tag>\n * ```\n */\n@Component({\n selector: 'mk-tag',\n templateUrl: './tag.html',\n styleUrl: './tag.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-tag',\n '[class.mk-tag--sm]': \"size() === 'sm'\",\n '[class.mk-tag--md]': \"size() === 'md'\",\n '[class.mk-tag--lg]': \"size() === 'lg'\",\n '[class.mk-tag--solid]': \"variant() === 'solid'\",\n '[class.mk-tag--soft]': \"variant() === 'soft'\",\n '[class.mk-tag--outline]': \"variant() === 'outline'\",\n '[attr.data-tone]': 'tone()',\n },\n})\nexport class MkTag {\n /** Semantic color tone. */\n readonly tone = input<MkTone>('neutral');\n /** Visual treatment. */\n readonly variant = input<MkTagVariant>('soft');\n /** Size scale. */\n readonly size = input<MkSize>('md');\n}\n","<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n signal,\n} from '@angular/core';\nimport type { MkSize } from '@mk-kit/ui/core';\n\n/** Outline shape of an {@link MkAvatar}. */\nexport type MkAvatarShape = 'circle' | 'rounded';\n/** Presence status shown as a corner dot on an {@link MkAvatar}. */\nexport type MkAvatarStatus = 'online' | 'offline' | 'away' | 'busy';\n\n/**\n * Avatar — a user/entity image that gracefully falls back to initials derived\n * from `name`, or to a projected icon. The whole avatar is exposed as a single\n * labelled image to assistive tech.\n *\n * ```html\n * <mk-avatar name=\"Ada Lovelace\" src=\"/ada.jpg\" status=\"online\" />\n * <mk-avatar name=\"Grace Hopper\" /> <!-- initials fallback -->\n * <mk-avatar><svg>…</svg></mk-avatar> <!-- icon fallback -->\n * ```\n */\n@Component({\n selector: 'mk-avatar',\n templateUrl: './avatar.html',\n styleUrl: './avatar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-avatar',\n role: 'img',\n '[class.mk-avatar--sm]': \"size() === 'sm'\",\n '[class.mk-avatar--md]': \"size() === 'md'\",\n '[class.mk-avatar--lg]': \"size() === 'lg'\",\n '[class.mk-avatar--circle]': \"shape() === 'circle'\",\n '[class.mk-avatar--rounded]': \"shape() === 'rounded'\",\n '[attr.aria-label]': 'label()',\n '[attr.data-status]': 'status() ?? null',\n },\n})\nexport class MkAvatar {\n /** Image URL. When it fails to load the avatar falls back automatically. */\n readonly src = input<string>();\n /** Display name; drives the initials fallback and the default alt text. */\n readonly name = input<string>();\n /** Explicit accessible label. Defaults to `name`, else \"Avatar\". */\n readonly alt = input<string>();\n /** Size scale. */\n readonly size = input<MkSize>('md');\n /** Outline shape. */\n readonly shape = input<MkAvatarShape>('circle');\n /** Presence indicator dot; omit for none. */\n readonly status = input<MkAvatarStatus>();\n\n /** True once the provided image has failed to load. */\n private readonly imgFailed = signal(false);\n\n protected readonly showImage = computed(\n () => !!this.src() && !this.imgFailed(),\n );\n\n /** Up-to-two-letter initials derived from `name`. */\n protected readonly initials = computed(() => {\n const parts = (this.name() ?? '').trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n });\n\n protected readonly label = computed(() => {\n const base = this.alt() || this.name() || 'Avatar';\n return this.status() ? `${base} (${this.status()})` : base;\n });\n\n protected onError(): void {\n this.imgFailed.set(true);\n }\n}\n","@if (showImage()) {\n <img class=\"mk-avatar__img\" [src]=\"src()\" alt=\"\" (error)=\"onError()\" />\n} @else if (initials()) {\n <span class=\"mk-avatar__initials\" aria-hidden=\"true\">{{ initials() }}</span>\n} @else {\n <span class=\"mk-avatar__icon\" aria-hidden=\"true\"><ng-content /></span>\n}\n@if (status()) {\n <span class=\"mk-avatar__status\" aria-hidden=\"true\"></span>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n contentChildren,\n effect,\n input,\n numberAttribute,\n} from '@angular/core';\nimport type { MkSize } from '@mk-kit/ui/core';\nimport { MkAvatar } from './avatar';\n\n/**\n * Avatar group — overlaps a set of {@link MkAvatar} children and, when `max`\n * is set, collapses the overflow into a trailing \"+N\" bubble.\n *\n * ```html\n * <mk-avatar-group [max]=\"3\">\n * <mk-avatar name=\"Ada Lovelace\" />\n * <mk-avatar name=\"Grace Hopper\" />\n * <mk-avatar name=\"Alan Turing\" />\n * <mk-avatar name=\"Katherine Johnson\" />\n * </mk-avatar-group>\n * ```\n */\n@Component({\n selector: 'mk-avatar-group',\n templateUrl: './avatar-group.html',\n styleUrl: './avatar-group.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-avatar-group',\n role: 'group',\n '[class.mk-avatar-group--sm]': \"size() === 'sm'\",\n '[class.mk-avatar-group--md]': \"size() === 'md'\",\n '[class.mk-avatar-group--lg]': \"size() === 'lg'\",\n },\n})\nexport class MkAvatarGroup {\n /** Maximum avatars to show before collapsing the rest into \"+N\". */\n readonly max = input(undefined, { transform: numberAttribute });\n /** Size of the overflow bubble (match your avatars' size). */\n readonly size = input<MkSize>('md');\n\n private readonly items = contentChildren(MkAvatar, { read: ElementRef });\n\n protected readonly overflowCount = computed(() => {\n const total = this.items().length;\n const max = this.max();\n return max != null && total > max ? total - max : 0;\n });\n\n constructor() {\n // Overlap the projected avatars and hide any beyond `max`. Projected\n // content lives in the consumer's view, so style it imperatively.\n effect(() => {\n const items = this.items();\n const max = this.max();\n items.forEach((ref, i) => {\n const el = ref.nativeElement as HTMLElement;\n el.style.marginInlineStart = i === 0 ? '0' : 'calc(var(--_size) * -0.35)';\n el.style.boxShadow =\n '0 0 0 var(--mk-border-width-strong) var(--mk-surface)';\n el.style.zIndex = String(items.length - i);\n el.style.display = max != null && i >= max ? 'none' : '';\n });\n });\n }\n}\n","<ng-content />\n@if (overflowCount() > 0) {\n <span class=\"mk-avatar-group__overflow\" aria-label=\"{{ overflowCount() }} more\">\n +{{ overflowCount() }}\n </span>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n} from '@angular/core';\n\n/**\n * List — a vertical stack of {@link MkListItem}s with `role=\"list\"` semantics.\n *\n * ```html\n * <mk-list>\n * <mk-list-item>Dashboard</mk-list-item>\n * <mk-list-item interactive (activated)=\"open()\">Settings</mk-list-item>\n * </mk-list>\n * ```\n */\n@Component({\n selector: 'mk-list',\n templateUrl: './list.html',\n styleUrl: './list.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-list',\n role: 'list',\n '[class.mk-list--bordered]': 'bordered()',\n },\n})\nexport class MkList {\n /** Draw hairline separators between items. */\n readonly bordered = input(false, { transform: booleanAttribute });\n}\n","<ng-content />\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n output,\n} from '@angular/core';\n\n/**\n * List item — a row inside {@link MkList}. Project leading/trailing adornments\n * with the `mkListLeading` / `mkListTrailing` attributes. Set `interactive`\n * to make the row focusable and clickable (Enter/Space activate it).\n *\n * ```html\n * <mk-list-item interactive [selected]=\"active()\" (activated)=\"pick()\">\n * <mk-avatar mkListLeading name=\"Ada\" />\n * Ada Lovelace\n * <mk-badge mkListTrailing tone=\"success\">New</mk-badge>\n * </mk-list-item>\n * ```\n */\n@Component({\n selector: 'mk-list-item',\n templateUrl: './list-item.html',\n styleUrl: './list-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-list-item',\n role: 'listitem',\n '[class.mk-list-item--interactive]': 'interactive()',\n '[class.mk-list-item--selected]': 'selected()',\n '[class.mk-list-item--disabled]': 'disabled()',\n '[attr.tabindex]': 'interactive() && !disabled() ? 0 : null',\n // `aria-selected` is not permitted on `listitem`; `aria-current` is the\n // ARIA way to mark the current row of a plain list.\n '[attr.aria-current]': \"interactive() && selected() ? 'true' : null\",\n '[attr.aria-disabled]': \"disabled() ? 'true' : null\",\n '(click)': 'onClick()',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class MkListItem {\n /** Make the row focusable/clickable with hover + keyboard activation. */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** Highlight the row as the current selection. */\n readonly selected = input(false, { transform: booleanAttribute });\n /** Disable interaction and dim the row. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Emitted on click / Enter / Space when `interactive`. */\n readonly activated = output<void>();\n\n protected onClick(): void {\n if (this.disabled() || !this.interactive()) return;\n this.activated.emit();\n }\n\n protected onKeydown(event: Event): void {\n if (this.disabled() || !this.interactive()) return;\n const key = (event as KeyboardEvent).key;\n if (key === 'Enter' || key === ' ') {\n event.preventDefault();\n this.activated.emit();\n }\n }\n}\n","<span class=\"mk-list-item__leading\"><ng-content select=\"[mkListLeading]\" /></span>\n<span class=\"mk-list-item__content\"><ng-content /></span>\n<span class=\"mk-list-item__trailing\"><ng-content select=\"[mkListTrailing]\" /></span>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * Timeline — a vertical sequence of chronological events (activity feeds, order\n * status, audit logs). A container for `<mk-timeline-item>`s that draws the\n * connecting rail; exposed to assistive tech as a list.\n *\n * ```html\n * <mk-timeline>\n * <mk-timeline-item tone=\"success\" time=\"09:30\" heading=\"Order placed\">\n * Payment confirmed.\n * </mk-timeline-item>\n * <mk-timeline-item time=\"10:15\" heading=\"Packed\">In the warehouse.</mk-timeline-item>\n * </mk-timeline>\n * ```\n */\n@Component({\n selector: 'mk-timeline',\n template: '<ng-content />',\n styleUrl: './timeline.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-timeline',\n role: 'list',\n },\n})\nexport class MkTimeline {}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { MkTone } from '@mk-kit/ui/core';\nimport { MkIcon } from '@mk-kit/ui/icon';\n\n/**\n * A single event in an `<mk-timeline>`: a tone-coloured marker (optionally an\n * icon), an optional time/label and heading, and projected body content.\n *\n * ```html\n * <mk-timeline-item tone=\"danger\" icon=\"error\" time=\"2m ago\" heading=\"Build failed\">\n * 3 tests failed on <code>main</code>.\n * </mk-timeline-item>\n * ```\n */\n@Component({\n selector: 'mk-timeline-item',\n templateUrl: './timeline-item.html',\n styleUrl: './timeline-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkIcon],\n host: {\n class: 'mk-timeline-item',\n role: 'listitem',\n '[attr.data-tone]': 'tone()',\n '[class.mk-timeline-item--icon]': 'icon()',\n },\n})\nexport class MkTimelineItem {\n /** Semantic colour of the marker dot. */\n readonly tone = input<MkTone>('primary');\n /** Name of a registered icon rendered inside the marker. */\n readonly icon = input<string>('');\n /** Time or label shown above the heading (e.g. \"09:30\", \"2m ago\"). */\n readonly time = input<string>('');\n /** Event title. */\n readonly heading = input<string>('');\n}\n","<div class=\"mk-timeline-item__marker\">\n <span class=\"mk-timeline-item__dot\">\n @if (icon()) {\n <mk-icon [name]=\"icon()\" [size]=\"14\" />\n }\n </span>\n <span class=\"mk-timeline-item__connector\" aria-hidden=\"true\"></span>\n</div>\n\n<div class=\"mk-timeline-item__content\">\n @if (time()) {\n <span class=\"mk-timeline-item__time\">{{ time() }}</span>\n }\n @if (heading()) {\n <p class=\"mk-timeline-item__heading\">{{ heading() }}</p>\n }\n <div class=\"mk-timeline-item__body\">\n <ng-content />\n </div>\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n Directive,\n ElementRef,\n TemplateRef,\n booleanAttribute,\n computed,\n contentChild,\n inject,\n input,\n linkedSignal,\n model,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkAvatar } from '../avatar/avatar';\n\n/** A node in an {@link MkOrgChart} tree. `children` makes it a parent. */\nexport interface MkOrgChartNode<T = unknown> {\n /** Unique id — drives selection (`[(selected)]`) and expansion (`[(expanded)]`). */\n id: string;\n /** Primary text of the default card (and the initials fallback). */\n label?: string;\n /**\n * Arbitrary payload handed to the node template. The default card reads\n * `data.title` (sub-label) and `data.avatar` (image URL) when present.\n */\n data?: T;\n /** Direct reports; a non-empty array makes the node collapsible. */\n children?: MkOrgChartNode<T>[];\n /** Initial expansion (default `true`). Only consulted when `[(expanded)]` is not bound. */\n expanded?: boolean;\n}\n\n/** One row of a flat list accepted by {@link mkOrgChartFromFlat}. */\nexport interface MkOrgChartFlatNode<T = unknown> {\n id: string;\n label?: string;\n data?: T;\n /** Id of the parent row; `null` / `undefined` / unknown id = root. */\n parentId?: string | null;\n expanded?: boolean;\n}\n\n/**\n * Build the nested `nodes` input from a flat `parentId` list (the shape most\n * HR / directory APIs return). Row order is preserved among siblings; rows\n * whose `parentId` does not match any row become roots.\n *\n * ```ts\n * const nodes = mkOrgChartFromFlat([\n * { id: 'ceo', label: 'Ada' },\n * { id: 'cto', label: 'Grace', parentId: 'ceo' },\n * ]);\n * ```\n */\nexport function mkOrgChartFromFlat<T = unknown>(\n list: readonly MkOrgChartFlatNode<T>[],\n): MkOrgChartNode<T>[] {\n const byId = new Map<string, MkOrgChartNode<T>>();\n for (const row of list) {\n const node: MkOrgChartNode<T> = { id: row.id };\n if (row.label !== undefined) node.label = row.label;\n if (row.data !== undefined) node.data = row.data;\n if (row.expanded !== undefined) node.expanded = row.expanded;\n byId.set(row.id, node);\n }\n const roots: MkOrgChartNode<T>[] = [];\n for (const row of list) {\n const node = byId.get(row.id)!;\n const parent = row.parentId != null ? byId.get(row.parentId) : undefined;\n if (parent && parent !== node) (parent.children ??= []).push(node);\n else roots.push(node);\n }\n return roots;\n}\n\n/**\n * `data` type seen by a node template: `T` when it could be inferred (the\n * template binds `[mkOrgChartNodeDef]=\"nodes\"`), otherwise `any` so an\n * untyped `<ng-template mkOrgChartNodeDef>` can still read `node.data?.title`.\n */\nexport type MkOrgChartTemplateData<T> = keyof T extends never ? any : T;\n\n/** Template context of `ng-template[mkOrgChartNodeDef]`. */\nexport interface MkOrgChartNodeContext<T = unknown> {\n /** The node (also available as `let-node`). */\n $implicit: MkOrgChartNode<MkOrgChartTemplateData<T>>;\n node: MkOrgChartNode<MkOrgChartTemplateData<T>>;\n /** 1-based depth (roots are 1). */\n depth: number;\n /** Whether the node's children are currently shown. */\n expanded: boolean;\n /** Whether the node is the selected one. */\n selected: boolean;\n}\n\n/**\n * Custom node card for `mk-org-chart`:\n *\n * ```html\n * <mk-org-chart [nodes]=\"nodes\">\n * <ng-template mkOrgChartNodeDef let-node let-selected=\"selected\">\n * <strong>{{ node.label }}</strong> — {{ node.data?.title }}\n * </ng-template>\n * </mk-org-chart>\n * ```\n *\n * Bind the same array you pass to `nodes` to get a typed `node.data` in the\n * template: `<ng-template [mkOrgChartNodeDef]=\"nodes\" let-node>`.\n */\n@Directive({ selector: 'ng-template[mkOrgChartNodeDef]' })\nexport class MkOrgChartNodeDef<T = unknown> {\n /**\n * Type-inference hook only (the value is not used at runtime): bind the\n * `nodes` array so `let-node` is typed as `MkOrgChartNode<T>`.\n */\n readonly mkOrgChartNodeDef = input<readonly MkOrgChartNode<T>[] | '' | undefined>(undefined);\n readonly template = inject(TemplateRef<MkOrgChartNodeContext<T>>);\n static ngTemplateContextGuard<T>(\n _dir: MkOrgChartNodeDef<T>,\n ctx: unknown,\n ): ctx is MkOrgChartNodeContext<T> {\n return true;\n }\n}\n\n/** Chart direction: `top` = root at the top, `left` = root at the inline start. */\nexport type MkOrgChartOrientation = 'top' | 'left';\n\n/** Payload of `(nodeToggle)`. */\nexport interface MkOrgChartToggleEvent<T = unknown> {\n node: MkOrgChartNode<T>;\n expanded: boolean;\n}\n\n/** One visible node after flattening (pre-order, i.e. DOM order). */\ninterface MkOrgChartRow {\n node: MkOrgChartNode;\n depth: number;\n parentId: string | null;\n /** Ids of the sibling set this row belongs to (in order). */\n siblings: readonly string[];\n hasChildren: boolean;\n expanded: boolean;\n}\n\n/**\n * Organisation chart — a reporting-line hierarchy drawn with plain nested\n * lists and CSS connectors (no canvas, prints and themes like everything\n * else). Feed it a tree (`nodes`) or convert a flat `parentId` list with\n * {@link mkOrgChartFromFlat}. Nodes render as a default card (avatar /\n * initials, label, `data.title`) or through an `mkOrgChartNodeDef` template.\n *\n * Follows the ARIA tree pattern (`role=\"tree\"` / `treeitem` / `group`, one\n * roving tab stop). Keyboard (top-down; the axes swap for `orientation=\"left\"`\n * and in RTL): Down = first child (expands a collapsed node first), Up =\n * parent, Left/Right = previous/next sibling, Home/End = first/last visible\n * node, Enter/Space = select (or toggle when not selectable), `*` = expand\n * all siblings, `+`/`-` = expand/collapse.\n *\n * ```html\n * <mk-org-chart\n * [nodes]=\"company\"\n * selectable\n * [(selected)]=\"personId\"\n * collapsible\n * (nodeClick)=\"open($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'mk-org-chart',\n templateUrl: './org-chart.html',\n styleUrl: './org-chart.scss',\n exportAs: 'mkOrgChart',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, MkAvatar],\n host: {\n class: 'mk-org-chart',\n '[class.mk-org-chart--top]': \"orientation() === 'top'\",\n '[class.mk-org-chart--left]': \"orientation() === 'left'\",\n '[class.mk-org-chart--selectable]': 'selectable()',\n '[class.mk-org-chart--collapsible]': 'collapsible()',\n },\n})\nexport class MkOrgChart<T = unknown> {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n\n /** The hierarchy to render (roots first). */\n readonly nodes = input<readonly MkOrgChartNode<T>[]>([]);\n /** Root at the top (children below) or at the inline start (children to the side). */\n readonly orientation = input<MkOrgChartOrientation>('top');\n /** Allow choosing a node (adds selection styling + `aria-selected`). */\n readonly selectable = input(false, { transform: booleanAttribute });\n /** Show a toggle on every parent so branches can be hidden. */\n readonly collapsible = input(false, { transform: booleanAttribute });\n /** Scale factor applied to the whole chart (clamped to 0.5–2). */\n readonly zoom = input(1, { transform: numberAttribute });\n /** Accessible name for the tree. */\n readonly ariaLabel = input<string>(this.i18n.orgChartLabel, { alias: 'aria-label' });\n\n /** Two-way selected node id (`null` = nothing selected). */\n readonly selected = model<string | null>(null);\n /**\n * Two-way ids of the expanded parents. Leave unbound to let the chart\n * manage expansion itself (seeded from each node's `expanded` flag).\n */\n readonly expanded = model<readonly string[] | undefined>(undefined);\n\n /** Emits the node whose card was clicked or activated with Enter/Space. */\n readonly nodeClick = output<MkOrgChartNode<T>>();\n /** Emits whenever a node is expanded or collapsed. */\n readonly nodeToggle = output<MkOrgChartToggleEvent<T>>();\n\n protected readonly nodeDef = contentChild(MkOrgChartNodeDef<T>);\n\n protected readonly zoomLevel = computed(() => {\n const z = this.zoom();\n return Number.isFinite(z) ? Math.min(2, Math.max(0.5, z)) : 1;\n });\n\n /**\n * Expanded parent ids. Controlled by `expanded` when bound; otherwise kept\n * locally — a node's `expanded` flag only seeds ids not present in the\n * previous `nodes` value, so re-emitting the array never reverts branches\n * the user has since toggled.\n */\n private readonly expandedIds = linkedSignal<\n { nodes: readonly MkOrgChartNode<T>[]; expanded: readonly string[] | undefined },\n ReadonlySet<string>\n >({\n source: () => ({ nodes: this.nodes(), expanded: this.expanded() }),\n computation: ({ nodes, expanded }, previous) => {\n if (expanded) return new Set(expanded);\n const prev = previous?.value;\n const known = previous ? collectIds(previous.source.nodes) : null;\n const next = new Set<string>();\n walk(nodes, (node) => {\n if (!node.children?.length) return;\n const isKnown = known?.has(node.id) ?? false;\n if (isKnown ? prev!.has(node.id) : node.expanded !== false) next.add(node.id);\n });\n return next;\n },\n });\n\n /** Id of the node holding the roving tab stop. */\n private readonly activeId = signal<string | null>(null);\n\n /** Visible nodes in DOM (pre-order) order. */\n protected readonly rows = computed<MkOrgChartRow[]>(() => {\n const collapsible = this.collapsible();\n const expandedIds = this.expandedIds();\n const out: MkOrgChartRow[] = [];\n const visit = (list: readonly MkOrgChartNode[], depth: number, parentId: string | null) => {\n const siblings = list.map((n) => n.id);\n for (const node of list) {\n const hasChildren = !!node.children?.length;\n const expanded = hasChildren && (!collapsible || expandedIds.has(node.id));\n out.push({ node, depth, parentId, siblings, hasChildren, expanded });\n if (expanded) visit(node.children!, depth + 1, node.id);\n }\n };\n visit(this.nodes(), 1, null);\n return out;\n });\n\n private readonly rowById = computed(() => new Map(this.rows().map((r) => [r.node.id, r])));\n\n /** The single id with `tabindex=\"0\"` (falls back to the first visible node). */\n private readonly tabStopId = computed(() => {\n const active = this.activeId();\n if (active !== null && this.rowById().has(active)) return active;\n return this.rows()[0]?.node.id ?? null;\n });\n\n // ---- template helpers --------------------------------------------------\n\n protected isExpanded(node: MkOrgChartNode<T>): boolean {\n if (!node.children?.length) return false;\n return !this.collapsible() || this.expandedIds().has(node.id);\n }\n\n protected isSelected(node: MkOrgChartNode<T>): boolean {\n return this.selectable() && this.selected() === node.id;\n }\n\n protected tabIndexFor(node: MkOrgChartNode<T>): number {\n return this.tabStopId() === node.id ? 0 : -1;\n }\n\n protected toggleLabel(node: MkOrgChartNode<T>): string {\n const tpl = this.isExpanded(node) ? this.i18n.orgChartCollapse : this.i18n.orgChartExpand;\n return tpl.replace('{label}', node.label ?? node.id);\n }\n\n protected context(\n node: MkOrgChartNode<T>,\n depth: number,\n ): MkOrgChartNodeContext<T> {\n return {\n $implicit: node,\n node,\n depth,\n expanded: this.isExpanded(node),\n selected: this.isSelected(node),\n };\n }\n\n /** `data.title` / `data.avatar` of the default card, read defensively. */\n protected field(node: MkOrgChartNode<T>, key: 'title' | 'avatar'): string | undefined {\n const data = node.data as Record<string, unknown> | undefined;\n const value = data?.[key];\n return typeof value === 'string' && value ? value : undefined;\n }\n\n // ---- state changes -----------------------------------------------------\n\n /** Expand or collapse a parent (no-op for leaves / non-collapsible charts). */\n toggle(node: MkOrgChartNode<T>): void {\n this.setExpanded(node, !this.isExpanded(node));\n }\n\n /** Expand or collapse a parent explicitly. */\n setExpanded(node: MkOrgChartNode<T>, expanded: boolean): void {\n if (!this.collapsible() || !node.children?.length) return;\n if (this.expandedIds().has(node.id) === expanded) return;\n const next = new Set(this.expandedIds());\n if (expanded) next.add(node.id);\n else next.delete(node.id);\n this.expandedIds.set(next);\n this.expanded.set([...next]);\n this.nodeToggle.emit({ node, expanded });\n }\n\n /** Select a node by reference (no-op unless `selectable`). */\n select(node: MkOrgChartNode<T>): void {\n if (!this.selectable()) return;\n this.selected.set(node.id);\n }\n\n private activate(node: MkOrgChartNode<T>): void {\n this.activeId.set(node.id);\n if (this.selectable()) this.select(node);\n this.nodeClick.emit(node);\n }\n\n protected onCardClick(event: Event, node: MkOrgChartNode<T>): void {\n event.stopPropagation();\n this.activate(node);\n }\n\n protected onToggleClick(event: Event, node: MkOrgChartNode<T>): void {\n event.stopPropagation();\n this.activeId.set(node.id);\n this.toggle(node);\n this.focusItem(node.id);\n }\n\n /** Keeps the roving tab stop on whichever item last received focus. */\n protected onFocusIn(event: Event): void {\n const id = this.itemIdOf(event.target);\n if (id !== null) this.activeId.set(id);\n }\n\n protected onKeydown(event: Event): void {\n if (!(event instanceof KeyboardEvent)) return;\n const id = this.itemIdOf(event.target);\n if (id === null) return;\n const row = this.rowById().get(id);\n if (!row) return;\n const node = row.node as MkOrgChartNode<T>;\n\n const intent = this.intentOf(event.key);\n switch (intent) {\n case 'into':\n event.preventDefault();\n if (row.hasChildren && !row.expanded) {\n this.setExpanded(node, true);\n } else if (row.expanded) {\n this.focusItem(node.children![0].id);\n }\n return;\n case 'parent':\n event.preventDefault();\n if (row.parentId !== null) this.focusItem(row.parentId);\n return;\n case 'next':\n case 'prev': {\n event.preventDefault();\n const i = row.siblings.indexOf(id);\n const target = row.siblings[intent === 'next' ? i + 1 : i - 1];\n if (target !== undefined) this.focusItem(target);\n return;\n }\n }\n\n switch (event.key) {\n case 'Home':\n event.preventDefault();\n this.focusItem(this.rows()[0]?.node.id ?? null);\n break;\n case 'End': {\n event.preventDefault();\n const rows = this.rows();\n this.focusItem(rows[rows.length - 1]?.node.id ?? null);\n break;\n }\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (!this.selectable() && row.hasChildren && this.collapsible()) {\n this.toggle(node);\n }\n this.activate(node);\n break;\n case '*': {\n event.preventDefault();\n const nodes = this.siblingsOf(row);\n for (const sibling of nodes) this.setExpanded(sibling, true);\n break;\n }\n case '+':\n case '=':\n event.preventDefault();\n this.setExpanded(node, true);\n break;\n case '-':\n event.preventDefault();\n this.setExpanded(node, false);\n break;\n }\n }\n\n /**\n * Map an arrow key to a tree direction. Top-down: Down = into, Up = parent,\n * Left/Right = siblings (mirrored in RTL). Left-to-right: Right = into,\n * Left = parent (mirrored in RTL), Up/Down = siblings.\n */\n private intentOf(key: string): 'into' | 'parent' | 'next' | 'prev' | null {\n const rtl = this.isRtl();\n if (this.orientation() === 'left') {\n switch (key) {\n case 'ArrowRight':\n return rtl ? 'parent' : 'into';\n case 'ArrowLeft':\n return rtl ? 'into' : 'parent';\n case 'ArrowDown':\n return 'next';\n case 'ArrowUp':\n return 'prev';\n }\n return null;\n }\n switch (key) {\n case 'ArrowDown':\n return 'into';\n case 'ArrowUp':\n return 'parent';\n case 'ArrowRight':\n return rtl ? 'prev' : 'next';\n case 'ArrowLeft':\n return rtl ? 'next' : 'prev';\n }\n return null;\n }\n\n private siblingsOf(row: MkOrgChartRow): MkOrgChartNode<T>[] {\n const list =\n row.parentId === null\n ? this.nodes()\n : ((this.rowById().get(row.parentId)?.node.children ?? []) as MkOrgChartNode<T>[]);\n return list.filter((n) => !!n.children?.length);\n }\n\n\n private isRtl(): boolean {\n const el = this.host.nativeElement;\n const dir = el.closest('[dir]')?.getAttribute('dir');\n if (dir) return dir.toLowerCase() === 'rtl';\n const view = this.document.defaultView;\n return (view?.getComputedStyle(el).direction ?? 'ltr') === 'rtl';\n }\n\n private itemIdOf(target: EventTarget | null): string | null {\n if (!(target instanceof Element)) return null;\n const item = target.closest<HTMLElement>('.mk-org-chart__item');\n if (!item || !this.host.nativeElement.contains(item)) return null;\n return item.dataset['mkId'] ?? null;\n }\n\n private focusItem(id: string | null): void {\n if (id === null) return;\n this.activeId.set(id);\n const items = this.host.nativeElement.querySelectorAll<HTMLElement>('.mk-org-chart__item');\n for (const item of Array.from(items)) {\n if (item.dataset['mkId'] === id) {\n item.focus();\n return;\n }\n }\n }\n}\n\nfunction walk<T>(list: readonly MkOrgChartNode<T>[], fn: (node: MkOrgChartNode<T>) => void): void {\n for (const node of list) {\n fn(node);\n if (node.children?.length) walk(node.children, fn);\n }\n}\n\nfunction collectIds<T>(list: readonly MkOrgChartNode<T>[]): Set<string> {\n const ids = new Set<string>();\n walk(list, (n) => ids.add(n.id));\n return ids;\n}\n","<div class=\"mk-org-chart__scroller\">\n <div class=\"mk-org-chart__canvas\" [style.zoom]=\"zoomLevel()\">\n <ul\n class=\"mk-org-chart__level mk-org-chart__level--root\"\n role=\"tree\"\n [attr.aria-label]=\"ariaLabel() || null\"\n (keydown)=\"onKeydown($event)\"\n (focusin)=\"onFocusIn($event)\"\n >\n @for (node of nodes(); track node.id) {\n <ng-container\n *ngTemplateOutlet=\"itemTpl; context: { node: node, depth: 1 }\"\n />\n }\n </ul>\n </div>\n</div>\n\n<ng-template #itemTpl let-node=\"node\" let-depth=\"depth\">\n <li\n class=\"mk-org-chart__item\"\n role=\"treeitem\"\n [attr.data-mk-id]=\"node.id\"\n [class.mk-org-chart__item--expanded]=\"isExpanded(node)\"\n [class.mk-org-chart__item--collapsed]=\"node.children?.length && !isExpanded(node)\"\n [attr.aria-level]=\"depth\"\n [attr.aria-expanded]=\"node.children?.length ? isExpanded(node) : null\"\n [attr.aria-selected]=\"selectable() ? isSelected(node) : null\"\n [attr.tabindex]=\"tabIndexFor(node)\"\n >\n <div\n class=\"mk-org-chart__node\"\n [class.mk-org-chart__node--selected]=\"isSelected(node)\"\n [class.mk-org-chart__node--custom]=\"!!nodeDef()\"\n (click)=\"onCardClick($event, node)\"\n >\n @if (nodeDef(); as def) {\n <ng-container\n *ngTemplateOutlet=\"def.template; context: context(node, depth)\"\n />\n } @else {\n <mk-avatar\n class=\"mk-org-chart__avatar\"\n size=\"sm\"\n [name]=\"node.label ?? node.id\"\n [src]=\"field(node, 'avatar')\"\n alt=\"\"\n aria-hidden=\"true\"\n />\n <span class=\"mk-org-chart__text\">\n <span class=\"mk-org-chart__label\">{{ node.label ?? node.id }}</span>\n @if (field(node, 'title'); as title) {\n <span class=\"mk-org-chart__title\">{{ title }}</span>\n }\n </span>\n }\n @if (collapsible() && node.children?.length) {\n <button\n type=\"button\"\n class=\"mk-org-chart__toggle\"\n tabindex=\"-1\"\n [attr.aria-label]=\"toggleLabel(node)\"\n [attr.aria-expanded]=\"isExpanded(node)\"\n (click)=\"onToggleClick($event, node)\"\n >\n <span class=\"mk-org-chart__caret\" aria-hidden=\"true\"></span>\n </button>\n }\n </div>\n @if (isExpanded(node)) {\n <ul class=\"mk-org-chart__level mk-org-chart__level--nested\" role=\"group\">\n @for (child of node.children; track child.id) {\n <ng-container\n *ngTemplateOutlet=\"itemTpl; context: { node: child, depth: depth + 1 }\"\n />\n }\n </ul>\n }\n </li>\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\n\n/** Direction of a {@link MkStatCard} delta. */\nexport type MkStatTrend = 'up' | 'down' | 'neutral';\n\n/**\n * Stat card — a compact KPI tile for dashboards. Shows a label, a primary\n * value and an optional trend delta. The trend is conveyed by an arrow glyph\n * and a screen-reader phrase in addition to colour, so it never relies on\n * colour alone.\n *\n * ```html\n * <mk-stat-card\n * label=\"Revenue\"\n * value=\"$48.2k\"\n * [delta]=\"'+12%'\"\n * deltaTrend=\"up\"\n * hint=\"vs. last month\">\n * <svg mkStatIcon>…</svg>\n * </mk-stat-card>\n * ```\n */\n@Component({\n selector: 'mk-stat-card',\n templateUrl: './stat-card.html',\n styleUrl: './stat-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-stat-card',\n role: 'group',\n '[attr.aria-labelledby]': 'labelId',\n },\n})\nexport class MkStatCard {\n /** Metric name shown above the value. */\n readonly label = input<string>('');\n /** The primary metric value. */\n readonly value = input<string | number>('');\n /** Change indicator (e.g. `'+12%'` or `-4`). Omit to hide the delta row. */\n readonly delta = input<string | number>();\n /** Trend direction; colourises the delta and picks the arrow glyph. */\n readonly deltaTrend = input<MkStatTrend>('neutral');\n /** Small supporting note under the delta (e.g. \"vs. last month\"). */\n readonly hint = input<string>();\n\n protected readonly labelId = mkUniqueId('mk-stat-label');\n\n protected readonly hasDelta = computed(() => {\n const d = this.delta();\n return d !== undefined && d !== null && `${d}`.length > 0;\n });\n\n /** Arrow glyph for the current trend. */\n protected readonly arrow = computed(() => {\n switch (this.deltaTrend()) {\n case 'up':\n return '↑'; // ↑\n case 'down':\n return '↓'; // ↓\n default:\n return '→'; // →\n }\n });\n\n /** Screen-reader phrase describing the trend. */\n protected readonly trendLabel = computed(() => {\n switch (this.deltaTrend()) {\n case 'up':\n return 'Trending up';\n case 'down':\n return 'Trending down';\n default:\n return 'No change';\n }\n });\n}\n","<div class=\"mk-stat-card__header\">\n <span class=\"mk-stat-card__label\" [id]=\"labelId\">{{ label() }}</span>\n <span class=\"mk-stat-card__icon\" aria-hidden=\"true\">\n <ng-content select=\"[mkStatIcon]\" />\n </span>\n</div>\n\n<div class=\"mk-stat-card__value\">{{ value() }}</div>\n\n@if (hasDelta()) {\n <div class=\"mk-stat-card__delta\" [attr.data-trend]=\"deltaTrend()\">\n <span class=\"mk-stat-card__arrow\" aria-hidden=\"true\">{{ arrow() }}</span>\n <span class=\"mk-stat-card__delta-value\">{{ delta() }}</span>\n <span class=\"mk-stat-card__sr\">{{ trendLabel() }}</span>\n </div>\n}\n\n@if (hint()) {\n <div class=\"mk-stat-card__hint\">{{ hint() }}</div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport type { MkSize } from '@mk-kit/ui/core';\nimport { MkAvatar } from '../avatar/avatar';\n\n/** Layout direction of a {@link MkProfileCard}. */\nexport type MkProfileCardOrientation = 'vertical' | 'horizontal';\n\n/**\n * Profile meta row — a stats strip projected into a {@link MkProfileCard}\n * between the body and the actions. Direct children are laid out as\n * evenly-spaced, centre-aligned cells with subtle separators between them.\n *\n * ```html\n * <div mkProfileMeta>\n * <div><strong>128</strong> posts</div>\n * <div><strong>2.4k</strong> followers</div>\n * </div>\n * ```\n */\n@Component({\n selector: '[mkProfileMeta]',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-profile-meta' },\n styles: [\n `:host {\n display: flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n }\n :host(:empty) {\n display: none;\n }\n :host ::ng-deep > * {\n flex: 1 1 0;\n min-width: 0;\n padding-inline: var(--mk-space-2);\n text-align: center;\n font-size: var(--mk-font-size-sm);\n color: var(--mk-text-muted);\n }\n :host ::ng-deep > * + * {\n border-inline-start: var(--mk-border-width) solid var(--mk-border-subtle);\n }`,\n ],\n})\nexport class MkProfileMeta {}\n\n/**\n * Profile actions row — buttons projected into the footer area of a\n * {@link MkProfileCard}. Centred in vertical orientation; pinned to the end\n * in horizontal orientation.\n *\n * ```html\n * <div mkProfileActions>\n * <button mkButton>Follow</button>\n * <button mkButton variant=\"outline\">Message</button>\n * </div>\n * ```\n */\n@Component({\n selector: '[mkProfileActions]',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-profile-actions' },\n styles: [\n `:host {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: var(--mk-space-2);\n }\n :host(:empty) {\n display: none;\n }`,\n ],\n})\nexport class MkProfileActions {}\n\n/**\n * Profile card — a person/entity summary on a bordered surface: an optional\n * cover banner, an {@link MkAvatar} (with automatic initials fallback derived\n * from `name`), the display name, a muted subtitle, free-form body content and\n * two optional slots for a meta/stats row and an actions row.\n *\n * Orientations:\n * - `vertical` (default) — centred column; when `coverSrc` is set a 3:1 banner\n * spans the card top and the avatar overlaps its bottom edge with a\n * surface-coloured ring.\n * - `horizontal` — avatar on the left, text in the middle, actions pinned to\n * the end. The cover banner is intentionally NOT rendered in this\n * orientation (a side-by-side row has no top edge for it to crown).\n *\n * The name renders as emphasised generic text (like `mk-card-title`, no\n * hard-coded heading level) so the card never disrupts the document outline.\n *\n * ```html\n * <mk-profile-card\n * name=\"Ada Lovelace\"\n * subtitle=\"Analytical Engine Programmer\"\n * avatarSrc=\"/ada.jpg\"\n * coverSrc=\"/cover.jpg\">\n * First programmer. Wrote notes G through... well, all of them.\n * <div mkProfileMeta>\n * <div><strong>128</strong> posts</div>\n * <div><strong>2.4k</strong> followers</div>\n * <div><strong>310</strong> following</div>\n * </div>\n * <div mkProfileActions>\n * <button mkButton>Follow</button>\n * <button mkButton variant=\"outline\">Message</button>\n * </div>\n * </mk-profile-card>\n * ```\n */\n@Component({\n selector: 'mk-profile-card',\n exportAs: 'mkProfileCard',\n templateUrl: './profile-card.html',\n styleUrl: './profile-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkAvatar],\n host: {\n class: 'mk-profile-card',\n role: 'group',\n '[class.mk-profile-card--vertical]': \"orientation() === 'vertical'\",\n '[class.mk-profile-card--horizontal]': \"orientation() === 'horizontal'\",\n '[class.mk-profile-card--has-cover]': 'showCover()',\n '[attr.data-avatar-size]': 'avatarSize()',\n '[attr.aria-labelledby]': 'nameId',\n },\n})\nexport class MkProfileCard {\n /** Display name. Also drives the avatar's initials fallback and alt text. */\n readonly name = input.required<string>();\n /** Muted supporting line under the name (role, handle, email…). */\n readonly subtitle = input<string>('');\n /** Avatar image URL; when empty the avatar falls back to initials. */\n readonly avatarSrc = input<string>('');\n /**\n * Cover banner image URL rendered as a ~3:1 band across the card top\n * (vertical orientation only). When set, the avatar overlaps the banner's\n * bottom edge with a surface-coloured ring.\n */\n readonly coverSrc = input<string>('');\n /** Layout: centred column (`vertical`) or avatar-left row (`horizontal`). */\n readonly orientation = input<MkProfileCardOrientation>('vertical');\n /** Avatar size scale, forwarded to {@link MkAvatar}. */\n readonly avatarSize = input<MkSize>('lg');\n\n /** Id of the name element, wired to the host's `aria-labelledby`. */\n protected readonly nameId = mkUniqueId('mk-profile-card-name');\n\n /** Cover renders only in vertical orientation. */\n protected readonly showCover = computed(\n () => this.orientation() === 'vertical' && !!this.coverSrc(),\n );\n}\n","@if (showCover()) {\n <div class=\"mk-profile-card__cover\" aria-hidden=\"true\">\n <img class=\"mk-profile-card__cover-img\" [src]=\"coverSrc()\" alt=\"\" />\n </div>\n}\n\n<div class=\"mk-profile-card__content\">\n <mk-avatar\n class=\"mk-profile-card__avatar\"\n [src]=\"avatarSrc()\"\n [name]=\"name()\"\n [size]=\"avatarSize()\" />\n\n <div class=\"mk-profile-card__main\">\n <div class=\"mk-profile-card__identity\">\n <div class=\"mk-profile-card__name\" [id]=\"nameId\">{{ name() }}</div>\n @if (subtitle()) {\n <div class=\"mk-profile-card__subtitle\">{{ subtitle() }}</div>\n }\n </div>\n\n <div class=\"mk-profile-card__body\">\n <ng-content />\n </div>\n\n <div class=\"mk-profile-card__meta\">\n <ng-content select=\"[mkProfileMeta]\" />\n </div>\n </div>\n\n <div class=\"mk-profile-card__actions\">\n <ng-content select=\"[mkProfileActions]\" />\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\nimport type { MkSize, MkTone } from '@mk-kit/ui/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\n\n/**\n * Progress bar — a determinate (0–100) or indeterminate progress indicator\n * with `role=\"progressbar\"`. `aria-valuenow` is omitted while indeterminate.\n * The indeterminate animation respects `prefers-reduced-motion`.\n *\n * ```html\n * <mk-progress-bar [value]=\"uploaded()\" label=\"Uploading\" showValue />\n * <mk-progress-bar indeterminate label=\"Loading\" />\n * ```\n */\n@Component({\n selector: 'mk-progress-bar',\n templateUrl: './progress-bar.html',\n styleUrl: './progress-bar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-progress-bar',\n role: 'progressbar',\n 'aria-valuemin': '0',\n 'aria-valuemax': '100',\n '[class.mk-progress-bar--sm]': \"size() === 'sm'\",\n '[class.mk-progress-bar--md]': \"size() === 'md'\",\n '[class.mk-progress-bar--lg]': \"size() === 'lg'\",\n '[class.mk-progress-bar--indeterminate]': 'indeterminate()',\n '[attr.data-tone]': 'tone()',\n '[attr.aria-valuenow]': 'indeterminate() ? null : clamped()',\n '[attr.aria-labelledby]': 'label() ? labelId : null',\n '[attr.aria-label]': \"label() ? null : 'Progress'\",\n },\n})\nexport class MkProgressBar {\n /** Completion percentage 0–100 (ignored while indeterminate). */\n readonly value = input(0, { transform: numberAttribute });\n /** Show an animated indeterminate bar with no known completion. */\n readonly indeterminate = input(false, { transform: booleanAttribute });\n /** Semantic color tone of the fill. */\n readonly tone = input<MkTone>('primary');\n /** Track thickness. */\n readonly size = input<MkSize>('md');\n /** Optional visible caption; also labels the bar for assistive tech. */\n readonly label = input<string>();\n /** Show the numeric percentage next to the label (determinate only). */\n readonly showValue = input(false, { transform: booleanAttribute });\n\n protected readonly labelId = mkUniqueId('mk-progress-label');\n\n /** Value clamped into the valid 0–100 range and rounded. */\n protected readonly clamped = computed(() =>\n Math.round(Math.min(100, Math.max(0, this.value()))),\n );\n\n /**\n * Inline transform for the determinate fill. Scaling instead of animating\n * `width` keeps the transition compositor-only (no layout per frame).\n */\n protected readonly fillTransform = computed(\n () => `scaleX(${this.clamped() / 100})`,\n );\n}\n","@if (label() || (showValue() && !indeterminate())) {\n <div class=\"mk-progress-bar__header\">\n @if (label()) {\n <span class=\"mk-progress-bar__label\" [id]=\"labelId\">{{ label() }}</span>\n }\n @if (showValue() && !indeterminate()) {\n <span class=\"mk-progress-bar__value\">{{ clamped() }}%</span>\n }\n </div>\n}\n<div class=\"mk-progress-bar__track\">\n <div\n class=\"mk-progress-bar__fill\"\n [style.transform]=\"indeterminate() ? null : fillTransform()\"\n ></div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\nimport type { MkTone } from '@mk-kit/ui/core';\n\n/**\n * ProgressRing — a circular progress indicator. Determinate by default (an arc\n * proportional to `value`); set `indeterminate` for a spinner-style preloader\n * when progress is unknown. Themed by `tone`, sized by `size`.\n *\n * ```html\n * <mk-progress-ring [value]=\"uploaded()\" showLabel />\n * <mk-progress-ring indeterminate tone=\"neutral\" [size]=\"24\" />\n * <mk-progress-ring [value]=\"72\" tone=\"success\"><mk-icon name=\"check\" /></mk-progress-ring>\n * ```\n */\n@Component({\n selector: 'mk-progress-ring',\n templateUrl: './progress-ring.html',\n styleUrl: './progress-ring.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-progress-ring',\n '[class.mk-progress-ring--indeterminate]': 'indeterminate()',\n '[attr.data-tone]': 'tone()',\n role: 'progressbar',\n '[attr.aria-valuenow]': 'indeterminate() ? null : clampedValue()',\n '[attr.aria-valuemin]': 'indeterminate() ? null : 0',\n '[attr.aria-valuemax]': 'indeterminate() ? null : max()',\n '[attr.aria-label]': 'label() || null',\n '[style.width.px]': 'size()',\n '[style.height.px]': 'size()',\n },\n})\nexport class MkProgressRing {\n /** Current progress value (clamped to `[0, max]`). Ignored when indeterminate. */\n readonly value = input(0, { transform: numberAttribute });\n /** Maximum value. Default `100`. */\n readonly max = input(100, { transform: numberAttribute });\n /** Diameter in px. Default `48`. */\n readonly size = input(48, { transform: numberAttribute });\n /** Ring thickness in px. Default `4`. */\n readonly thickness = input(4, { transform: numberAttribute });\n /** Semantic colour of the progress arc. */\n readonly tone = input<MkTone>('primary');\n /** Show a rotating arc for unknown-duration work (a circular preloader). */\n readonly indeterminate = input(false, { transform: booleanAttribute });\n /** Show the percentage in the centre. */\n readonly showLabel = input(false, { transform: booleanAttribute });\n /** Accessible label (recommended, especially when indeterminate). */\n readonly label = input<string>('');\n\n protected readonly clampedValue = computed(() =>\n Math.min(Math.max(this.value(), 0), this.max()),\n );\n protected readonly fraction = computed(() =>\n this.max() > 0 ? this.clampedValue() / this.max() : 0,\n );\n protected readonly percent = computed(() => Math.round(this.fraction() * 100));\n\n protected readonly radius = computed(() => (this.size() - this.thickness()) / 2);\n protected readonly circumference = computed(() => 2 * Math.PI * this.radius());\n /** Dash offset that reveals `fraction` of the circle. */\n protected readonly dashOffset = computed(() =>\n this.circumference() * (1 - this.fraction()),\n );\n protected readonly center = computed(() => this.size() / 2);\n}\n","<svg\n class=\"mk-progress-ring__svg\"\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n [attr.width]=\"size()\"\n [attr.height]=\"size()\"\n aria-hidden=\"true\"\n focusable=\"false\"\n>\n <circle\n class=\"mk-progress-ring__track\"\n [attr.cx]=\"center()\"\n [attr.cy]=\"center()\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"thickness()\"\n fill=\"none\"\n />\n <circle\n class=\"mk-progress-ring__arc\"\n [attr.cx]=\"center()\"\n [attr.cy]=\"center()\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"thickness()\"\n [attr.stroke-dasharray]=\"circumference()\"\n [attr.stroke-dashoffset]=\"indeterminate() ? circumference() * 0.7 : dashOffset()\"\n fill=\"none\"\n stroke-linecap=\"round\"\n />\n</svg>\n\n@if (showLabel() && !indeterminate()) {\n <span class=\"mk-progress-ring__label\">{{ percent() }}%</span>\n}\n<span class=\"mk-progress-ring__center\"><ng-content /></span>\n","/**\n * Shared, framework-agnostic helpers for the mk-kit SVG charts. Pure functions\n * only — no Angular, no DOM — so they stay trivially testable and reusable.\n */\n\n/** A named data series for multi-series charts. */\nexport interface MkChartSeries {\n /** Legend/tooltip label (identity — always shown, never colour-alone). */\n name: string;\n /** The values, one per category/x position. */\n data: number[];\n /** Optional explicit colour; defaults to the validated palette by index. */\n color?: string;\n}\n\n/** A single slice for the donut/pie chart. */\nexport interface MkChartSlice {\n /** Slice label. */\n name: string;\n /** Slice value (summed to compute proportions). */\n value: number;\n /** Optional explicit colour; defaults to the palette by index. */\n color?: string;\n}\n\n/** A resolved 2-D point in SVG user space. */\nexport interface MkPoint {\n x: number;\n y: number;\n}\n\n/** Number of hues in the validated categorical palette (`--mk-chart-1..8`). */\nexport const MK_CHART_PALETTE_SIZE = 8;\n\n/**\n * Categorical colour for a series index — a CSS reference to the validated\n * `--mk-chart-N` token. Assigned in fixed order and wrapped past 8 (prefer\n * folding a 9th series into \"Other\" over relying on the wrap).\n */\nexport function mkChartColor(index: number): string {\n return `var(--mk-chart-${(index % MK_CHART_PALETTE_SIZE) + 1})`;\n}\n\n/** Build a linear scale mapping `[d0,d1]` (domain) onto `[r0,r1]` (range). */\nexport function mkLinearScale(\n d0: number,\n d1: number,\n r0: number,\n r1: number,\n): (value: number) => number {\n const span = d1 - d0 || 1;\n return (value: number) => r0 + ((value - d0) / span) * (r1 - r0);\n}\n\n/**\n * \"Nice\" rounded tick values covering `[min,max]` with roughly `count` steps —\n * used for value axes so gridlines land on human numbers.\n */\nexport function mkNiceTicks(min: number, max: number, count = 5): number[] {\n if (min === max) {\n max = min + 1;\n }\n const range = max - min;\n const rawStep = range / Math.max(count, 1);\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const residual = rawStep / magnitude;\n const step =\n (residual >= 5 ? 10 : residual >= 2 ? 5 : residual >= 1 ? 2 : 1) * magnitude;\n const start = Math.floor(min / step) * step;\n const end = Math.ceil(max / step) * step;\n const ticks: number[] = [];\n // Guard against fp drift accumulating an extra tick.\n for (let v = start; v <= end + step / 2; v += step) {\n ticks.push(Number(v.toFixed(10)));\n }\n return ticks;\n}\n\n/** Straight-segment SVG path (`M … L …`) through the given points. */\nexport function mkLinePath(points: readonly MkPoint[]): string {\n if (!points.length) return '';\n return points\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`)\n .join(' ');\n}\n\n/**\n * Closed area path under a line: the line, dropped to `baselineY` at each end.\n */\nexport function mkAreaPath(\n points: readonly MkPoint[],\n baselineY: number,\n): string {\n if (!points.length) return '';\n const line = points\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`)\n .join(' ');\n const first = points[0];\n const last = points[points.length - 1];\n return `${line} L${last.x} ${baselineY} L${first.x} ${baselineY} Z`;\n}\n\n/**\n * SVG arc path for a donut/pie slice between two angles (radians, clockwise\n * from 12 o'clock). `inner` of 0 yields a pie wedge; > 0 yields a ring segment.\n */\nexport function mkArcPath(\n cx: number,\n cy: number,\n outer: number,\n inner: number,\n startAngle: number,\n endAngle: number,\n): string {\n const p = (r: number, a: number): MkPoint => ({\n x: cx + r * Math.sin(a),\n y: cy - r * Math.cos(a),\n });\n const large = endAngle - startAngle > Math.PI ? 1 : 0;\n const o0 = p(outer, startAngle);\n const o1 = p(outer, endAngle);\n if (inner <= 0) {\n return `M${cx} ${cy} L${o0.x} ${o0.y} A${outer} ${outer} 0 ${large} 1 ${o1.x} ${o1.y} Z`;\n }\n const i1 = p(inner, endAngle);\n const i0 = p(inner, startAngle);\n return (\n `M${o0.x} ${o0.y} A${outer} ${outer} 0 ${large} 1 ${o1.x} ${o1.y} ` +\n `L${i1.x} ${i1.y} A${inner} ${inner} 0 ${large} 0 ${i0.x} ${i0.y} Z`\n );\n}\n\n/** Compact number formatting for axes/tooltips (1.2k, 3.4M). */\nexport function mkFormatCompact(value: number): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000) return `${trim(value / 1_000_000)}M`;\n if (abs >= 1_000) return `${trim(value / 1_000)}k`;\n return `${trim(value)}`;\n}\n\nfunction trim(n: number): string {\n return Number(n.toFixed(1)).toString();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\nimport {\n MkPoint,\n mkAreaPath,\n mkFormatCompact,\n mkLinePath,\n} from './chart-utils';\n\n/** Visual form of a {@link MkSparkline}. */\nexport type MkSparklineType = 'line' | 'area' | 'bar';\n\n/**\n * Sparkline — a tiny, axis-less trend chart sized to sit inline in a table\n * cell, stat card or list row. Single series only; it's a *mark*, so it carries\n * no legend or tooltip (give context with the surrounding label + `label`).\n *\n * ```html\n * <mk-sparkline [data]=\"[3,5,4,7,6,9,8]\" type=\"area\" />\n * <mk-sparkline [data]=\"visits()\" [width]=\"80\" showDot\n * color=\"var(--mk-success)\" label=\"Weekly visits\" />\n * ```\n */\n@Component({\n selector: 'mk-sparkline',\n templateUrl: './sparkline.html',\n styleUrl: './sparkline.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-sparkline',\n role: 'img',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkSparkline {\n /** The values to plot (left → right). */\n readonly data = input<readonly number[]>([]);\n /** Visual form. */\n readonly type = input<MkSparklineType>('line');\n /** Any CSS colour; defaults to the first chart hue. */\n readonly color = input<string>('var(--mk-chart-1)');\n /** Intrinsic width in px (the SVG scales with its box). */\n readonly width = input(120, { transform: numberAttribute });\n /** Intrinsic height in px. */\n readonly height = input(32, { transform: numberAttribute });\n /** Line/area stroke width. */\n readonly strokeWidth = input(2, { transform: numberAttribute });\n /** Draw a dot on the last point (line/area only). */\n readonly showDot = input(false, { transform: booleanAttribute });\n /** Fixed domain minimum (defaults to the data min). */\n readonly min = input<number | undefined>(undefined);\n /** Fixed domain maximum (defaults to the data max). */\n readonly max = input<number | undefined>(undefined);\n /** Accessible label; a data summary is generated when omitted. */\n readonly label = input<string>('');\n\n private readonly pad = computed(() => this.strokeWidth() + (this.showDot() ? 2 : 0));\n\n private readonly domain = computed<[number, number]>(() => {\n const d = this.data();\n if (!d.length) return [0, 1];\n const lo = this.min() ?? Math.min(...d);\n const hi = this.max() ?? Math.max(...d);\n return lo === hi ? [lo - 1, hi + 1] : [lo, hi];\n });\n\n protected readonly points = computed<MkPoint[]>(() => {\n const d = this.data();\n if (!d.length) return [];\n const [lo, hi] = this.domain();\n const w = this.width();\n const h = this.height();\n const p = this.pad();\n const innerW = Math.max(w - 2 * p, 1);\n const innerH = Math.max(h - 2 * p, 1);\n const step = d.length > 1 ? innerW / (d.length - 1) : 0;\n return d.map((v, i) => ({\n x: p + (d.length > 1 ? i * step : innerW / 2),\n y: p + innerH - ((v - lo) / (hi - lo)) * innerH,\n }));\n });\n\n protected readonly linePath = computed(() => mkLinePath(this.points()));\n protected readonly areaPath = computed(() =>\n mkAreaPath(this.points(), this.height() - this.pad()),\n );\n\n /** Bar geometry for the `bar` type. */\n protected readonly bars = computed(() => {\n const d = this.data();\n if (!d.length) return [];\n const [lo, hi] = this.domain();\n const w = this.width();\n const h = this.height();\n const p = this.pad();\n const innerH = Math.max(h - 2 * p, 1);\n const gap = 2;\n const slot = (w - 2 * p) / d.length;\n const bw = Math.max(slot - gap, 1);\n const base = lo < 0 ? 0 : lo;\n return d.map((v, i) => {\n const y = p + innerH - ((Math.max(v, base) - lo) / (hi - lo)) * innerH;\n const y0 = p + innerH - ((base - lo) / (hi - lo)) * innerH;\n return { x: p + i * slot + gap / 2, y, w: bw, h: Math.max(y0 - y, 1) };\n });\n });\n\n protected readonly lastPoint = computed(() => {\n const pts = this.points();\n return pts.length ? pts[pts.length - 1] : null;\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const d = this.data();\n if (!d.length) return 'Sparkline, no data';\n const first = d[0];\n const last = d[d.length - 1];\n const dir = last > first ? 'up' : last < first ? 'down' : 'flat';\n return (\n `Sparkline trend ${dir}: ${d.length} points, ` +\n `${mkFormatCompact(first)} to ${mkFormatCompact(last)}, ` +\n `min ${mkFormatCompact(Math.min(...d))}, max ${mkFormatCompact(Math.max(...d))}`\n );\n });\n}\n","<svg\n class=\"mk-sparkline__svg\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n [attr.width]=\"width()\"\n [attr.height]=\"height()\"\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n>\n @if (type() === 'bar') {\n @for (b of bars(); track $index) {\n <rect\n class=\"mk-sparkline__bar\"\n [attr.x]=\"b.x\"\n [attr.y]=\"b.y\"\n [attr.width]=\"b.w\"\n [attr.height]=\"b.h\"\n [style.fill]=\"color()\"\n rx=\"1\"\n />\n }\n } @else {\n @if (type() === 'area') {\n <path class=\"mk-sparkline__area\" [attr.d]=\"areaPath()\" [style.fill]=\"color()\" />\n }\n <path\n class=\"mk-sparkline__line\"\n [attr.d]=\"linePath()\"\n [style.stroke]=\"color()\"\n [style.stroke-width]=\"strokeWidth()\"\n />\n @if (showDot() && lastPoint(); as p) {\n <circle\n class=\"mk-sparkline__dot\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n [attr.r]=\"strokeWidth() + 1\"\n [style.fill]=\"color()\"\n />\n }\n }\n</svg>\n","import {\n DestroyRef,\n ElementRef,\n Signal,\n afterNextRender,\n computed,\n inject,\n signal,\n} from '@angular/core';\n\n/**\n * Track the host element's width so a chart's viewBox can match the box it is\n * actually rendered into.\n *\n * Why this exists: the charts draw into a `viewBox` and the stylesheet sets\n * `width: 100%; height: auto`, so the rendered height was\n * `containerWidth × (viewBoxHeight / viewBoxWidth)` — unbounded. A full-width\n * chart on a wide monitor grew to over 2000px tall. Capping the height instead\n * is not a fix: `preserveAspectRatio=\"xMidYMid meet\"` then letterboxes the plot\n * into a narrow band with empty margins either side.\n *\n * Measuring the host and re-deriving the viewBox width keeps `height` meaning\n * exactly what it says (pixels) while the drawing fills the available width.\n *\n * SSR-safe: with no `ResizeObserver` (or before first render) the caller's\n * declared `width` is used unchanged, so server output is deterministic.\n *\n * Must be called from an injection context (field initialiser).\n */\nexport function mkChartAutoWidth(fallback: Signal<number>): Signal<number> {\n const host = inject(ElementRef<HTMLElement>);\n const destroyRef = inject(DestroyRef);\n const measured = signal<number | null>(null);\n\n afterNextRender(() => {\n if (typeof ResizeObserver === 'undefined') return;\n const el = host.nativeElement;\n const ro = new ResizeObserver((entries) => {\n const w = Math.round(entries[0]?.contentRect.width ?? 0);\n // Ignore a collapsed/hidden host — keeping the previous width avoids a\n // degenerate viewBox while the chart is inside a closed tab or panel.\n if (w > 0) measured.set(w);\n });\n ro.observe(el);\n destroyRef.onDestroy(() => ro.disconnect());\n });\n\n return computed(() => measured() ?? fallback());\n}\n","import { DOCUMENT, DestroyRef, ElementRef, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Tap-to-pin controller for chart hover tooltips — the touch path for UI that\n * is otherwise hover-only. Returned by {@link mkChartTapPin}.\n */\nexport interface MkChartTapPin<K> {\n /** Whether the tooltip is currently pinned by a tap. */\n isPinned(): boolean;\n /**\n * Pin the tooltip on `key`. Call from `pointerdown` on a hit target with the\n * original event — only `touch` pointers pin (mouse keeps its pure\n * hover-in/hover-out behaviour). Tapping another hit target moves the pin;\n * a pointerdown outside the chart clears it.\n */\n pin(key: K, event: PointerEvent): void;\n /**\n * Transient hover update from `pointerenter`/`pointerleave`. Enters always\n * apply; a leave (`null`) is ignored while pinned, so lifting the finger —\n * or a mouse straying off the chart — cannot dismiss a pinned tooltip.\n */\n hover(key: K | null): void;\n}\n\n/**\n * Creates a tap-to-pin controller for a chart's hover state. Must be called in\n * an injection context (a field initializer). `apply` receives the hover key to\n * set, or `null` to clear.\n *\n * While pinned, a capture-phase `pointerdown` listener on the document watches\n * for taps outside the chart host and clears the pin (listener added on pin,\n * removed on clear/destroy — SSR-safe: never attached on the server).\n */\nexport function mkChartTapPin<K>(apply: (key: K | null) => void): MkChartTapPin<K> {\n const documentRef = inject(DOCUMENT);\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n let pinned = false;\n\n const detach = (): void => {\n if (!pinned) return;\n pinned = false;\n documentRef.removeEventListener('pointerdown', onDocumentPointerdown, true);\n };\n\n const onDocumentPointerdown = (event: Event): void => {\n // Taps inside the chart move the pin via the hit target's own handler.\n if (host.contains(event.target as Node)) return;\n detach();\n apply(null);\n };\n\n inject(DestroyRef).onDestroy(detach);\n\n return {\n isPinned: () => pinned,\n\n pin(key: K, event: PointerEvent): void {\n if (event.pointerType !== 'touch') return;\n apply(key);\n if (pinned || !isBrowser) return;\n pinned = true;\n documentRef.addEventListener('pointerdown', onDocumentPointerdown, true);\n },\n\n hover(key: K | null): void {\n if (key === null && pinned) return;\n apply(key);\n },\n };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartAutoWidth } from './chart-autowidth';\nimport { mkChartTapPin } from './chart-tap-pin';\nimport {\n MkChartSeries,\n mkChartColor,\n mkFormatCompact,\n mkNiceTicks,\n} from './chart-utils';\n\ninterface BarRect {\n x: number;\n y: number;\n w: number;\n h: number;\n color: string;\n seriesIndex: number;\n categoryIndex: number;\n value: number;\n}\n\ninterface GridLine {\n value: number;\n label: string;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n labelX: number;\n labelY: number;\n}\n\ninterface Band {\n label: string;\n labelX: number;\n labelY: number;\n /** SVG transform when the axis is tilted; `null` when labels sit flat. */\n transform: string | null;\n}\n\n/**\n * Rough width of a label in px at the axis font-size (11px). Measuring for\n * real needs a laid-out DOM and a synchronous read per label per frame; a\n * per-character estimate is deterministic, testable, and only has to be good\n * enough to decide \"do these collide\".\n */\nconst CHAR_PX = 6.2;\nconst estimateLabelPx = (label: string) => label.length * CHAR_PX;\n\n/**\n * Fraction of its band a label may fill before `auto` tilts the axis.\n *\n * Not 1.0: labels that *technically* fit still read as a cramped run of words\n * with no gap between them (\"mar\" \"kwi\" \"maj\" touching each other), which is\n * the look tilting exists to avoid. Leaving a fifth of the band as breathing\n * room tilts the tight cases and leaves genuinely roomy axes alone.\n */\nconst TILT_THRESHOLD = 0.8;\n\n/** Bar orientation. */\nexport type MkBarOrientation = 'vertical' | 'horizontal';\n\n/**\n * BarChart — compares a measure across categories with one or more series\n * (grouped or `stacked`), `vertical` (default) or `horizontal`. Dependency-free\n * SVG on the validated `--mk-chart-*` palette; ships a legend for ≥ 2 series, a\n * value axis with gridlines, per-bar hover tooltips and a screen-reader table.\n *\n * ```html\n * <mk-bar-chart orientation=\"horizontal\"\n * [categories]=\"['Q1','Q2','Q3','Q4']\"\n * [series]=\"[{ name: 'Revenue', data: [12,19,15,22] }]\" />\n * ```\n */\n@Component({\n selector: 'mk-bar-chart',\n templateUrl: './bar-chart.html',\n styleUrl: './charts.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-bar-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkBarChart {\n /** Measured host width (falls back to `width` before first measure). */\n private readonly autoWidth = mkChartAutoWidth(computed(() => this.width()));\n /** The viewBox width the geometry is drawn against. */\n protected readonly drawWidth = computed(() =>\n this.responsive() ? this.autoWidth() : this.width(),\n );\n protected readonly i18n = inject(MK_I18N);\n\n /** Category labels along the category axis. */\n readonly categories = input<readonly string[]>([]);\n /** One or more data series (values align to `categories`). */\n readonly series = input<readonly MkChartSeries[]>([]);\n /** Bar direction. */\n readonly orientation = input<MkBarOrientation>('vertical');\n /** Intrinsic width in viewBox units — the fallback before the host is\n * measured, and the fixed drawing width when `responsive` is off. */\n readonly width = input(480, { transform: numberAttribute });\n /**\n * Match the viewBox width to the host's actual width so `height` means\n * pixels and a wide container no longer stretches the chart vertically.\n * Set false to pin the drawing to `width` (the pre-0.8 behaviour).\n */\n readonly responsive = input(true, { transform: booleanAttribute });\n /** Intrinsic height. */\n readonly height = input(260, { transform: numberAttribute });\n /** Stack series into one bar per category instead of grouping. */\n readonly stacked = input(false, { transform: booleanAttribute });\n /** Show gridlines behind the bars. */\n readonly showGrid = input(true, { transform: booleanAttribute });\n /** Force the legend on/off (defaults to on when there are ≥ 2 series). */\n readonly showLegend = input<boolean | undefined>(undefined);\n /**\n * Category-label tilt in degrees. `'auto'` (the default) leaves labels flat\n * while they fit and tilts them 45° when they would collide — the axis of a\n * narrow chart is otherwise an unreadable smear. A number pins the angle\n * (0 = always flat, 30/45 = always tilted); values are clamped to 0…90.\n *\n * Tilting reserves the extra vertical room it needs, so `height` still means\n * the height you asked for. When even tilted labels cannot fit, the chart\n * thins them — every Nth label is dropped rather than overlapped.\n */\n readonly labelAngle = input<number | 'auto'>('auto');\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n /** Make bars clickable + keyboard-focusable (`role=\"button\"`, accessible name) and emit `barClick`. */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** A bar was clicked or activated with Enter / Space (needs `interactive`). */\n readonly barClick = output<{ series: MkChartSeries; seriesIndex: number; category: string; categoryIndex: number; value: number }>();\n\n protected readonly hovered = signal<BarRect | null>(null);\n /** Tap-to-pin: a touch tap on a bar pins the tooltip until a tap lands\n * outside the chart (mouse hover in/out is unaffected). */\n private readonly tapPin = mkChartTapPin<BarRect>((b) => this.hovered.set(b));\n\n protected readonly horizontal = computed(\n () => this.orientation() === 'horizontal',\n );\n\n /** Widest category label, in estimated px. */\n private readonly widestLabelPx = computed(() =>\n this.categories().reduce((w, c) => Math.max(w, estimateLabelPx(c)), 0),\n );\n\n /**\n * The tilt actually applied. `auto` stays flat while the labels fit their\n * band and tilts 45° otherwise; an explicit number always wins (clamped).\n * Horizontal bars put categories on the Y axis, where tilting makes no\n * sense, so they are always flat.\n */\n protected readonly resolvedAngle = computed(() => {\n if (this.horizontal()) return 0;\n const requested = this.labelAngle();\n if (requested !== 'auto') {\n return Math.min(90, Math.max(0, requested));\n }\n const count = this.categories().length;\n if (!count) return 0;\n const band = Math.max(this.drawWidth() - 58, 1) / count;\n return this.widestLabelPx() <= band * TILT_THRESHOLD ? 0 : 45;\n });\n\n /**\n * Show every Nth label. Tilting buys room but not unlimited room: at 45° a\n * label still occupies `width * cos(45°)` horizontally, so a 24-category\n * chart in a card can need thinning on top of the tilt. Dropping labels\n * beats overlapping them — the bars all still draw.\n */\n protected readonly labelStep = computed(() => {\n const count = this.categories().length;\n if (!count) return 1;\n const band = Math.max(this.drawWidth() - 58, 1) / count;\n const angle = this.resolvedAngle();\n const footprint =\n this.widestLabelPx() * Math.cos((angle * Math.PI) / 180) || 1;\n return Math.max(1, Math.ceil(footprint / band));\n });\n\n private readonly margin = computed(() => {\n if (this.horizontal()) {\n return { top: 10, right: 18, bottom: 28, left: 72 };\n }\n // Tilted labels lean below the axis; reserve what they need so `height`\n // keeps meaning what the caller asked for instead of clipping at the\n // viewBox edge.\n const angle = this.resolvedAngle();\n const lean = angle\n ? this.widestLabelPx() * Math.sin((angle * Math.PI) / 180)\n : 0;\n return {\n top: 14,\n right: 14,\n bottom: 30 + Math.min(lean, 64),\n left: 44,\n };\n });\n\n protected readonly plot = computed(() => {\n const m = this.margin();\n return {\n x: m.left,\n y: m.top,\n w: Math.max(this.drawWidth() - m.left - m.right, 1),\n h: Math.max(this.height() - m.top - m.bottom, 1),\n };\n });\n\n protected readonly colors = computed(() =>\n this.series().map((s, i) => s.color ?? mkChartColor(i)),\n );\n\n protected readonly legendVisible = computed(\n () => this.showLegend() ?? this.series().length > 1,\n );\n\n private readonly maxValue = computed(() => {\n const series = this.series();\n const cats = this.categories();\n if (!series.length || !cats.length) return 1;\n if (this.stacked()) {\n let max = 0;\n for (let c = 0; c < cats.length; c++) {\n let sum = 0;\n for (const s of series) sum += Math.max(s.data[c] ?? 0, 0);\n max = Math.max(max, sum);\n }\n return max || 1;\n }\n return Math.max(1, ...series.flatMap((s) => s.data.map((v) => v || 0)));\n });\n\n protected readonly ticks = computed(() => mkNiceTicks(0, this.maxValue(), 5));\n private readonly tickMax = computed(() => {\n const t = this.ticks();\n return t[t.length - 1] || 1;\n });\n\n /** Pixel position along the value axis for a value. */\n private readonly valuePos = computed(() => {\n const { x, y, w, h } = this.plot();\n const max = this.tickMax();\n return this.horizontal()\n ? (v: number) => x + (v / max) * w\n : (v: number) => y + h - (v / max) * h;\n });\n\n /** Gridlines + value-axis labels (orientation-aware). */\n protected readonly gridRows = computed<GridLine[]>(() => {\n const { x, y, w, h } = this.plot();\n const pos = this.valuePos();\n return this.ticks().map((value) => {\n const label = mkFormatCompact(value);\n if (this.horizontal()) {\n const gx = pos(value);\n return { value, label, x1: gx, y1: y, x2: gx, y2: y + h, labelX: gx, labelY: y + h + 16 };\n }\n const gy = pos(value);\n return { value, label, x1: x, y1: gy, x2: x + w, y2: gy, labelX: x - 8, labelY: gy };\n });\n });\n\n /** Category-axis labels. */\n protected readonly bands = computed<Band[]>(() => {\n const cats = this.categories();\n const { x, y, w, h } = this.plot();\n if (this.horizontal()) {\n const bandH = h / (cats.length || 1);\n return cats.map((label, i) => ({\n label,\n labelX: x - 8,\n labelY: y + i * bandH + bandH / 2,\n transform: null,\n }));\n }\n const bandW = w / (cats.length || 1);\n const angle = this.resolvedAngle();\n const step = this.labelStep();\n const baselineY = y + h + 12;\n return cats.map((label, i) => {\n const cx = x + i * bandW + bandW / 2;\n // Thinned-out ticks keep their slot (so bars stay aligned) but render\n // nothing.\n const shown = i % step === 0 ? label : '';\n return {\n label: shown,\n labelX: cx,\n labelY: baselineY,\n // Rotate about the tick itself so the label's END sits under its bar\n // — anchoring at the start would walk the text off to the right.\n transform: angle ? `rotate(-${angle} ${cx} ${baselineY})` : null,\n };\n });\n });\n\n /** All bar rectangles (grouped or stacked, vertical or horizontal). */\n protected readonly bars = computed<BarRect[]>(() => {\n const series = this.series();\n const cats = this.categories();\n const colors = this.colors();\n const { x, y, w, h } = this.plot();\n const pos = this.valuePos();\n const base = this.horizontal() ? x : y + h;\n const out: BarRect[] = [];\n const bandSize = (this.horizontal() ? h : w) / (cats.length || 1);\n\n const push = (\n c: number,\n s: number,\n value: number,\n along: number, // offset within the band (cross-axis)\n thick: number,\n startVal: number,\n ) => {\n const bandStart = (this.horizontal() ? y : x) + c * bandSize + along;\n const p0 = pos(startVal);\n const p1 = pos(startVal + Math.max(value, 0));\n if (this.horizontal()) {\n out.push({ x: Math.min(p0, p1), y: bandStart, w: Math.abs(p1 - p0), h: thick, color: colors[s], seriesIndex: s, categoryIndex: c, value });\n } else {\n out.push({ x: bandStart, y: Math.min(p0, p1), w: thick, h: Math.abs(p1 - p0), color: colors[s], seriesIndex: s, categoryIndex: c, value });\n }\n };\n\n if (this.stacked()) {\n const barThick = bandSize * 0.6;\n const along = (bandSize - barThick) / 2;\n for (let c = 0; c < cats.length; c++) {\n let acc = 0;\n for (let s = 0; s < series.length; s++) {\n const v = Math.max(series[s].data[c] ?? 0, 0);\n if (v <= 0) continue;\n push(c, s, v, along, barThick, acc);\n acc += v;\n }\n }\n } else {\n const n = series.length || 1;\n const groupThick = bandSize * 0.7;\n const barThick = groupThick / n;\n for (let c = 0; c < cats.length; c++) {\n for (let s = 0; s < series.length; s++) {\n const v = series[s].data[c] ?? 0;\n const along = (bandSize - groupThick) / 2 + s * barThick;\n push(c, s, v, along, Math.max(barThick - 2, 1), 0);\n }\n }\n }\n // `base` referenced to satisfy the linter when value axes start at 0.\n void base;\n return out;\n });\n\n protected readonly legend = computed(() =>\n this.series().map((s, i) => ({ name: s.name, color: this.colors()[i] })),\n );\n\n /** Tooltip position (percent of viewBox) + content for the hovered bar. */\n protected readonly tooltip = computed(() => {\n const b = this.hovered();\n if (!b) return null;\n const [px, py] = this.horizontal()\n ? [b.x + b.w, b.y + b.h / 2]\n : [b.x + b.w / 2, b.y];\n return {\n left: (px / this.drawWidth()) * 100,\n top: (py / this.height()) * 100,\n category: this.categories()[b.categoryIndex],\n series: this.series()[b.seriesIndex]?.name ?? '',\n color: b.color,\n value: mkFormatCompact(b.value),\n multi: this.series().length > 1,\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const s = this.series();\n const cats = this.categories();\n if (!s.length || !cats.length) return 'Bar chart, no data';\n return `Bar chart of ${s.map((x) => x.name).join(', ')} across ${cats.length} categories`;\n });\n\n protected emitBar(b: BarRect, event?: Event): void {\n if (!this.interactive()) return;\n if (event instanceof KeyboardEvent) {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n }\n const series = this.series()[b.seriesIndex];\n if (!series) return;\n this.barClick.emit({ series, seriesIndex: b.seriesIndex, category: this.categories()[b.categoryIndex] ?? '', categoryIndex: b.categoryIndex, value: b.value });\n }\n\n protected barLabel(b: BarRect): string {\n return `${this.series()[b.seriesIndex]?.name ?? ''}, ${this.categories()[b.categoryIndex] ?? ''}: ${b.value}`;\n }\n\n protected setHover(bar: BarRect | null): void {\n this.tapPin.hover(bar);\n }\n\n protected pinHover(bar: BarRect, event: PointerEvent): void {\n this.tapPin.pin(bar, event);\n }\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg\"\n [attr.viewBox]=\"'0 0 ' + drawWidth() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n [attr.aria-hidden]=\"interactive() ? null : true\"\n [attr.role]=\"interactive() ? 'group' : null\"\n [attr.aria-label]=\"interactive() ? resolvedLabel() : null\"\n focusable=\"false\"\n >\n <!-- Gridlines + value-axis labels -->\n @for (row of gridRows(); track row.value) {\n @if (showGrid()) {\n <line\n class=\"mk-chart__grid\"\n [attr.x1]=\"row.x1\"\n [attr.x2]=\"row.x2\"\n [attr.y1]=\"row.y1\"\n [attr.y2]=\"row.y2\"\n />\n }\n <text\n class=\"mk-chart__axis-label\"\n [class.mk-chart__axis-label--y]=\"!horizontal()\"\n [class.mk-chart__axis-label--x]=\"horizontal()\"\n [attr.x]=\"row.labelX\"\n [attr.y]=\"row.labelY\"\n >\n {{ row.label }}\n </text>\n }\n\n <!-- Bars -->\n @for (b of bars(); track b.categoryIndex + '-' + b.seriesIndex) {\n <rect\n class=\"mk-chart__bar\"\n [class.mk-chart__bar--dim]=\"hovered() && hovered() !== b\"\n [attr.x]=\"b.x\"\n [attr.y]=\"b.y\"\n [attr.width]=\"b.w\"\n [attr.height]=\"b.h\"\n [style.fill]=\"b.color\"\n rx=\"3\"\n [class.mk-chart__bar--interactive]=\"interactive()\"\n [attr.role]=\"interactive() ? 'button' : null\"\n [attr.tabindex]=\"interactive() ? 0 : null\"\n [attr.aria-label]=\"interactive() ? barLabel(b) : null\"\n (pointerenter)=\"setHover(b)\"\n (pointerleave)=\"setHover(null)\"\n (pointerdown)=\"pinHover(b, $event)\"\n (click)=\"emitBar(b)\"\n (keydown)=\"emitBar(b, $event)\"\n (focus)=\"setHover(b)\"\n (blur)=\"setHover(null)\"\n />\n }\n\n <!-- Category labels. Tracked by index, not label: a 12-month window can\n start and end in the same month, and thinned axes repeat the empty\n string — both are duplicate keys (NG0955). -->\n @for (band of bands(); track $index) {\n @if (band.label) {\n <text\n class=\"mk-chart__axis-label\"\n [class.mk-chart__axis-label--x]=\"!horizontal() && !band.transform\"\n [class.mk-chart__axis-label--tilted]=\"band.transform\"\n [class.mk-chart__axis-label--y]=\"horizontal()\"\n [attr.x]=\"band.labelX\"\n [attr.y]=\"band.labelY\"\n [attr.transform]=\"band.transform\"\n >\n {{ band.label }}\n </text>\n }\n }\n </svg>\n\n @if (tooltip(); as t) {\n <div\n class=\"mk-chart__tooltip\"\n [style.left.%]=\"t.left\"\n [style.top.%]=\"t.top\"\n >\n <span class=\"mk-chart__tooltip-title\">{{ t.category }}</span>\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__swatch\" [style.background]=\"t.color\"></span>\n @if (t.multi) {\n <span class=\"mk-chart__tooltip-name\">{{ t.series }}</span>\n }\n <span class=\"mk-chart__tooltip-value\">{{ t.value }}</span>\n </span>\n </div>\n }\n</div>\n\n@if (legendVisible()) {\n <ul class=\"mk-chart__legend\">\n @for (item of legend(); track item.name) {\n <li class=\"mk-chart__legend-item\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartCategory }}</th>\n @for (s of series(); track s.name) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (cat of categories(); track cat; let c = $index) {\n <tr>\n <th scope=\"row\">{{ cat }}</th>\n @for (s of series(); track s.name) {\n <td>{{ s.data[c] }}</td>\n }\n </tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartAutoWidth } from './chart-autowidth';\nimport { mkChartTapPin } from './chart-tap-pin';\nimport {\n MkChartSeries,\n MkPoint,\n mkAreaPath,\n mkChartColor,\n mkFormatCompact,\n mkLinePath,\n mkNiceTicks,\n} from './chart-utils';\n\nconst MARGIN = { top: 14, right: 16, bottom: 30, left: 44 };\n\n/** Closed path filling between an upper (`top`) and lower (`bottom`) line. */\nfunction stackedAreaPath(\n top: readonly MkPoint[],\n bottom: readonly MkPoint[],\n): string {\n if (!top.length) return '';\n const topLine = top\n .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`)\n .join(' ');\n const botLine = [...bottom]\n .reverse()\n .map((p) => `L${p.x} ${p.y}`)\n .join(' ');\n return `${topLine} ${botLine} Z`;\n}\n\n/**\n * LineChart — a line (or `area`) chart for change over time / ordered\n * categories, with one or more series. Dependency-free SVG on the validated\n * `--mk-chart-*` palette; ships a legend for ≥ 2 series, a value axis, a\n * hover crosshair with a shared tooltip, and a screen-reader data table.\n *\n * ```html\n * <mk-line-chart area\n * [categories]=\"months\"\n * [series]=\"[{ name: 'Sessions', data: sessions() }]\" />\n * ```\n */\n@Component({\n selector: 'mk-line-chart',\n templateUrl: './line-chart.html',\n styleUrl: './charts.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-line-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkLineChart {\n /** Measured host width (falls back to `width` before first measure). */\n private readonly autoWidth = mkChartAutoWidth(computed(() => this.width()));\n /** The viewBox width the geometry is drawn against. */\n protected readonly drawWidth = computed(() =>\n this.responsive() ? this.autoWidth() : this.width(),\n );\n protected readonly i18n = inject(MK_I18N);\n\n /** Ordered category labels along the x axis. */\n readonly categories = input<readonly string[]>([]);\n /** One or more data series (values align to `categories`). */\n readonly series = input<readonly MkChartSeries[]>([]);\n /** Intrinsic width in viewBox units — the fallback before the host is\n * measured, and the fixed drawing width when `responsive` is off. */\n readonly width = input(480, { transform: numberAttribute });\n /**\n * Match the viewBox width to the host's actual width so `height` means\n * pixels and a wide container no longer stretches the chart vertically.\n * Set false to pin the drawing to `width` (the pre-0.8 behaviour).\n */\n readonly responsive = input(true, { transform: booleanAttribute });\n /** Intrinsic height. */\n readonly height = input(260, { transform: numberAttribute });\n /** Fill the area under each line. */\n readonly area = input(false, { transform: booleanAttribute });\n /** Stack the series (cumulative bands) — implies filled areas. */\n readonly stacked = input(false, { transform: booleanAttribute });\n /** Draw a dot at every data point. */\n readonly showDots = input(false, { transform: booleanAttribute });\n /** Show gridlines. */\n readonly showGrid = input(true, { transform: booleanAttribute });\n /** Force the legend on/off (defaults to on when there are ≥ 2 series). */\n readonly showLegend = input<boolean | undefined>(undefined);\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n /** Make x positions keyboard-focusable (`role=\"button\"`, accessible name) and emit `pointClick`. */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** A category (x position) was clicked or activated with Enter / Space (needs `interactive`). */\n readonly pointClick = output<{ index: number; category: string; values: Array<{ series: MkChartSeries; value: number }> }>();\n\n protected readonly hoverIndex = signal<number | null>(null);\n /** Tap-to-pin: a touch tap on a hit band pins the tooltip until a tap lands\n * outside the chart (mouse hover in/out is unaffected). */\n private readonly tapPin = mkChartTapPin<number>((i) => this.hoverIndex.set(i));\n\n protected readonly plot = computed(() => ({\n x: MARGIN.left,\n y: MARGIN.top,\n w: Math.max(this.drawWidth() - MARGIN.left - MARGIN.right, 1),\n h: Math.max(this.height() - MARGIN.top - MARGIN.bottom, 1),\n }));\n\n protected readonly colors = computed(() =>\n this.series().map((s, i) => s.color ?? mkChartColor(i)),\n );\n protected readonly legendVisible = computed(\n () => this.showLegend() ?? this.series().length > 1,\n );\n\n private readonly extent = computed<[number, number]>(() => {\n const series = this.series();\n if (!series.length) return [0, 1];\n if (this.stacked()) {\n const n = Math.max(0, ...series.map((s) => s.data.length));\n let max = 0;\n for (let i = 0; i < n; i++) {\n let sum = 0;\n for (const s of series) sum += Math.max(s.data[i] ?? 0, 0);\n max = Math.max(max, sum);\n }\n return [0, max || 1];\n }\n const values = series.flatMap((s) => s.data);\n if (!values.length) return [0, 1];\n return [Math.min(...values, 0), Math.max(...values)];\n });\n\n protected readonly ticks = computed(() => {\n const [lo, hi] = this.extent();\n return mkNiceTicks(lo, hi, 5);\n });\n private readonly domain = computed<[number, number]>(() => {\n const t = this.ticks();\n return [t[0], t[t.length - 1]];\n });\n\n private readonly toY = computed(() => {\n const { y, h } = this.plot();\n const [lo, hi] = this.domain();\n const span = hi - lo || 1;\n return (v: number) => y + h - ((v - lo) / span) * h;\n });\n private readonly xAt = computed(() => {\n const cats = this.categories();\n const { x, w } = this.plot();\n const step = cats.length > 1 ? w / (cats.length - 1) : 0;\n return (i: number) => (cats.length > 1 ? x + i * step : x + w / 2);\n });\n\n protected readonly gridRows = computed(() => {\n const { y, h } = this.plot();\n const [lo, hi] = this.domain();\n const span = hi - lo || 1;\n return this.ticks().map((value) => ({\n value,\n label: mkFormatCompact(value),\n y: y + h - ((value - lo) / span) * h,\n }));\n });\n\n /** Per-series rendered geometry (points + line + area paths). */\n protected readonly rendered = computed(() => {\n const toY = this.toY();\n const xAt = this.xAt();\n const series = this.series();\n\n if (this.stacked()) {\n const n = Math.max(0, ...series.map((s) => s.data.length));\n const running = new Array<number>(n).fill(0);\n return series.map((s, si) => {\n const bottom: MkPoint[] = running.map((v, i) => ({ x: xAt(i), y: toY(v) }));\n for (let i = 0; i < n; i++) running[i] += Math.max(s.data[i] ?? 0, 0);\n const top: MkPoint[] = running.map((v, i) => ({ x: xAt(i), y: toY(v) }));\n return {\n name: s.name,\n color: this.colors()[si],\n points: top,\n line: mkLinePath(top),\n area: stackedAreaPath(top, bottom),\n };\n });\n }\n\n const baseline = toY(this.domain()[0]);\n return series.map((s, si) => {\n const points: MkPoint[] = s.data.map((v, i) => ({ x: xAt(i), y: toY(v) }));\n return {\n name: s.name,\n color: this.colors()[si],\n points,\n line: mkLinePath(points),\n area: mkAreaPath(points, baseline),\n };\n });\n });\n\n /** Whether to paint the filled areas. */\n protected readonly fillAreas = computed(() => this.area() || this.stacked());\n\n /** Transparent hit bands (one per category) driving the shared tooltip. */\n protected readonly hitBands = computed(() => {\n const cats = this.categories();\n const { x, w, y, h } = this.plot();\n const bandW = cats.length ? w / cats.length : w;\n return cats.map((_, i) => ({\n index: i,\n x: this.xAt()(i) - bandW / 2,\n y,\n w: bandW,\n h,\n }));\n });\n\n protected readonly crosshairX = computed(() => {\n const i = this.hoverIndex();\n return i == null ? null : this.xAt()(i);\n });\n\n protected readonly legend = computed(() =>\n this.series().map((s, i) => ({ name: s.name, color: this.colors()[i] })),\n );\n\n /** Hovered-point markers + tooltip payload for the active category. */\n protected readonly activePoints = computed(() => {\n const i = this.hoverIndex();\n if (i == null) return [];\n return this.rendered().map((r) => ({\n color: r.color,\n name: r.name,\n x: r.points[i]?.x ?? 0,\n y: r.points[i]?.y ?? 0,\n value: this.series().find((s) => s.name === r.name)?.data[i] ?? 0,\n }));\n });\n\n protected readonly tooltip = computed(() => {\n const i = this.hoverIndex();\n const pts = this.activePoints();\n if (i == null || !pts.length) return null;\n const topY = Math.min(...pts.map((p) => p.y));\n return {\n left: (this.xAt()(i) / this.drawWidth()) * 100,\n top: (topY / this.height()) * 100,\n category: this.categories()[i],\n rows: pts.map((p) => ({\n color: p.color,\n name: p.name,\n value: mkFormatCompact(p.value),\n })),\n multi: this.series().length > 1,\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const s = this.series();\n if (!s.length) return 'Line chart, no data';\n return `Line chart of ${s.map((x) => x.name).join(', ')} over ${this.categories().length} points`;\n });\n\n protected emitPoint(index: number, event?: Event): void {\n if (!this.interactive()) return;\n if (event instanceof KeyboardEvent) {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n }\n this.pointClick.emit({\n index,\n category: this.categories()[index] ?? '',\n values: this.series().map((series) => ({ series, value: series.data[index] ?? 0 })),\n });\n }\n\n protected pointLabel(index: number): string {\n const values = this.series().map((s) => `${s.name} ${s.data[index] ?? 0}`).join(', ');\n return `${this.categories()[index] ?? ''}: ${values}`;\n }\n\n protected setHover(index: number | null): void {\n this.tapPin.hover(index);\n }\n\n protected pinHover(index: number, event: PointerEvent): void {\n this.tapPin.pin(index, event);\n }\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg\"\n [attr.viewBox]=\"'0 0 ' + drawWidth() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n [attr.aria-hidden]=\"interactive() ? null : true\"\n [attr.role]=\"interactive() ? 'group' : null\"\n [attr.aria-label]=\"interactive() ? resolvedLabel() : null\"\n focusable=\"false\"\n >\n <!-- Gridlines + value-axis labels -->\n @for (row of gridRows(); track row.value) {\n @if (showGrid()) {\n <line\n class=\"mk-chart__grid\"\n [attr.x1]=\"plot().x\"\n [attr.x2]=\"plot().x + plot().w\"\n [attr.y1]=\"row.y\"\n [attr.y2]=\"row.y\"\n />\n }\n <text\n class=\"mk-chart__axis-label mk-chart__axis-label--y\"\n [attr.x]=\"plot().x - 8\"\n [attr.y]=\"row.y\"\n >\n {{ row.label }}\n </text>\n }\n\n <!-- Areas + lines -->\n @for (r of rendered(); track r.name) {\n @if (fillAreas()) {\n <path class=\"mk-chart__area\" [attr.d]=\"r.area\" [style.fill]=\"r.color\" />\n }\n <path class=\"mk-chart__line\" [attr.d]=\"r.line\" [style.stroke]=\"r.color\" />\n @if (showDots()) {\n @for (p of r.points; track $index) {\n <circle\n class=\"mk-chart__dot\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"3\"\n [style.fill]=\"r.color\"\n />\n }\n }\n }\n\n <!-- Category labels -->\n @for (cat of categories(); track $index; let i = $index) {\n <text\n class=\"mk-chart__axis-label mk-chart__axis-label--x\"\n [attr.x]=\"plot().x + (categories().length > 1 ? (i * plot().w) / (categories().length - 1) : plot().w / 2)\"\n [attr.y]=\"height() - 10\"\n >\n {{ cat }}\n </text>\n }\n\n <!-- Hover crosshair + active point markers -->\n @if (crosshairX(); as cx) {\n <line\n class=\"mk-chart__crosshair\"\n [attr.x1]=\"cx\"\n [attr.x2]=\"cx\"\n [attr.y1]=\"plot().y\"\n [attr.y2]=\"plot().y + plot().h\"\n />\n @for (p of activePoints(); track p.name) {\n <circle\n class=\"mk-chart__dot\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"4\"\n [style.fill]=\"p.color\"\n />\n }\n }\n\n <!-- Transparent hit bands -->\n @for (band of hitBands(); track band.index) {\n <rect\n [attr.x]=\"band.x\"\n [attr.y]=\"band.y\"\n [attr.width]=\"band.w\"\n [attr.height]=\"band.h\"\n fill=\"transparent\"\n [class.mk-chart__band--interactive]=\"interactive()\"\n [attr.role]=\"interactive() ? 'button' : null\"\n [attr.tabindex]=\"interactive() ? 0 : null\"\n [attr.aria-label]=\"interactive() ? pointLabel(band.index) : null\"\n (pointerenter)=\"setHover(band.index)\"\n (pointerleave)=\"setHover(null)\"\n (pointerdown)=\"pinHover(band.index, $event)\"\n (click)=\"emitPoint(band.index)\"\n (keydown)=\"emitPoint(band.index, $event)\"\n (focus)=\"setHover(band.index)\"\n (blur)=\"setHover(null)\"\n />\n }\n </svg>\n\n @if (tooltip(); as t) {\n <div class=\"mk-chart__tooltip\" [style.left.%]=\"t.left\" [style.top.%]=\"t.top\">\n <span class=\"mk-chart__tooltip-title\">{{ t.category }}</span>\n @for (row of t.rows; track row.name) {\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__swatch\" [style.background]=\"row.color\"></span>\n @if (t.multi) {\n <span class=\"mk-chart__tooltip-name\">{{ row.name }}</span>\n }\n <span class=\"mk-chart__tooltip-value\">{{ row.value }}</span>\n </span>\n }\n </div>\n }\n</div>\n\n@if (legendVisible()) {\n <ul class=\"mk-chart__legend\">\n @for (item of legend(); track item.name) {\n <li class=\"mk-chart__legend-item\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartCategory }}</th>\n @for (s of series(); track s.name) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (cat of categories(); track cat; let c = $index) {\n <tr>\n <th scope=\"row\">{{ cat }}</th>\n @for (s of series(); track s.name) {\n <td>{{ s.data[c] }}</td>\n }\n </tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartTapPin } from './chart-tap-pin';\nimport {\n MkChartSlice,\n mkArcPath,\n mkChartColor,\n mkFormatCompact,\n} from './chart-utils';\n\ninterface SliceGeom {\n name: string;\n value: number;\n color: string;\n path: string;\n percent: number;\n midAngle: number;\n index: number;\n}\n\n/**\n * DonutChart — proportions of a whole as a ring (or a full pie when\n * `thickness` covers the radius). Dependency-free SVG on the validated\n * `--mk-chart-*` palette; ships a value/percent legend, per-slice hover\n * tooltips, an optional centre label, and a screen-reader data table.\n *\n * ```html\n * <mk-donut-chart centerLabel=\"1,240\" centerSublabel=\"Total\"\n * [slices]=\"[{ name: 'Direct', value: 540 }, { name: 'Search', value: 700 }]\" />\n * ```\n */\n@Component({\n selector: 'mk-donut-chart',\n templateUrl: './donut-chart.html',\n styleUrl: './charts.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-donut-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkDonutChart {\n protected readonly i18n = inject(MK_I18N);\n\n /** The slices; each `value` contributes to the whole. */\n readonly slices = input<readonly MkChartSlice[]>([]);\n /** Diameter in viewBox units (the SVG scales to its container). */\n readonly size = input(220, { transform: numberAttribute });\n /** Ring thickness. Set `0` (or ≥ radius) for a full pie. */\n readonly thickness = input(34, { transform: numberAttribute });\n /** Show the legend with values + percentages. */\n readonly showLegend = input(true, { transform: booleanAttribute });\n /** Big centre label (e.g. a total). Donut only. */\n readonly centerLabel = input<string>('');\n /** Small centre caption under the label. */\n readonly centerSublabel = input<string>('');\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n /**\n * Make slices (and legend rows) clickable and keyboard-focusable: they get\n * `role=\"button\"` + an accessible name and emit `sliceClick`. Off by default —\n * the chart stays a static picture with its screen-reader table.\n */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** A slice was clicked or activated with Enter / Space (needs `interactive`). */\n readonly sliceClick = output<{ slice: MkChartSlice; index: number }>();\n\n protected readonly hovered = signal<number | null>(null);\n /** Tap-to-pin: a touch tap on a slice pins the tooltip until a tap lands\n * outside the chart (mouse hover in/out is unaffected). */\n private readonly tapPin = mkChartTapPin<number>((i) => this.hovered.set(i));\n\n protected readonly total = computed(() =>\n this.slices().reduce((sum, s) => sum + Math.max(s.value, 0), 0),\n );\n\n protected readonly center = computed(() => this.size() / 2);\n protected readonly outerRadius = computed(() => this.size() / 2 - 2);\n protected readonly innerRadius = computed(() => {\n const outer = this.outerRadius();\n const t = this.thickness();\n return t <= 0 || t >= outer ? 0 : outer - t;\n });\n\n protected readonly geom = computed<SliceGeom[]>(() => {\n const total = this.total();\n if (total <= 0) return [];\n const cx = this.center();\n const cy = this.center();\n const outer = this.outerRadius();\n const inner = this.innerRadius();\n let angle = 0;\n return this.slices().map((s, i) => {\n const frac = Math.max(s.value, 0) / total;\n const start = angle;\n // Leave the smallest gap so a single 100% slice still renders as a ring.\n const end = angle + frac * Math.PI * 2 * 0.99999;\n angle += frac * Math.PI * 2;\n return {\n name: s.name,\n value: s.value,\n color: s.color ?? mkChartColor(i),\n path: mkArcPath(cx, cy, outer, inner, start, end),\n percent: Math.round(frac * 100),\n midAngle: (start + end) / 2,\n index: i,\n };\n });\n });\n\n protected readonly legend = computed(() =>\n this.geom().map((g) => ({\n name: g.name,\n color: g.color,\n value: mkFormatCompact(g.value),\n percent: g.percent,\n })),\n );\n\n protected readonly tooltip = computed(() => {\n const i = this.hovered();\n if (i == null) return null;\n const g = this.geom().find((x) => x.index === i);\n if (!g) return null;\n const r = (this.outerRadius() + this.innerRadius()) / 2;\n const x = this.center() + r * Math.sin(g.midAngle);\n const y = this.center() - r * Math.cos(g.midAngle);\n return {\n left: (x / this.size()) * 100,\n top: (y / this.size()) * 100,\n name: g.name,\n color: g.color,\n value: mkFormatCompact(g.value),\n percent: g.percent,\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const s = this.slices();\n if (!s.length) return 'Donut chart, no data';\n return `Donut chart with ${s.length} slices totalling ${mkFormatCompact(this.total())}`;\n });\n\n protected emitSlice(index: number, event?: Event): void {\n if (!this.interactive()) return;\n if (event instanceof KeyboardEvent) {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n }\n const slice = this.slices()[index];\n if (slice) this.sliceClick.emit({ slice, index });\n }\n\n protected sliceLabel(index: number): string {\n const s = this.slices()[index];\n return s ? `${s.name}: ${s.value}` : '';\n }\n\n protected setHover(index: number | null): void {\n this.tapPin.hover(index);\n }\n\n protected pinHover(index: number, event: PointerEvent): void {\n this.tapPin.pin(index, event);\n }\n}\n","<div class=\"mk-chart__frame mk-donut__frame\" [style.max-width.px]=\"size()\">\n <svg\n class=\"mk-chart__svg mk-donut__svg\"\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n preserveAspectRatio=\"xMidYMid meet\"\n [attr.aria-hidden]=\"interactive() ? null : true\"\n [attr.aria-label]=\"interactive() ? resolvedLabel() : null\"\n [attr.role]=\"interactive() ? 'group' : null\"\n focusable=\"false\"\n >\n @for (g of geom(); track g.index) {\n <path\n class=\"mk-chart__slice\"\n [class.mk-chart__slice--dim]=\"hovered() !== null && hovered() !== g.index\"\n [attr.d]=\"g.path\"\n [style.fill]=\"g.color\"\n [class.mk-chart__slice--interactive]=\"interactive()\"\n [attr.role]=\"interactive() ? 'button' : null\"\n [attr.tabindex]=\"interactive() ? 0 : null\"\n [attr.aria-label]=\"interactive() ? sliceLabel(g.index) : null\"\n (pointerenter)=\"setHover(g.index)\"\n (pointerleave)=\"setHover(null)\"\n (pointerdown)=\"pinHover(g.index, $event)\"\n (click)=\"emitSlice(g.index)\"\n (keydown)=\"emitSlice(g.index, $event)\"\n (focus)=\"setHover(g.index)\"\n (blur)=\"setHover(null)\"\n />\n }\n </svg>\n\n @if (innerRadius() > 0 && (centerLabel() || centerSublabel())) {\n <div class=\"mk-donut__center\">\n @if (centerLabel()) {\n <span class=\"mk-donut__center-label\">{{ centerLabel() }}</span>\n }\n @if (centerSublabel()) {\n <span class=\"mk-donut__center-sublabel\">{{ centerSublabel() }}</span>\n }\n </div>\n }\n\n @if (tooltip(); as t) {\n <div class=\"mk-chart__tooltip\" [style.left.%]=\"t.left\" [style.top.%]=\"t.top\">\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__swatch\" [style.background]=\"t.color\"></span>\n <span class=\"mk-chart__tooltip-name\">{{ t.name }}</span>\n <span class=\"mk-chart__tooltip-value\">{{ t.value }} ({{ t.percent }}%)</span>\n </span>\n </div>\n }\n</div>\n\n@if (showLegend()) {\n <ul class=\"mk-chart__legend mk-donut__legend\">\n @for (item of legend(); track item.name; let i = $index) {\n <li class=\"mk-chart__legend-item\">\n @if (interactive()) {\n <button type=\"button\" class=\"mk-chart__legend-button\" (click)=\"emitSlice(i)\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n <span class=\"mk-donut__legend-name\">{{ item.name }}</span>\n <span class=\"mk-donut__legend-value\">{{ item.value }} · {{ item.percent }}%</span>\n </button>\n } @else {\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n <span class=\"mk-donut__legend-name\">{{ item.name }}</span>\n <span class=\"mk-donut__legend-value\">{{ item.value }} · {{ item.percent }}%</span>\n }\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr><th scope=\"col\">{{ i18n.chartSlice }}</th><th scope=\"col\">{{ i18n.chartValue }}</th></tr>\n </thead>\n <tbody>\n @for (s of slices(); track s.name) {\n <tr><th scope=\"row\">{{ s.name }}</th><td>{{ s.value }}</td></tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { mkArcPath, mkFormatCompact } from './chart-utils';\n\n/**\n * Gauge — a single-metric radial dial (a KPI: \"68% of quota\"). Dependency-free\n * SVG: a track arc with a value arc filled proportionally to `value` on the\n * `[min, max]` scale, and a centred value + label. The sweep is configurable\n * (`arc`, default 270°). Exposes `role=\"meter\"` for assistive tech.\n *\n * ```html\n * <mk-gauge [value]=\"68\" label=\"of quota\" unit=\"%\" />\n * ```\n */\n@Component({\n selector: 'mk-gauge',\n templateUrl: './gauge.html',\n styleUrl: './gauge.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-gauge',\n role: 'meter',\n '[attr.aria-valuenow]': 'value()',\n '[attr.aria-valuemin]': 'min()',\n '[attr.aria-valuemax]': 'max()',\n '[attr.aria-valuetext]': 'centerText()',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkGauge {\n /** The current value. */\n readonly value = input(0, { transform: numberAttribute });\n /** Scale minimum. */\n readonly min = input(0, { transform: numberAttribute });\n /** Scale maximum. */\n readonly max = input(100, { transform: numberAttribute });\n /** Sweep of the arc in degrees (30–360). */\n readonly arc = input(270, { transform: numberAttribute });\n /** Intrinsic size (viewBox units; the SVG scales to its container). */\n readonly size = input(180, { transform: numberAttribute });\n /** Arc thickness. */\n readonly thickness = input(14, { transform: numberAttribute });\n /** Value-arc colour. */\n readonly color = input('var(--mk-primary)');\n /** Track (background arc) colour. */\n readonly trackColor = input('var(--mk-border-subtle)');\n /** Label under the value. */\n readonly label = input('');\n /** Unit appended to the value (e.g. `%`). */\n readonly unit = input('');\n /** Override the centred value text. */\n readonly valueText = input('');\n\n private readonly TAU = Math.PI * 2;\n\n protected readonly cx = computed(() => this.size() / 2);\n protected readonly cy = computed(() => this.size() / 2);\n private readonly rOuter = computed(() => this.size() / 2 - 2);\n private readonly rInner = computed(() =>\n Math.max(1, this.rOuter() - this.thickness()),\n );\n\n /** Value clamped to [min, max] then normalised to 0–1. */\n protected readonly fraction = computed(() => {\n const span = this.max() - this.min() || 1;\n return Math.max(0, Math.min(1, (this.value() - this.min()) / span));\n });\n\n private readonly sweep = computed(\n () => (Math.max(30, Math.min(360, this.arc())) * Math.PI) / 180,\n );\n /** Arc starts after half the gap, measured clockwise from 6 o'clock. */\n private readonly startAngle = computed(\n () => Math.PI + (this.TAU - this.sweep()) / 2,\n );\n\n protected readonly trackPath = computed(() =>\n mkArcPath(\n this.cx(),\n this.cy(),\n this.rOuter(),\n this.rInner(),\n this.startAngle(),\n this.startAngle() + this.sweep(),\n ),\n );\n\n protected readonly valuePath = computed(() => {\n const frac = this.fraction();\n if (frac <= 0) return '';\n return mkArcPath(\n this.cx(),\n this.cy(),\n this.rOuter(),\n this.rInner(),\n this.startAngle(),\n this.startAngle() + this.sweep() * frac,\n );\n });\n\n protected readonly centerText = computed(\n () => this.valueText() || `${mkFormatCompact(this.value())}${this.unit()}`,\n );\n\n protected readonly resolvedLabel = computed(() => {\n const l = this.label() ? ` ${this.label()}` : '';\n return `${this.centerText()}${l}`;\n });\n}\n","<svg\n class=\"mk-gauge__svg\"\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n preserveAspectRatio=\"xMidYMid meet\"\n aria-hidden=\"true\"\n focusable=\"false\"\n>\n <path\n class=\"mk-gauge__track\"\n [attr.d]=\"trackPath()\"\n [style.fill]=\"trackColor()\"\n />\n @if (valuePath()) {\n <path class=\"mk-gauge__value\" [attr.d]=\"valuePath()\" [style.fill]=\"color()\" />\n }\n <text\n class=\"mk-gauge__number\"\n [attr.x]=\"cx()\"\n [attr.y]=\"cy()\"\n text-anchor=\"middle\"\n dominant-baseline=\"central\"\n >\n {{ centerText() }}\n </text>\n @if (label()) {\n <text\n class=\"mk-gauge__label\"\n [attr.x]=\"cx()\"\n [attr.y]=\"cy() + size() * 0.14\"\n text-anchor=\"middle\"\n >\n {{ label() }}\n </text>\n }\n</svg>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartTapPin } from './chart-tap-pin';\nimport {\n mkChartColor,\n mkFormatCompact,\n mkLinearScale,\n mkNiceTicks,\n} from './chart-utils';\n\n/** A single plotted point. `size` (optional) turns it into a bubble. */\nexport interface MkScatterPoint {\n x: number;\n y: number;\n /** Value driving the bubble radius when `bubble` sizing is used. */\n size?: number;\n /** Optional label shown in the tooltip. */\n label?: string;\n}\n\n/** A named group of scatter points sharing a colour. */\nexport interface MkScatterSeries {\n name: string;\n color?: string;\n points: readonly MkScatterPoint[];\n}\n\nconst MARGIN = { top: 14, right: 16, bottom: 34, left: 48 };\n\ninterface RenderedPoint {\n cx: number;\n cy: number;\n r: number;\n color: string;\n seriesName: string;\n x: number;\n y: number;\n label?: string;\n}\n\n/**\n * ScatterChart — plot (x, y) points across two numeric axes to reveal\n * correlation and clusters. Give each point a `size` to render a bubble chart.\n * Dependency-free SVG on the validated `--mk-chart-*` palette; ships nice-tick\n * axes, a legend for ≥ 2 series, a per-point hover tooltip and a screen-reader\n * data table.\n *\n * ```html\n * <mk-scatter-chart\n * xLabel=\"Spend\" yLabel=\"Revenue\"\n * [series]=\"[{ name: 'Q3', points: pts() }]\" />\n * ```\n */\n@Component({\n selector: 'mk-scatter-chart',\n templateUrl: './scatter-chart.html',\n styleUrl: './charts.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-scatter-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkScatterChart {\n protected readonly i18n = inject(MK_I18N);\n\n /** One or more point series. */\n readonly series = input<readonly MkScatterSeries[]>([]);\n /** Intrinsic width (viewBox units; the SVG scales to its container). */\n readonly width = input(480, { transform: numberAttribute });\n /** Intrinsic height. */\n readonly height = input(300, { transform: numberAttribute });\n /** Radius of each point when not sizing by `size`. */\n readonly pointRadius = input(4, { transform: numberAttribute });\n /** Size points by their `size` value (bubble chart). */\n readonly bubble = input(false, { transform: booleanAttribute });\n /** Largest bubble radius when `bubble` is on. */\n readonly maxRadius = input(20, { transform: numberAttribute });\n /** Show gridlines. */\n readonly showGrid = input(true, { transform: booleanAttribute });\n /** Force the legend on/off (defaults to on when there are ≥ 2 series). */\n readonly showLegend = input<boolean | undefined>(undefined);\n /** x-axis title. */\n readonly xLabel = input<string>('');\n /** y-axis title. */\n readonly yLabel = input<string>('');\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n\n protected readonly hoverKey = signal<string | null>(null);\n /** Tap-to-pin: a touch tap on a point pins the tooltip until a tap lands\n * outside the chart (mouse hover in/out is unaffected). */\n private readonly tapPin = mkChartTapPin<string>((k) => this.hoverKey.set(k));\n\n protected readonly plot = computed(() => ({\n x: MARGIN.left,\n y: MARGIN.top,\n w: Math.max(this.width() - MARGIN.left - MARGIN.right, 1),\n h: Math.max(this.height() - MARGIN.top - MARGIN.bottom, 1),\n }));\n\n protected readonly colors = computed(() =>\n this.series().map((s, i) => s.color ?? mkChartColor(i)),\n );\n protected readonly legendVisible = computed(\n () => this.showLegend() ?? this.series().length > 1,\n );\n\n private readonly allPoints = computed(() =>\n this.series().flatMap((s) => s.points),\n );\n\n private readonly xExtent = computed<[number, number]>(() => {\n const xs = this.allPoints().map((p) => p.x);\n return xs.length ? [Math.min(...xs), Math.max(...xs)] : [0, 1];\n });\n private readonly yExtent = computed<[number, number]>(() => {\n const ys = this.allPoints().map((p) => p.y);\n return ys.length ? [Math.min(...ys), Math.max(...ys)] : [0, 1];\n });\n\n protected readonly xTicks = computed(() =>\n mkNiceTicks(this.xExtent()[0], this.xExtent()[1], 5),\n );\n protected readonly yTicks = computed(() =>\n mkNiceTicks(this.yExtent()[0], this.yExtent()[1], 5),\n );\n\n private readonly xScale = computed(() => {\n const t = this.xTicks();\n const { x, w } = this.plot();\n return mkLinearScale(t[0], t[t.length - 1], x, x + w);\n });\n private readonly yScale = computed(() => {\n const t = this.yTicks();\n const { y, h } = this.plot();\n // Invert: larger values sit higher on the screen.\n return mkLinearScale(t[0], t[t.length - 1], y + h, y);\n });\n\n private readonly sizeExtent = computed<[number, number]>(() => {\n const sizes = this.allPoints().map((p) => p.size ?? 0);\n return sizes.length ? [Math.min(...sizes), Math.max(...sizes)] : [0, 1];\n });\n\n private radiusFor(size: number | undefined): number {\n if (!this.bubble()) return this.pointRadius();\n const [lo, hi] = this.sizeExtent();\n const span = hi - lo || 1;\n const t = ((size ?? lo) - lo) / span;\n // Area-proportional so perceived size tracks value; floor at 3px.\n const min = 3;\n return min + Math.sqrt(t) * (this.maxRadius() - min);\n }\n\n /** Gridlines + axis-tick geometry. */\n protected readonly xGrid = computed(() => {\n const { y, h } = this.plot();\n return this.xTicks().map((value) => ({\n value,\n label: mkFormatCompact(value),\n x: this.xScale()(value),\n y1: y,\n y2: y + h,\n }));\n });\n protected readonly yGrid = computed(() => {\n const { x, w } = this.plot();\n return this.yTicks().map((value) => ({\n value,\n label: mkFormatCompact(value),\n y: this.yScale()(value),\n x1: x,\n x2: x + w,\n }));\n });\n\n /** Every point positioned for rendering. */\n protected readonly points = computed<RenderedPoint[]>(() => {\n const xs = this.xScale();\n const ys = this.yScale();\n return this.series().flatMap((s, si) =>\n s.points.map((p) => ({\n cx: xs(p.x),\n cy: ys(p.y),\n r: this.radiusFor(p.size),\n color: this.colors()[si],\n seriesName: s.name,\n x: p.x,\n y: p.y,\n label: p.label,\n })),\n );\n });\n\n protected keyOf(index: number): string {\n return `p${index}`;\n }\n\n protected readonly legend = computed(() =>\n this.series().map((s, i) => ({ name: s.name, color: this.colors()[i] })),\n );\n\n protected readonly tooltip = computed(() => {\n const key = this.hoverKey();\n if (key == null) return null;\n const idx = Number(key.slice(1));\n const p = this.points()[idx];\n if (!p) return null;\n return {\n left: (p.cx / this.width()) * 100,\n top: (p.cy / this.height()) * 100,\n color: p.color,\n title: p.label ?? p.seriesName,\n x: mkFormatCompact(p.x),\n y: mkFormatCompact(p.y),\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const s = this.series();\n if (!s.length) return 'Scatter chart, no data';\n const total = this.allPoints().length;\n return `Scatter chart of ${s.map((x) => x.name).join(', ')}, ${total} points`;\n });\n\n protected setHover(key: string | null): void {\n this.tapPin.hover(key);\n }\n\n protected pinHover(key: string, event: PointerEvent): void {\n this.tapPin.pin(key, event);\n }\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <!-- Horizontal gridlines + y-axis labels -->\n @for (row of yGrid(); track row.value) {\n @if (showGrid()) {\n <line\n class=\"mk-chart__grid\"\n [attr.x1]=\"row.x1\"\n [attr.x2]=\"row.x2\"\n [attr.y1]=\"row.y\"\n [attr.y2]=\"row.y\"\n />\n }\n <text\n class=\"mk-chart__axis-label mk-chart__axis-label--y\"\n [attr.x]=\"plot().x - 8\"\n [attr.y]=\"row.y\"\n >\n {{ row.label }}\n </text>\n }\n\n <!-- x-axis labels -->\n @for (col of xGrid(); track col.value) {\n <text\n class=\"mk-chart__axis-label mk-chart__axis-label--x\"\n [attr.x]=\"col.x\"\n [attr.y]=\"height() - 12\"\n >\n {{ col.label }}\n </text>\n }\n\n <!-- Axis titles -->\n @if (xLabel()) {\n <text\n class=\"mk-chart__axis-title mk-chart__axis-title--x\"\n [attr.x]=\"plot().x + plot().w / 2\"\n [attr.y]=\"height() - 1\"\n >\n {{ xLabel() }}\n </text>\n }\n @if (yLabel()) {\n <text\n class=\"mk-chart__axis-title mk-chart__axis-title--y\"\n [attr.transform]=\"'rotate(-90 10 ' + (plot().y + plot().h / 2) + ')'\"\n [attr.x]=\"10\"\n [attr.y]=\"plot().y + plot().h / 2\"\n >\n {{ yLabel() }}\n </text>\n }\n\n <!-- Points -->\n @for (p of points(); track $index; let i = $index) {\n <circle\n class=\"mk-chart__point\"\n [class.mk-chart__point--active]=\"hoverKey() === keyOf(i)\"\n [attr.cx]=\"p.cx\"\n [attr.cy]=\"p.cy\"\n [attr.r]=\"p.r\"\n [style.fill]=\"p.color\"\n (pointerenter)=\"setHover(keyOf(i))\"\n (pointerleave)=\"setHover(null)\"\n (pointerdown)=\"pinHover(keyOf(i), $event)\"\n />\n }\n </svg>\n\n @if (tooltip(); as t) {\n <div class=\"mk-chart__tooltip\" [style.left.%]=\"t.left\" [style.top.%]=\"t.top\">\n <span class=\"mk-chart__tooltip-title\">\n <span class=\"mk-chart__swatch\" [style.background]=\"t.color\"></span>\n {{ t.title }}\n </span>\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__tooltip-name\">{{ xLabel() || 'x' }}</span>\n <span class=\"mk-chart__tooltip-value\">{{ t.x }}</span>\n </span>\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__tooltip-name\">{{ yLabel() || 'y' }}</span>\n <span class=\"mk-chart__tooltip-value\">{{ t.y }}</span>\n </span>\n </div>\n }\n</div>\n\n@if (legendVisible()) {\n <ul class=\"mk-chart__legend\">\n @for (item of legend(); track item.name) {\n <li class=\"mk-chart__legend-item\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartSeries }}</th>\n <th scope=\"col\">{{ xLabel() || 'x' }}</th>\n <th scope=\"col\">{{ yLabel() || 'y' }}</th>\n </tr>\n </thead>\n <tbody>\n @for (s of series(); track s.name) {\n @for (p of s.points; track $index) {\n <tr>\n <th scope=\"row\">{{ s.name }}</th>\n <td>{{ p.x }}</td>\n <td>{{ p.y }}</td>\n </tr>\n }\n }\n </tbody>\n</table>\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { mkFormatCompact } from './chart-utils';\n\ninterface HeatCell {\n value: number | null;\n display: string;\n xLabel: string;\n bg: string;\n /** Draw the value with `--mk-text-inverse` (else `--mk-text`). */\n inverse: boolean;\n}\ninterface HeatRow {\n label: string;\n cells: HeatCell[];\n}\n\n/** An sRGB colour as 0–255 channels. */\nexport type MkRgb = readonly [number, number, number];\n\n/** The resolved colours a heatmap picks its cell text against. */\nexport interface MkHeatmapPalette {\n /** The `accent` input, resolved to sRGB. */\n accent: MkRgb;\n /** `--mk-surface-2` — the zero-intensity cell colour. */\n surface: MkRgb;\n /** `--mk-text`. */\n text: MkRgb;\n /** `--mk-text-inverse`. */\n textInverse: MkRgb;\n}\n\n/** Which text token a cell value is drawn with, and the intensity to paint the cell at. */\nexport interface MkHeatmapCellColors {\n /** Accent share of the cell background, 0–1. */\n intensity: number;\n /** `true` → `--mk-text-inverse`, `false` → `--mk-text`. */\n inverse: boolean;\n /** Contrast ratio of the chosen text against the cell background (1–21). */\n contrast: number;\n}\n\n/** WCAG AA minimum contrast for normal text — what cell values are held to. */\nexport const MK_HEATMAP_MIN_CONTRAST = 4.5;\n\n/** WCAG 2.x relative luminance of an sRGB colour. */\nexport function mkRelativeLuminance([r, g, b]: MkRgb): number {\n const lin = (c: number): number => {\n const s = c / 255;\n return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n}\n\n/** WCAG 2.x contrast ratio (1–21) between two colours. */\nexport function mkContrastRatio(a: MkRgb, b: MkRgb): number {\n const la = mkRelativeLuminance(a);\n const lb = mkRelativeLuminance(b);\n const [hi, lo] = la > lb ? [la, lb] : [lb, la];\n return (hi + 0.05) / (lo + 0.05);\n}\n\n/** What `color-mix(in srgb, a t%, b)` yields: a linear blend in gamma-encoded sRGB. */\nexport function mkMixRgb(a: MkRgb, b: MkRgb, t: number): MkRgb {\n const mix = (x: number, y: number): number => Math.round(x * t + y * (1 - t));\n return [mix(a[0], b[0]), mix(a[1], b[1]), mix(a[2], b[2])];\n}\n\n/**\n * Parse a CSS colour as the CSSOM serialises it — `rgb(r, g, b)` /\n * `rgba(r, g, b, a)` — or a `#rgb` / `#rrggbb` literal. `null` for anything\n * else (an unresolved `var()`, `color(...)`, …).\n */\nexport function mkParseRgb(text: string | null | undefined): MkRgb | null {\n const s = (text ?? '').trim();\n const fn = /^rgba?\\(\\s*(\\d+(?:\\.\\d+)?)[\\s,]+(\\d+(?:\\.\\d+)?)[\\s,]+(\\d+(?:\\.\\d+)?)/i.exec(s);\n if (fn) return [Number(fn[1]), Number(fn[2]), Number(fn[3])];\n const hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(s);\n if (!hex) return null;\n const h = hex[1].length === 3 ? [...hex[1]].map((c) => c + c).join('') : hex[1];\n return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];\n}\n\n/** Best of the two text tokens against the cell painted at intensity `t`. */\nfunction pickText(t: number, palette: MkHeatmapPalette): MkHeatmapCellColors {\n const bg = mkMixRgb(palette.accent, palette.surface, t);\n const onText = mkContrastRatio(palette.text, bg);\n const onInverse = mkContrastRatio(palette.textInverse, bg);\n return onInverse > onText\n ? { intensity: t, inverse: true, contrast: onInverse }\n : { intensity: t, inverse: false, contrast: onText };\n}\n\n/**\n * Choose the text token for a cell at intensity `t` (0–1) — light text on\n * dark cells, dark text on light cells, decided by contrast against the\n * actual blend rather than a fixed threshold.\n *\n * Every accent ramp has a crossover band where neither `--mk-text` nor\n * `--mk-text-inverse` reaches 4.5:1 (the cell is mid-luminance). When values\n * are printed in the cells, a cell in that band is painted at the nearest\n * intensity just outside it, so its value stays readable; the shift is a few\n * percent of the ramp and the cell keeps its order relative to its\n * neighbours. Without a resolved palette (server rendering, tests) a plain\n * threshold is used.\n */\nexport function mkHeatmapCellColors(\n t: number,\n palette: MkHeatmapPalette | null,\n showValues: boolean,\n): MkHeatmapCellColors {\n const clamped = Math.max(0, Math.min(1, t));\n if (!palette) return { intensity: clamped, inverse: clamped >= 0.55, contrast: NaN };\n const best = pickText(clamped, palette);\n if (!showValues || best.contrast >= MK_HEATMAP_MIN_CONTRAST) return best;\n // In the crossover band: step outward (down and up alternately, 1 % at a\n // time) to the closest intensity at which one of the tokens passes.\n for (let step = 1; step <= 100; step++) {\n const delta = step / 100;\n for (const candidate of [clamped - delta, clamped + delta]) {\n if (candidate < 0 || candidate > 1) continue;\n const pick = pickText(candidate, palette);\n if (pick.contrast >= MK_HEATMAP_MIN_CONTRAST) return pick;\n }\n }\n return best;\n}\n\n/**\n * Heatmap — a matrix of cells shaded by value intensity, for correlation\n * grids, activity-by-time tables and the like. Rendered as a semantic\n * `<table>` (so it is inherently screen-reader friendly) with cell colours\n * mixed from `accent` over the surface via `color-mix`, so it tracks the theme.\n *\n * Printed values (`showValues`) pick `--mk-text` or `--mk-text-inverse` per\n * cell by contrast against that cell's actual colour, in both themes — see\n * {@link mkHeatmapCellColors}.\n *\n * ```html\n * <mk-heatmap\n * [xLabels]=\"hours\" [yLabels]=\"days\" [data]=\"matrix()\" showValues />\n * ```\n */\n@Component({\n selector: 'mk-heatmap',\n templateUrl: './heatmap.html',\n styleUrl: './heatmap.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-heatmap',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkHeatmap {\n private readonly doc = inject(DOCUMENT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n /** Column labels (x axis). */\n readonly xLabels = input<readonly string[]>([]);\n /** Row labels (y axis). */\n readonly yLabels = input<readonly string[]>([]);\n /** Row-major matrix: `data[row][col]`. Use `null` for a blank cell. */\n readonly data = input<readonly (readonly (number | null)[])[]>([]);\n /** Override the low end of the colour domain (defaults to the data min). */\n readonly min = input<number | null>(null);\n /** Override the high end of the colour domain (defaults to the data max). */\n readonly max = input<number | null>(null);\n /** Base colour mixed over the surface for intensity. */\n readonly accent = input<string>('var(--mk-primary)');\n /** Print each cell's value inside it. */\n readonly showValues = input(false, { transform: booleanAttribute });\n /** Show the min→max colour scale legend. */\n readonly showScale = input(true, { transform: booleanAttribute });\n /** Formatter for cell + legend values. */\n readonly format = input<(value: number) => string>(mkFormatCompact);\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n\n /**\n * The accent and the text/surface tokens resolved through the CSSOM, so\n * each cell can pick a text colour that actually contrasts with its blend.\n * `null` until resolved (server, jsdom) — the cells then fall back to a\n * threshold.\n */\n protected readonly palette = signal<MkHeatmapPalette | null>(null);\n\n /** Bumped when the document theme changes so the palette is re-resolved. */\n private readonly themeTick = signal(0);\n\n constructor() {\n afterRenderEffect(() => {\n this.accent();\n this.themeTick();\n untracked(() => this.palette.set(this.resolvePalette()));\n });\n this.watchTheme();\n }\n\n private readonly domain = computed<[number, number]>(() => {\n const flat = this.data()\n .flat()\n .filter((v): v is number => v != null);\n const lo = this.min() ?? (flat.length ? Math.min(...flat) : 0);\n const hi = this.max() ?? (flat.length ? Math.max(...flat) : 1);\n return [lo, hi];\n });\n\n /** Fraction (0–1) of the domain a value sits at. */\n private ratio(value: number): number {\n const [lo, hi] = this.domain();\n const span = hi - lo || 1;\n return Math.max(0, Math.min(1, (value - lo) / span));\n }\n\n /** The `color-mix()` expression painting a cell at intensity `t`. */\n private cellBackground(t: number): string {\n return `color-mix(in srgb, ${this.accent()} ${Math.round(t * 100)}%, var(--mk-surface-2))`;\n }\n\n protected readonly rows = computed<HeatRow[]>(() => {\n const xs = this.xLabels();\n const ys = this.yLabels();\n const data = this.data();\n const fmt = this.format();\n const palette = this.palette();\n const showValues = this.showValues();\n return ys.map((yLabel, r) => ({\n label: yLabel,\n cells: xs.map((xLabel, c) => {\n const value = data[r]?.[c] ?? null;\n if (value == null) {\n return { value: null, display: '', xLabel, bg: 'transparent', inverse: false };\n }\n const colors = mkHeatmapCellColors(this.ratio(value), palette, showValues);\n return {\n value,\n display: fmt(value),\n xLabel,\n // Mix the accent over the surface; more intense = more accent.\n bg: this.cellBackground(colors.intensity),\n inverse: colors.inverse,\n };\n }),\n }));\n });\n\n /** Legend swatches from 0 → 1 intensity. */\n protected readonly scaleStops = computed(() => {\n const [lo, hi] = this.domain();\n const fmt = this.format();\n return {\n min: fmt(lo),\n max: fmt(hi),\n swatches: [0, 0.25, 0.5, 0.75, 1].map((t) => this.cellBackground(t)),\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const rows = this.yLabels().length;\n const cols = this.xLabels().length;\n return `Heatmap, ${rows} rows by ${cols} columns`;\n });\n\n /**\n * Resolve the accent and the tokens to sRGB through a hidden probe: the\n * probe's computed `color` is what the browser would paint, `var()`s and\n * `color-mix()` included. `null` when the environment cannot resolve them.\n */\n protected resolvePalette(): MkHeatmapPalette | null {\n const win = this.doc.defaultView;\n if (!win?.getComputedStyle) return null;\n const probe = this.doc.createElement('span');\n probe.setAttribute('aria-hidden', 'true');\n probe.style.position = 'absolute';\n probe.style.visibility = 'hidden';\n this.host.appendChild(probe);\n try {\n const read = (expr: string): MkRgb | null => {\n probe.style.color = '';\n probe.style.color = expr;\n return mkParseRgb(win.getComputedStyle(probe).color);\n };\n const accent = read(this.accent());\n const surface = read('var(--mk-surface-2)');\n const text = read('var(--mk-text)');\n const textInverse = read('var(--mk-text-inverse)');\n return accent && surface && text && textInverse\n ? { accent, surface, text, textInverse }\n : null;\n } finally {\n probe.remove();\n }\n }\n\n /**\n * Re-resolve when the theme flips: `data-theme` / class changes on the root\n * element (MkThemeService and most hand-rolled toggles) and the OS scheme.\n */\n private watchTheme(): void {\n const win = this.doc.defaultView;\n const root = this.doc.documentElement;\n if (!win || !root) return;\n const bump = (): void => this.themeTick.update((n) => n + 1);\n const destroyRef = inject(DestroyRef);\n if (typeof win.MutationObserver === 'function') {\n const observer = new win.MutationObserver(bump);\n observer.observe(root, { attributes: true, attributeFilter: ['data-theme', 'class', 'style'] });\n destroyRef.onDestroy(() => observer.disconnect());\n }\n const mql = win.matchMedia?.('(prefers-color-scheme: dark)');\n if (mql?.addEventListener) {\n mql.addEventListener('change', bump);\n destroyRef.onDestroy(() => mql.removeEventListener('change', bump));\n }\n }\n}\n","<!-- Focusable so keyboard users can scroll the overflowing grid (WCAG 2.1.1). -->\n<div\n class=\"mk-chart__frame mk-heatmap__scroll\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"resolvedLabel()\"\n>\n <table class=\"mk-heatmap__grid\">\n <caption class=\"mk-visually-hidden\">{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <td class=\"mk-heatmap__corner\"></td>\n @for (x of xLabels(); track $index) {\n <th scope=\"col\" class=\"mk-heatmap__col-head\">{{ x }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows(); track row.label) {\n <tr>\n <th scope=\"row\" class=\"mk-heatmap__row-head\">{{ row.label }}</th>\n @for (cell of row.cells; track $index) {\n <td\n class=\"mk-heatmap__cell\"\n [class.mk-heatmap__cell--inverse]=\"cell.inverse\"\n [class.mk-heatmap__cell--empty]=\"cell.value === null\"\n [style.background]=\"cell.bg\"\n [attr.title]=\"\n cell.value === null\n ? null\n : row.label + ' · ' + cell.xLabel + ': ' + cell.display\n \"\n >\n @if (cell.value !== null) {\n @if (showValues()) {\n <span class=\"mk-heatmap__value\">{{ cell.display }}</span>\n } @else {\n <!-- Colour must not be the only signal: expose the value to AT. -->\n <span class=\"mk-visually-hidden\">{{ cell.display }}</span>\n }\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n</div>\n\n@if (showScale()) {\n <div class=\"mk-heatmap__legend\" aria-hidden=\"true\">\n <span class=\"mk-heatmap__legend-label\">{{ scaleStops().min }}</span>\n <span class=\"mk-heatmap__legend-ramp\">\n @for (sw of scaleStops().swatches; track $index) {\n <span class=\"mk-heatmap__legend-swatch\" [style.background]=\"sw\"></span>\n }\n </span>\n <span class=\"mk-heatmap__legend-label\">{{ scaleStops().max }}</span>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n output,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkFormatCompact } from './chart-utils';\n\n/** One day's datum for `mk-calendar-heatmap`. */\nexport interface MkCalendarHeatmapEntry {\n /**\n * The day — a `Date`, or a string. `YYYY-MM-DD` strings are parsed as\n * **local** dates (never UTC-shifted); other strings go through `new Date()`.\n */\n date: Date | string;\n /** The day's value (e.g. an activity count). Multiple entries for the same day are summed. */\n value: number;\n}\n\n/** Payload of `mk-calendar-heatmap`'s `cellClick`. */\nexport interface MkCalendarHeatmapCell {\n /** The clicked day (local midnight). */\n date: Date;\n /** The day's aggregated value (0 when no entry exists). */\n value: number;\n}\n\ninterface DayCell {\n key: string;\n /** `null` for grid padding outside the displayed range. */\n date: Date | null;\n value: number;\n bg: string;\n title: string | null;\n}\ninterface WeekdayRow {\n label: string;\n /** Visually show the label (Mon/Wed/Fri style); hidden rows keep it for SR. */\n showLabel: boolean;\n cells: DayCell[];\n}\ninterface MonthSegment {\n key: string;\n label: string;\n /** Number of week columns the month header spans. */\n span: number;\n}\ninterface Layout {\n rows: WeekdayRow[];\n months: MonthSegment[];\n weekCount: number;\n dayCount: number;\n max: number;\n}\n\n/** Local midnight for `d` (drops the time-of-day). */\nfunction stripTime(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\n/** Parse an entry date; `YYYY-MM-DD` strings become local dates. */\nfunction parseDay(value: Date | string): Date {\n if (value instanceof Date) return stripTime(value);\n const iso = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(value);\n if (iso) return new Date(+iso[1], +iso[2] - 1, +iso[3]);\n return stripTime(new Date(value));\n}\n\nfunction dayKey(d: Date): string {\n return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n}\n\nfunction addDays(d: Date, days: number): Date {\n const next = new Date(d);\n next.setDate(next.getDate() + days);\n return next;\n}\n\n/**\n * Calendar heatmap — a GitHub-style year of daily squares: weeks as columns,\n * weekdays as rows, each day shaded by its value. Rendered as a semantic\n * `<table>` (month headers span their week columns, weekday names are row\n * headers, every cell carries its formatted value for screen readers) with\n * intensities mixed from `color` over the surface via `color-mix`, so it\n * tracks the theme. Values are bucketed linearly against the range maximum\n * into `levels` steps; days with value 0 (or no entry) render transparent.\n *\n * Shows the last 12 months ending today by default; set `year` for a fixed\n * calendar year.\n *\n * ```html\n * <mk-calendar-heatmap\n * [data]=\"contributions\"\n * [year]=\"2026\"\n * (cellClick)=\"openDay($event.date)\"\n * />\n * ```\n */\n@Component({\n selector: 'mk-calendar-heatmap',\n templateUrl: './calendar-heatmap.html',\n styleUrl: './calendar-heatmap.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-calendar-heatmap',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkCalendarHeatmap {\n /** The daily values. Days without an entry count as 0. */\n readonly data = input<readonly MkCalendarHeatmapEntry[]>([]);\n /** Show a fixed calendar year; unset shows the last 12 months ending today. */\n readonly year = input<number | null, number | string | null>(null, {\n transform: (value) => {\n if (value == null || value === '') return null;\n const parsed = numberAttribute(value);\n return Number.isFinite(parsed) ? parsed : null;\n },\n });\n /** First weekday of the columns: 0 = Sunday … 6 = Saturday. */\n readonly firstDayOfWeek = input(1, { transform: numberAttribute });\n /** Base colour mixed over the surface for intensity. */\n readonly color = input<string>('var(--mk-primary)');\n /** Number of intensity buckets in the ramp. */\n readonly levels = input(5, { transform: numberAttribute });\n /** Formatter for each cell's title / screen-reader text (and legend max). */\n readonly format = input<((date: Date, value: number) => string) | null>(null);\n /** Show the less→more colour ramp legend. */\n readonly showScale = input(true, { transform: booleanAttribute });\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n /** Emits the clicked day and its value. */\n readonly cellClick = output<MkCalendarHeatmapCell>();\n\n protected readonly i18n = inject(MK_I18N);\n\n /** Aggregated value per day key (duplicate entries are summed). */\n private readonly values = computed(() => {\n const map = new Map<string, { date: Date; value: number }>();\n for (const entry of this.data()) {\n const date = parseDay(entry.date);\n const key = dayKey(date);\n const previous = map.get(key);\n map.set(key, { date, value: (previous?.value ?? 0) + entry.value });\n }\n return map;\n });\n\n /** Displayed [start, end] range, both at local midnight, inclusive. */\n private readonly range = computed<[Date, Date]>(() => {\n const year = this.year();\n if (year != null) return [new Date(year, 0, 1), new Date(year, 11, 31)];\n const end = stripTime(new Date());\n const start = addDays(\n new Date(end.getFullYear() - 1, end.getMonth(), end.getDate()),\n 1,\n );\n return [start, end];\n });\n\n private readonly sanitizedLevels = computed(() =>\n Math.max(1, Math.round(this.levels()) || 1),\n );\n\n private readonly layout = computed<Layout>(() => {\n const [start, end] = this.range();\n const fdow = ((Math.round(this.firstDayOfWeek()) % 7) + 7) % 7;\n const levels = this.sanitizedLevels();\n const color = this.color();\n const values = this.values();\n const fmt = this.format() ?? this.defaultFormat;\n const names = this.i18n.dateNames;\n\n // Bucket against the maximum value inside the displayed range.\n let max = 0;\n for (const { date, value } of values.values()) {\n if (date >= start && date <= end) max = Math.max(max, value);\n }\n\n const gridStart = addDays(start, -((((start.getDay() - fdow) % 7) + 7) % 7));\n const weeks: DayCell[][] = [];\n const months: MonthSegment[] = [];\n let dayCount = 0;\n\n for (let weekStart = gridStart; weekStart <= end; weekStart = addDays(weekStart, 7)) {\n const week: DayCell[] = [];\n let firstInRange: Date | null = null;\n for (let i = 0; i < 7; i++) {\n const date = addDays(weekStart, i);\n if (date < start || date > end) {\n // Padding before the range start / after its end — blank, silent.\n week.push({\n key: `pad-${dayKey(date)}`,\n date: null,\n value: 0,\n bg: 'transparent',\n title: null,\n });\n continue;\n }\n firstInRange ??= date;\n dayCount++;\n const value = values.get(dayKey(date))?.value ?? 0;\n const level =\n value <= 0 || max <= 0\n ? 0\n : Math.min(levels, Math.max(1, Math.ceil((value / max) * levels)));\n week.push({\n key: dayKey(date),\n date,\n value,\n // Zero / no data stays transparent, like mk-heatmap's null cells.\n bg:\n level === 0\n ? 'transparent'\n : `color-mix(in srgb, ${color} ${Math.round((level / levels) * 100)}%, var(--mk-surface-2))`,\n title: fmt(date, value),\n });\n }\n weeks.push(week);\n\n // A week column belongs to the month of its first in-range day; group\n // consecutive columns of the same month into one spanning header.\n const monthOf = firstInRange ?? weekStart;\n const monthKey = `${monthOf.getFullYear()}-${monthOf.getMonth()}`;\n const last = months[months.length - 1];\n if (last && last.key === monthKey) last.span++;\n else {\n months.push({\n key: monthKey,\n label: names.monthsShort[monthOf.getMonth()] ?? '',\n span: 1,\n });\n }\n }\n\n const rows: WeekdayRow[] = Array.from({ length: 7 }, (_, i) => {\n const weekday = (fdow + i) % 7;\n return {\n label: names.weekdaysShort[weekday] ?? '',\n // Mon/Wed/Fri style regardless of the first day of the week.\n showLabel: weekday % 2 === 1,\n cells: weeks.map((week) => week[i]),\n };\n });\n\n return { rows, months, weekCount: weeks.length, dayCount, max };\n });\n\n protected readonly rows = computed(() => this.layout().rows);\n protected readonly monthSegments = computed(() => this.layout().months);\n\n /** Legend: 0 → max swatches mixed exactly like the cells. */\n protected readonly scaleStops = computed(() => {\n const levels = this.sanitizedLevels();\n const color = this.color();\n return {\n min: '0',\n max: mkFormatCompact(this.layout().max),\n swatches: Array.from(\n { length: levels + 1 },\n (_, i) =>\n `color-mix(in srgb, ${color} ${Math.round((i / levels) * 100)}%, var(--mk-surface-2))`,\n ),\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const { dayCount, weekCount } = this.layout();\n return `Calendar heatmap, ${dayCount} days over ${weekCount} weeks`;\n });\n\n private readonly defaultFormat = (date: Date, value: number): string =>\n `${date.toLocaleDateString()}: ${value}`;\n\n protected onCellClick(cell: DayCell): void {\n if (!cell.date) return;\n this.cellClick.emit({ date: cell.date, value: cell.value });\n }\n}\n","<!-- Focusable so keyboard users can scroll the overflowing grid (WCAG 2.1.1). -->\n<div\n class=\"mk-chart__frame mk-calendar-heatmap__scroll\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"resolvedLabel()\"\n>\n <table class=\"mk-calendar-heatmap__grid\">\n <caption class=\"mk-visually-hidden\">{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <td class=\"mk-calendar-heatmap__corner\"></td>\n @for (month of monthSegments(); track month.key) {\n <th\n scope=\"colgroup\"\n class=\"mk-calendar-heatmap__month\"\n [attr.colspan]=\"month.span\"\n >\n <!-- A 1–2 week segment is narrower than its label: keep the name\n for SR but do not let it stretch the week columns. -->\n <span [class.mk-visually-hidden]=\"month.span < 3\">\n {{ month.label }}\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows(); track row.label) {\n <tr>\n <th scope=\"row\" class=\"mk-calendar-heatmap__row-head\">\n <!-- Every row keeps its name for SR; only Mon/Wed/Fri-style rows show it. -->\n <span [class.mk-visually-hidden]=\"!row.showLabel\">{{ row.label }}</span>\n </th>\n @for (cell of row.cells; track cell.key) {\n @if (cell.date) {\n <td\n class=\"mk-calendar-heatmap__cell\"\n [class.mk-calendar-heatmap__cell--empty]=\"cell.value <= 0\"\n [style.background]=\"cell.bg\"\n [attr.title]=\"cell.title\"\n (click)=\"onCellClick(cell)\"\n >\n <!-- Colour must not be the only signal: expose the value to AT. -->\n <span class=\"mk-visually-hidden\">{{ cell.title }}</span>\n </td>\n } @else {\n <td\n class=\"mk-calendar-heatmap__cell mk-calendar-heatmap__cell--blank\"\n ></td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n</div>\n\n@if (showScale()) {\n <div class=\"mk-calendar-heatmap__legend\" aria-hidden=\"true\">\n <span class=\"mk-calendar-heatmap__legend-label\">{{ scaleStops().min }}</span>\n <span class=\"mk-calendar-heatmap__legend-ramp\">\n @for (swatch of scaleStops().swatches; track $index) {\n <span\n class=\"mk-calendar-heatmap__legend-swatch\"\n [style.background]=\"swatch\"\n ></span>\n }\n </span>\n <span class=\"mk-calendar-heatmap__legend-label\">{{ scaleStops().max }}</span>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport {\n MkChartSeries,\n mkChartColor,\n mkFormatCompact,\n mkNiceTicks,\n} from './chart-utils';\n\ninterface RadarPoint {\n x: number;\n y: number;\n}\ninterface RadarSeries {\n name: string;\n color: string;\n polygon: string;\n points: RadarPoint[];\n}\ninterface RadarAxis {\n label: string;\n x: number;\n y: number;\n lx: number;\n ly: number;\n anchor: 'start' | 'middle' | 'end';\n}\n\n/**\n * RadarChart — a radar / spider chart comparing several series across the same\n * set of axes (skills, product profiles, survey dimensions). Dependency-free\n * SVG on the validated `--mk-chart-*` palette; ships concentric grid rings, a\n * legend for ≥ 2 series and a screen-reader data table.\n *\n * ```html\n * <mk-radar-chart\n * [axes]=\"['Speed','Power','Range','Cost','Ease']\"\n * [series]=\"[{ name: 'Model A', data: [8,6,7,5,9] }]\" />\n * ```\n */\n@Component({\n selector: 'mk-radar-chart',\n templateUrl: './radar-chart.html',\n styleUrl: './charts.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-radar-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkRadarChart {\n protected readonly i18n = inject(MK_I18N);\n\n /** Axis labels (one spoke each). Series data align to this order. */\n readonly axes = input<readonly string[]>([]);\n /** One or more series (values align to `axes`). */\n readonly series = input<readonly MkChartSeries[]>([]);\n /** Domain maximum (defaults to a nice value above the data max). */\n readonly max = input<number | null>(null);\n /** Number of concentric grid rings. */\n readonly levels = input(4, { transform: numberAttribute });\n /** Intrinsic width (viewBox units; the SVG scales to its container). */\n readonly width = input(360, { transform: numberAttribute });\n /** Intrinsic height. */\n readonly height = input(360, { transform: numberAttribute });\n /** Draw a dot at each vertex. */\n readonly showDots = input(true, { transform: booleanAttribute });\n /** Force the legend on/off (defaults to on when there are ≥ 2 series). */\n readonly showLegend = input<boolean | undefined>(undefined);\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n\n private readonly cx = computed(() => this.width() / 2);\n private readonly cy = computed(() => this.height() / 2);\n private readonly radius = computed(\n () => Math.min(this.width(), this.height()) / 2 - 44,\n );\n\n protected readonly colors = computed(() =>\n this.series().map((s, i) => s.color ?? mkChartColor(i)),\n );\n protected readonly legendVisible = computed(\n () => this.showLegend() ?? this.series().length > 1,\n );\n\n private readonly domainMax = computed(() => {\n const explicit = this.max();\n if (explicit != null) return explicit;\n const values = this.series().flatMap((s) => s.data);\n const hi = values.length ? Math.max(...values) : 1;\n const ticks = mkNiceTicks(0, hi, this.levels());\n return ticks[ticks.length - 1] || 1;\n });\n\n /** Angle (radians) of axis `i`, starting at the top and going clockwise. */\n private angleAt(i: number): number {\n const n = Math.max(this.axes().length, 1);\n return -Math.PI / 2 + (i * 2 * Math.PI) / n;\n }\n\n private pointAt(i: number, value: number): RadarPoint {\n const t = this.domainMax() ? value / this.domainMax() : 0;\n const a = this.angleAt(i);\n return {\n x: this.cx() + Math.cos(a) * this.radius() * t,\n y: this.cy() + Math.sin(a) * this.radius() * t,\n };\n }\n\n /** Concentric grid ring polygons (outer → inner). */\n protected readonly rings = computed(() => {\n const levels = Math.max(this.levels(), 1);\n const n = this.axes().length;\n return Array.from({ length: levels }, (_, l) => {\n const t = (levels - l) / levels;\n const pts = Array.from({ length: n }, (_, i) => {\n const a = this.angleAt(i);\n return `${this.cx() + Math.cos(a) * this.radius() * t},${\n this.cy() + Math.sin(a) * this.radius() * t\n }`;\n });\n return { key: l, points: pts.join(' ') };\n });\n });\n\n /** Axis spokes + outer labels. */\n protected readonly axisSpokes = computed<RadarAxis[]>(() =>\n this.axes().map((label, i) => {\n const a = this.angleAt(i);\n const ex = this.cx() + Math.cos(a) * this.radius();\n const ey = this.cy() + Math.sin(a) * this.radius();\n const lx = this.cx() + Math.cos(a) * (this.radius() + 16);\n const ly = this.cy() + Math.sin(a) * (this.radius() + 16);\n const cos = Math.cos(a);\n const anchor = cos > 0.3 ? 'start' : cos < -0.3 ? 'end' : 'middle';\n return { label, x: ex, y: ey, lx, ly, anchor };\n }),\n );\n\n /** Per-series polygon + vertex geometry. */\n protected readonly rendered = computed<RadarSeries[]>(() =>\n this.series().map((s, si) => {\n const points = this.axes().map((_, i) => this.pointAt(i, s.data[i] ?? 0));\n return {\n name: s.name,\n color: this.colors()[si],\n polygon: points.map((p) => `${p.x},${p.y}`).join(' '),\n points,\n };\n }),\n );\n\n protected readonly legend = computed(() =>\n this.series().map((s, i) => ({ name: s.name, color: this.colors()[i] })),\n );\n\n protected readonly ringMax = computed(() => mkFormatCompact(this.domainMax()));\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const s = this.series();\n if (!s.length) return 'Radar chart, no data';\n return `Radar chart of ${s.map((x) => x.name).join(', ')} across ${this.axes().length} axes`;\n });\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <!-- Grid rings -->\n @for (ring of rings(); track ring.key) {\n <polygon class=\"mk-chart__grid mk-radar__ring\" [attr.points]=\"ring.points\" />\n }\n\n <!-- Axis spokes + labels -->\n @for (axis of axisSpokes(); track axis.label) {\n <line\n class=\"mk-chart__grid\"\n [attr.x1]=\"width() / 2\"\n [attr.y1]=\"height() / 2\"\n [attr.x2]=\"axis.x\"\n [attr.y2]=\"axis.y\"\n />\n <text\n class=\"mk-chart__axis-label mk-radar__axis-label\"\n [attr.x]=\"axis.lx\"\n [attr.y]=\"axis.ly\"\n [attr.text-anchor]=\"axis.anchor\"\n >\n {{ axis.label }}\n </text>\n }\n\n <!-- Series polygons -->\n @for (r of rendered(); track r.name) {\n <polygon\n class=\"mk-radar__area\"\n [attr.points]=\"r.polygon\"\n [style.fill]=\"r.color\"\n [style.stroke]=\"r.color\"\n />\n @if (showDots()) {\n @for (p of r.points; track $index) {\n <circle\n class=\"mk-chart__dot\"\n [attr.cx]=\"p.x\"\n [attr.cy]=\"p.y\"\n r=\"3\"\n [style.fill]=\"r.color\"\n />\n }\n }\n }\n </svg>\n</div>\n\n@if (legendVisible()) {\n <ul class=\"mk-chart__legend\">\n @for (item of legend(); track item.name) {\n <li class=\"mk-chart__legend-item\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartAxis }}</th>\n @for (s of series(); track s.name) {\n <th scope=\"col\">{{ s.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (axis of axes(); track axis; let a = $index) {\n <tr>\n <th scope=\"row\">{{ axis }}</th>\n @for (s of series(); track s.name) {\n <td>{{ s.data[a] }}</td>\n }\n </tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartColor, mkFormatCompact } from './chart-utils';\n\n/** A single stage of the funnel (ordered largest → smallest conceptually). */\nexport interface MkFunnelSegment {\n /** Stage label (e.g. \"Visits\"). */\n label: string;\n /** Stage value; drives the band width. */\n value: number;\n /** Optional explicit colour; defaults to the palette by index. */\n color?: string;\n}\n\ninterface FunnelBand {\n label: string;\n value: number;\n valueLabel: string;\n /** Conversion relative to the first (top) segment, as a percentage. */\n percent: number;\n percentLabel: string;\n color: string;\n topWidth: number;\n bottomWidth: number;\n polygon: string;\n labelX: number;\n labelY: number;\n subY: number;\n}\n\nconst MARGIN = { top: 10, right: 12, bottom: 10, left: 12 };\n\n/**\n * FunnelChart — decreasing stacked trapezoids visualising conversion through a\n * sequence of stages. Each band's top width tracks its own value and its bottom\n * width tracks the next stage's value, so consecutive bands connect into a\n * funnel. Dependency-free SVG on the validated `--mk-chart-*` palette; each band\n * is labelled with its value and its conversion relative to the top stage, and a\n * screen-reader table mirrors the data.\n *\n * ```html\n * <mk-funnel-chart\n * [segments]=\"[\n * { label: 'Visits', value: 1000 },\n * { label: 'Signups', value: 400 },\n * { label: 'Paid', value: 120 },\n * ]\" />\n * ```\n */\n@Component({\n selector: 'mk-funnel-chart',\n templateUrl: './funnel-chart.html',\n styleUrl: './funnel-chart.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-funnel-chart',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkFunnelChart {\n protected readonly i18n = inject(MK_I18N);\n\n /** The funnel stages, ordered largest → smallest conceptually. */\n readonly segments = input<readonly MkFunnelSegment[]>([]);\n /** Intrinsic width (viewBox units; the SVG scales to its container). */\n readonly width = input(420, { transform: numberAttribute });\n /** Intrinsic height. */\n readonly height = input(300, { transform: numberAttribute });\n /** Force the legend on/off (funnels label each band, so off by default). */\n readonly showLegend = input<boolean | undefined>(undefined);\n /** Render the value + conversion text on each band. */\n readonly showValues = input(true, { transform: booleanAttribute });\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n\n protected readonly plot = computed(() => ({\n x: MARGIN.left,\n y: MARGIN.top,\n w: Math.max(this.width() - MARGIN.left - MARGIN.right, 1),\n h: Math.max(this.height() - MARGIN.top - MARGIN.bottom, 1),\n }));\n\n protected readonly legendVisible = computed(() => this.showLegend() ?? false);\n\n private readonly maxValue = computed(() =>\n Math.max(1, ...this.segments().map((s) => Math.max(s.value, 0))),\n );\n\n private readonly topValue = computed(() => this.segments()[0]?.value ?? 0);\n\n /** One trapezoid per stage, stacked top → bottom. */\n protected readonly bands = computed<FunnelBand[]>(() => {\n const segments = this.segments();\n const n = segments.length;\n if (!n) return [];\n const { x, y, w, h } = this.plot();\n const max = this.maxValue();\n const top = this.topValue() || 1;\n const bandH = h / n;\n const centerX = x + w / 2;\n\n return segments.map((seg, i) => {\n const topVal = Math.max(seg.value, 0);\n // Bottom edge follows the next stage; the last band closes to itself.\n const bottomVal = Math.max(segments[i + 1]?.value ?? seg.value, 0);\n const topWidth = (topVal / max) * w;\n const bottomWidth = (bottomVal / max) * w;\n const yTop = y + i * bandH;\n const yBottom = yTop + bandH;\n const tl = centerX - topWidth / 2;\n const tr = centerX + topWidth / 2;\n const bl = centerX - bottomWidth / 2;\n const br = centerX + bottomWidth / 2;\n const percent = (seg.value / top) * 100;\n return {\n label: seg.label,\n value: seg.value,\n valueLabel: mkFormatCompact(seg.value),\n percent,\n percentLabel: `${Math.round(percent)}% of top`,\n color: seg.color ?? mkChartColor(i),\n topWidth,\n bottomWidth,\n polygon: `${tl},${yTop} ${tr},${yTop} ${br},${yBottom} ${bl},${yBottom}`,\n labelX: centerX,\n labelY: yTop + bandH / 2 - 4,\n subY: yTop + bandH / 2 + 12,\n };\n });\n });\n\n protected readonly legend = computed(() =>\n this.segments().map((s, i) => ({\n name: s.label,\n color: s.color ?? mkChartColor(i),\n })),\n );\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const segments = this.segments();\n if (!segments.length) return 'Funnel chart, no data';\n return `Funnel chart of ${segments.length} stages from ${segments[0].label} to ${segments[segments.length - 1].label}`;\n });\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <!-- Funnel bands (decreasing trapezoids) -->\n @for (band of bands(); track band.label) {\n <polygon\n class=\"mk-funnel-chart__band\"\n [attr.points]=\"band.polygon\"\n [style.fill]=\"band.color\"\n />\n }\n\n <!-- Band labels + conversion -->\n @if (showValues()) {\n @for (band of bands(); track band.label) {\n <text\n class=\"mk-funnel-chart__label\"\n [attr.x]=\"band.labelX\"\n [attr.y]=\"band.labelY\"\n >\n {{ band.label }}\n </text>\n <text\n class=\"mk-funnel-chart__sublabel\"\n [attr.x]=\"band.labelX\"\n [attr.y]=\"band.subY\"\n >\n {{ band.valueLabel }} · {{ band.percentLabel }}\n </text>\n }\n }\n </svg>\n</div>\n\n@if (legendVisible()) {\n <ul class=\"mk-chart__legend\">\n @for (item of legend(); track item.name) {\n <li class=\"mk-chart__legend-item\">\n <span class=\"mk-chart__swatch\" [style.background]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n}\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartStage }}</th>\n <th scope=\"col\">{{ i18n.chartValue }}</th>\n <th scope=\"col\">{{ i18n.chartConversion }}</th>\n </tr>\n </thead>\n <tbody>\n @for (band of bands(); track band.label) {\n <tr>\n <th scope=\"row\">{{ band.label }}</th>\n <td>{{ band.valueLabel }}</td>\n <td>{{ band.percentLabel }}</td>\n </tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkChartTapPin } from './chart-tap-pin';\nimport { mkChartColor, mkFormatCompact } from './chart-utils';\n\n/** A single treemap tile: a labelled rectangle sized by `value`. */\nexport interface MkTreemapItem {\n /** Tile label (identity — shown on the tile when it fits, and in the tooltip). */\n label: string;\n /** Positive magnitude driving the tile's area. */\n value: number;\n /** Optional explicit colour; defaults to the validated palette by index. */\n color?: string;\n}\n\n/** A positioned tile in SVG user space, tagged with its source `index`. */\nexport interface MkTreemapRect {\n x: number;\n y: number;\n w: number;\n h: number;\n index: number;\n}\n\n/**\n * Worst (largest) aspect ratio produced by laying `areas` as one strip along a\n * side of length `side` — the squarify quality metric (Bruls/Huizing/van Wijk).\n */\nfunction worstRatio(areas: readonly number[], side: number): number {\n let sum = 0;\n let rmax = -Infinity;\n let rmin = Infinity;\n for (const a of areas) {\n sum += a;\n if (a > rmax) rmax = a;\n if (a < rmin) rmin = a;\n }\n if (areas.length === 0 || sum <= 0 || side <= 0) return Infinity;\n const s2 = sum * sum;\n const w2 = side * side;\n return Math.max((w2 * rmax) / s2, s2 / (w2 * rmin));\n}\n\n/**\n * Squarified treemap layout — pack `items` into the rectangle `(x, y, w, h)` as\n * nested tiles whose areas are proportional to `value`, greedily building rows\n * along the shorter side so tiles stay close to square. Returns exactly one\n * rect per input item, tagged with its original `index` (so callers can render\n * in input order). Framework-agnostic and pure.\n */\nexport function mkSquarify(\n items: readonly { value: number }[],\n x: number,\n y: number,\n w: number,\n h: number,\n): MkTreemapRect[] {\n const n = items.length;\n const result: MkTreemapRect[] = new Array(n);\n if (n === 0) return result;\n\n // Largest first, remembering where each came from; clamp negatives to 0.\n const nodes = items\n .map((it, index) => ({ value: Math.max(it.value, 0), index }))\n .sort((a, b) => b.value - a.value);\n\n const totalValue = nodes.reduce((s, node) => s + node.value, 0);\n const scale = totalValue > 0 ? (w * h) / totalValue : 0;\n const areas = nodes.map((node) => node.value * scale);\n\n // The remaining free rectangle we keep carving strips off.\n let rx = x;\n let ry = y;\n let rw = w;\n let rh = h;\n\n let i = 0;\n while (i < n) {\n const shortSide = Math.min(rw, rh);\n\n // Grow the current row while the worst aspect ratio keeps improving.\n const row: number[] = [];\n let j = i;\n while (j < n) {\n const candidate = row.concat(j).map((k) => areas[k]);\n const current = row.map((k) => areas[k]);\n if (row.length === 0 || worstRatio(candidate, shortSide) <= worstRatio(current, shortSide)) {\n row.push(j);\n j++;\n } else {\n break;\n }\n }\n\n const rowSum = row.reduce((s, k) => s + areas[k], 0);\n const thickness = shortSide > 0 ? rowSum / shortSide : 0;\n\n if (rw >= rh) {\n // Wider than tall: lay the row as a column of width `thickness`.\n let offset = ry;\n for (const k of row) {\n const cellH = rowSum > 0 ? (areas[k] / rowSum) * rh : 0;\n result[nodes[k].index] = {\n x: rx,\n y: offset,\n w: thickness,\n h: cellH,\n index: nodes[k].index,\n };\n offset += cellH;\n }\n rx += thickness;\n rw -= thickness;\n } else {\n // Taller than wide: lay the row as a band of height `thickness`.\n let offset = rx;\n for (const k of row) {\n const cellW = rowSum > 0 ? (areas[k] / rowSum) * rw : 0;\n result[nodes[k].index] = {\n x: offset,\n y: ry,\n w: cellW,\n h: thickness,\n index: nodes[k].index,\n };\n offset += cellW;\n }\n ry += thickness;\n rh -= thickness;\n }\n\n i = j;\n }\n\n return result;\n}\n\n/** Minimum tile size (px) before we bother drawing text on it. */\nconst MIN_TEXT_W = 40;\nconst MIN_TEXT_H = 24;\n\ninterface RenderedTile {\n x: number;\n y: number;\n w: number;\n h: number;\n color: string;\n label: string;\n value: number;\n valueText: string;\n pct: string;\n showText: boolean;\n showValue: boolean;\n clipId: string;\n cx: number;\n cy: number;\n index: number;\n}\n\n/**\n * Treemap — nested rectangles sized by value, using a squarified layout that\n * keeps tiles close to square. Dependency-free SVG on the validated\n * `--mk-chart-*` palette; ships in-tile labels (hidden when a tile is too\n * small), a hover tooltip with the share of total, and a screen-reader table.\n *\n * ```html\n * <mk-treemap [items]=\"[{ label: 'Ads', value: 40 }, { label: 'SEO', value: 25 }]\" />\n * ```\n */\n@Component({\n selector: 'mk-treemap',\n templateUrl: './treemap.html',\n styleUrl: './treemap.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-chart mk-treemap',\n role: 'group',\n '[attr.aria-label]': 'resolvedLabel()',\n },\n})\nexport class MkTreemap {\n protected readonly i18n = inject(MK_I18N);\n\n /** The tiles to pack, largest first (order-independent — sorted internally). */\n readonly items = input<readonly MkTreemapItem[]>([]);\n /** Intrinsic width (viewBox units; the SVG scales to its container). */\n readonly width = input(480, { transform: numberAttribute });\n /** Intrinsic height. */\n readonly height = input(320, { transform: numberAttribute });\n /** Draw each tile's value beneath its label when the tile is tall enough. */\n readonly showValues = input(true, { transform: booleanAttribute });\n /** Accessible summary; generated from the data when omitted. */\n readonly label = input<string>('');\n\n protected readonly hoverKey = signal<string | null>(null);\n /** Tap-to-pin: a touch tap on a tile pins the tooltip until a tap lands\n * outside the chart (mouse hover in/out is unaffected). */\n private readonly tapPin = mkChartTapPin<string>((k) => this.hoverKey.set(k));\n\n protected readonly total = computed(() =>\n this.items().reduce((s, it) => s + Math.max(it.value, 0), 0),\n );\n\n /** Every tile positioned and decorated for rendering (in input order). */\n protected readonly tiles = computed<RenderedTile[]>(() => {\n const items = this.items();\n const rects = mkSquarify(items, 0, 0, this.width(), this.height());\n const total = this.total();\n return items.map((it, i) => {\n const r = rects[i];\n const showText = r.w >= MIN_TEXT_W && r.h >= MIN_TEXT_H;\n const pct = total > 0 ? (Math.max(it.value, 0) / total) * 100 : 0;\n return {\n x: r.x,\n y: r.y,\n w: r.w,\n h: r.h,\n color: it.color ?? mkChartColor(i),\n label: it.label,\n value: it.value,\n valueText: mkFormatCompact(it.value),\n pct: `${pct.toFixed(1)}%`,\n showText,\n showValue: showText && this.showValues() && r.h >= MIN_TEXT_H + 16,\n clipId: `mk-treemap-clip-${i}`,\n cx: r.x + r.w / 2,\n cy: r.y + r.h / 2,\n index: i,\n };\n });\n });\n\n protected keyOf(index: number): string {\n return `t${index}`;\n }\n\n /** Rounded share of the total (e.g. `42%`) for the screen-reader table. */\n protected shareOf(value: number): string {\n const total = this.total();\n return `${total > 0 ? Math.round((Math.max(value, 0) / total) * 100) : 0}%`;\n }\n\n protected readonly tooltip = computed(() => {\n const key = this.hoverKey();\n if (key == null) return null;\n const tile = this.tiles()[Number(key.slice(1))];\n if (!tile) return null;\n return {\n left: (tile.cx / this.width()) * 100,\n top: (tile.cy / this.height()) * 100,\n color: tile.color,\n title: tile.label,\n value: tile.valueText,\n pct: tile.pct,\n };\n });\n\n protected readonly resolvedLabel = computed(() => {\n if (this.label()) return this.label();\n const items = this.items();\n if (!items.length) return 'Treemap, no data';\n return `Treemap of ${items.length} items: ${items.map((it) => it.label).join(', ')}`;\n });\n\n protected setHover(key: string | null): void {\n this.tapPin.hover(key);\n }\n\n protected pinHover(key: string, event: PointerEvent): void {\n this.tapPin.pin(key, event);\n }\n}\n","<div class=\"mk-chart__frame\">\n <svg\n class=\"mk-chart__svg mk-treemap__svg\"\n [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n preserveAspectRatio=\"xMidYMid meet\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <defs>\n @for (tile of tiles(); track tile.index) {\n <clipPath [attr.id]=\"tile.clipId\">\n <rect\n [attr.x]=\"tile.x\"\n [attr.y]=\"tile.y\"\n [attr.width]=\"tile.w\"\n [attr.height]=\"tile.h\"\n />\n </clipPath>\n }\n </defs>\n\n @for (tile of tiles(); track tile.index; let i = $index) {\n <g\n class=\"mk-treemap__tile\"\n [class.mk-treemap__tile--active]=\"hoverKey() === keyOf(i)\"\n (pointerenter)=\"setHover(keyOf(i))\"\n (pointerleave)=\"setHover(null)\"\n (pointerdown)=\"pinHover(keyOf(i), $event)\"\n >\n <rect\n class=\"mk-treemap__rect\"\n [attr.x]=\"tile.x\"\n [attr.y]=\"tile.y\"\n [attr.width]=\"tile.w\"\n [attr.height]=\"tile.h\"\n [style.fill]=\"tile.color\"\n />\n @if (tile.showText) {\n <text\n class=\"mk-treemap__label\"\n [attr.clip-path]=\"'url(#' + tile.clipId + ')'\"\n [attr.x]=\"tile.x + 6\"\n [attr.y]=\"tile.y + 16\"\n >\n {{ tile.label }}\n </text>\n @if (tile.showValue) {\n <text\n class=\"mk-treemap__value\"\n [attr.clip-path]=\"'url(#' + tile.clipId + ')'\"\n [attr.x]=\"tile.x + 6\"\n [attr.y]=\"tile.y + 30\"\n >\n {{ tile.valueText }}\n </text>\n }\n }\n </g>\n }\n </svg>\n\n @if (tooltip(); as t) {\n <div class=\"mk-chart__tooltip\" [style.left.%]=\"t.left\" [style.top.%]=\"t.top\">\n <span class=\"mk-chart__tooltip-title\">\n <span class=\"mk-chart__swatch\" [style.background]=\"t.color\"></span>\n {{ t.title }}\n </span>\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__tooltip-name\">{{ i18n.chartValue }}</span>\n <span class=\"mk-chart__tooltip-value\">{{ t.value }}</span>\n </span>\n <span class=\"mk-chart__tooltip-row\">\n <span class=\"mk-chart__tooltip-name\">{{ i18n.chartShare }}</span>\n <span class=\"mk-chart__tooltip-value\">{{ t.pct }}</span>\n </span>\n </div>\n }\n</div>\n\n<table class=\"mk-chart__sr-table\">\n <caption>{{ resolvedLabel() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ i18n.chartLabel }}</th>\n <th scope=\"col\">{{ i18n.chartValue }}</th>\n <th scope=\"col\">{{ i18n.chartShare }}</th>\n </tr>\n </thead>\n <tbody>\n @for (item of items(); track $index) {\n <tr>\n <th scope=\"row\">{{ item.label }}</th>\n <td>{{ item.value }}</td>\n <td>{{ shareOf(item.value) }}</td>\n </tr>\n }\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n numberAttribute,\n} from '@angular/core';\n\n/** Placeholder geometry for a {@link MkSkeleton}. */\nexport type MkSkeletonShape = 'text' | 'rect' | 'circle';\n\n/**\n * Skeleton — a shimmering placeholder shown while content loads. It is\n * `aria-hidden`; mark the surrounding region `aria-busy=\"true\"` so assistive\n * tech knows content is pending. The shimmer stops under\n * `prefers-reduced-motion`.\n *\n * ```html\n * <mk-skeleton shape=\"circle\" [width]=\"40\" [height]=\"40\" />\n * <mk-skeleton shape=\"text\" [lines]=\"3\" />\n * <mk-skeleton shape=\"rect\" width=\"100%\" [height]=\"180\" />\n * ```\n */\n@Component({\n selector: 'mk-skeleton',\n templateUrl: './skeleton.html',\n styleUrl: './skeleton.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-skeleton',\n 'aria-hidden': 'true',\n '[class.mk-skeleton--text]': \"shape() === 'text'\",\n '[class.mk-skeleton--rect]': \"shape() === 'rect'\",\n '[class.mk-skeleton--circle]': \"shape() === 'circle'\",\n '[style.width]': 'styleWidth()',\n '[style.height]': 'styleHeight()',\n },\n})\nexport class MkSkeleton {\n /** Placeholder geometry. */\n readonly shape = input<MkSkeletonShape>('text');\n /** Width — a number (px) or any CSS length/percentage string. */\n readonly width = input<string | number>();\n /** Height — a number (px) or any CSS length/percentage string. */\n readonly height = input<string | number>();\n /** Number of lines to render for `shape=\"text\"`. */\n readonly lines = input(1, { transform: numberAttribute });\n\n private toCss(v: string | number | undefined): string | null {\n if (v === undefined || v === null || v === '') return null;\n return typeof v === 'number' ? `${v}px` : v;\n }\n\n protected readonly styleWidth = computed(() => {\n if (this.shape() === 'circle') {\n return this.toCss(this.width() ?? this.height()) ?? '2.5rem';\n }\n return this.toCss(this.width()) ?? '100%';\n });\n\n protected readonly styleHeight = computed(() => {\n if (this.shape() === 'circle') {\n return this.toCss(this.height() ?? this.width()) ?? '2.5rem';\n }\n if (this.shape() === 'text') return null; // lines define the height\n return this.toCss(this.height()) ?? '1rem';\n });\n\n /** Line index array for the text variant (at least one line). */\n protected readonly lineArray = computed(() =>\n Array.from({ length: Math.max(1, this.lines()) }),\n );\n\n /** Last line of a multi-line block is shortened for a natural look. */\n protected lineWidth(index: number): string {\n const count = this.lineArray().length;\n return count > 1 && index === count - 1 ? '60%' : '100%';\n }\n}\n","@if (shape() === 'text') {\n @for (line of lineArray(); track $index) {\n <span class=\"mk-skeleton__line\" [style.width]=\"lineWidth($index)\"></span>\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkSkeleton } from './skeleton';\n\n/** Ready-made loading layouts for {@link MkSkeletonPreset}. */\nexport type MkSkeletonPresetKind = 'paragraph' | 'card' | 'list' | 'table';\n\n/**\n * SkeletonPreset — composite loading placeholders assembled from\n * {@link MkSkeleton}: a `paragraph`, a media `card`, an avatar `list` or a\n * `table`. Announces \"Loading\" to assistive tech; swap it for real content once\n * loaded.\n *\n * ```html\n * <mk-skeleton-preset preset=\"card\" />\n * <mk-skeleton-preset preset=\"list\" [rows]=\"5\" />\n * <mk-skeleton-preset preset=\"table\" [rows]=\"4\" [columns]=\"5\" />\n * ```\n */\n@Component({\n selector: 'mk-skeleton-preset',\n templateUrl: './skeleton-preset.html',\n styleUrl: './skeleton-preset.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkSkeleton],\n host: {\n class: 'mk-skeleton-preset',\n role: 'status',\n 'aria-busy': 'true',\n '[attr.aria-label]': 'loadingLabel()',\n '[attr.data-preset]': 'preset()',\n },\n})\nexport class MkSkeletonPreset {\n protected readonly i18n = inject(MK_I18N);\n\n /** Which layout to render. */\n readonly preset = input<MkSkeletonPresetKind>('paragraph');\n /** Number of rows (paragraph lines / list items / table body rows). */\n readonly rows = input(3, { transform: numberAttribute });\n /** Number of columns (table only). */\n readonly columns = input(4, { transform: numberAttribute });\n /** Accessible loading label. */\n readonly loadingLabel = input(this.i18n.loading);\n\n protected readonly rowRange = computed(() =>\n Array.from({ length: Math.max(1, this.rows()) }, (_, i) => i),\n );\n protected readonly colRange = computed(() =>\n Array.from({ length: Math.max(1, this.columns()) }, (_, i) => i),\n );\n}\n","@switch (preset()) {\n @case ('card') {\n <mk-skeleton shape=\"rect\" width=\"100%\" [height]=\"150\" />\n <mk-skeleton shape=\"rect\" width=\"60%\" [height]=\"18\" />\n <mk-skeleton shape=\"text\" [lines]=\"2\" />\n }\n @case ('list') {\n @for (r of rowRange(); track r) {\n <div class=\"mk-skeleton-preset__row\">\n <mk-skeleton shape=\"circle\" [width]=\"40\" [height]=\"40\" />\n <div class=\"mk-skeleton-preset__lines\">\n <mk-skeleton shape=\"rect\" width=\"40%\" [height]=\"13\" />\n <mk-skeleton shape=\"rect\" width=\"72%\" [height]=\"11\" />\n </div>\n </div>\n }\n }\n @case ('table') {\n <div class=\"mk-skeleton-preset__thead\" [style.grid-template-columns]=\"'repeat(' + colRange().length + ', 1fr)'\">\n @for (c of colRange(); track c) {\n <mk-skeleton shape=\"rect\" width=\"70%\" [height]=\"13\" />\n }\n </div>\n @for (r of rowRange(); track r) {\n <div class=\"mk-skeleton-preset__trow\" [style.grid-template-columns]=\"'repeat(' + colRange().length + ', 1fr)'\">\n @for (c of colRange(); track c) {\n <mk-skeleton shape=\"rect\" width=\"85%\" [height]=\"11\" />\n }\n </div>\n }\n }\n @default {\n <mk-skeleton shape=\"rect\" width=\"45%\" [height]=\"18\" />\n <mk-skeleton shape=\"text\" [lines]=\"rows()\" />\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n afterNextRender,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { MkSize } from '@mk-kit/ui/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkFieldContext } from '@mk-kit/ui/core';\nimport { mkInjectFieldTouched } from '@mk-kit/ui/core/signal-forms';\n\n/**\n * InlineEdit — click a piece of text to edit it in place. The display is a\n * button that swaps to an input on click (or Enter/Space); Enter or blur saves,\n * Escape reverts. Ideal for editable labels in tables and detail panels.\n * Implements `ControlValueAccessor` + a two-way `value` model of `string`.\n *\n * ```html\n * <mk-inline-edit [(value)]=\"title\" placeholder=\"Untitled\" />\n * <mk-inline-edit multiline [(value)]=\"notes\" />\n * ```\n */\n@Component({\n selector: 'mk-inline-edit',\n templateUrl: './inline-edit.html',\n styleUrl: './inline-edit.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-inline-edit',\n '[class.mk-inline-edit--sm]': \"effectiveSize() === 'sm'\",\n '[class.mk-inline-edit--lg]': \"effectiveSize() === 'lg'\",\n '[class.mk-inline-edit--editing]': 'editing()',\n '[class.mk-inline-edit--invalid]': 'isInvalid()',\n '[class.mk-inline-edit--disabled]': 'isDisabled()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MkInlineEdit),\n multi: true,\n },\n ],\n})\nexport class MkInlineEdit implements ControlValueAccessor {\n private readonly injector = inject(Injector);\n private readonly field = inject(MkFieldContext, { optional: true });\n /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */\n private readonly fieldTouched = mkInjectFieldTouched();\n protected readonly i18n = inject(MK_I18N);\n private readonly displayRef =\n viewChild<ElementRef<HTMLButtonElement>>('display');\n private readonly inputRef =\n viewChild<ElementRef<HTMLInputElement | HTMLTextAreaElement>>('input');\n\n /** Two-way edited value. */\n readonly value = model<string>('');\n /** Shown (muted) when the value is empty. */\n readonly placeholder = input(this.i18n.empty);\n /** Use a multi-line textarea; Enter inserts a newline, blur/✓ saves. */\n readonly multiline = input(false, { transform: booleanAttribute });\n /** Save when the field loses focus (otherwise blur cancels). */\n readonly saveOnBlur = input(true, { transform: booleanAttribute });\n /** Accessible label for the edit trigger + field. */\n readonly ariaLabel = input(this.i18n.edit);\n /** Disable editing. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Force the invalid visual + `aria-invalid` when used standalone. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Control size. Ignored when nested in an `mk-form-field`. */\n readonly size = input<MkSize>('md');\n\n /** Emitted with the new value when an edit is saved. */\n readonly saved = output<string>();\n /** Emitted when an edit is cancelled. */\n readonly cancelled = output<void>();\n\n protected readonly editing = signal(false);\n protected readonly draft = signal('');\n private readonly cvaDisabled = signal(false);\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n readonly fieldId = this.field?.controlId ?? mkUniqueId('mk-inline-edit');\n\n protected readonly effectiveSize = computed<MkSize>(() =>\n this.field ? this.field.size() : this.size(),\n );\n protected readonly isDisabled = computed(\n () => this.disabled() || this.cvaDisabled(),\n );\n protected readonly isInvalid = computed(\n () => (this.invalid() && this.fieldTouched()) || (this.field?.hasError() ?? false),\n );\n protected readonly labelledBy = computed(() => this.field?.labelId ?? null);\n protected readonly describedBy = computed(\n () => this.field?.describedBy() ?? null,\n );\n protected readonly displayText = computed(() => this.value() || '');\n\n protected startEdit(): void {\n if (this.isDisabled() || this.editing()) return;\n this.draft.set(this.value());\n this.editing.set(true);\n afterNextRender(() => this.inputRef()?.nativeElement.focus(), {\n injector: this.injector,\n });\n }\n\n protected onInput(event: Event): void {\n this.draft.set((event.target as HTMLInputElement).value);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.cancel();\n } else if (event.key === 'Enter' && !this.multiline()) {\n event.preventDefault();\n this.save();\n }\n }\n\n protected onBlur(): void {\n if (!this.editing()) return;\n this.saveOnBlur() ? this.save() : this.cancel();\n }\n\n protected save(): void {\n if (!this.editing()) return;\n this.editing.set(false);\n const next = this.draft();\n if (next !== this.value()) {\n this.value.set(next);\n this.onChange(next);\n this.saved.emit(next);\n }\n this.onTouched();\n this.restoreFocus();\n }\n\n protected cancel(): void {\n if (!this.editing()) return;\n this.editing.set(false);\n this.cancelled.emit();\n this.restoreFocus();\n }\n\n private restoreFocus(): void {\n afterNextRender(() => this.displayRef()?.nativeElement.focus(), {\n injector: this.injector,\n });\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n writeValue(value: string | null): void {\n this.value.set(value ?? '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n","@if (editing()) {\n @if (multiline()) {\n <textarea\n #input\n class=\"mk-inline-edit__input mk-inline-edit__input--multiline\"\n [id]=\"fieldId\"\n [value]=\"draft()\"\n [attr.aria-label]=\"labelledBy() ? null : ariaLabel()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n rows=\"3\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n ></textarea>\n } @else {\n <input\n #input\n type=\"text\"\n class=\"mk-inline-edit__input\"\n [id]=\"fieldId\"\n [value]=\"draft()\"\n [attr.aria-label]=\"labelledBy() ? null : ariaLabel()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n }\n @if (multiline()) {\n <div class=\"mk-inline-edit__actions\">\n <button\n type=\"button\"\n class=\"mk-inline-edit__action\"\n [attr.aria-label]=\"i18n.save\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"save()\"\n >\n ✓\n </button>\n <button\n type=\"button\"\n class=\"mk-inline-edit__action\"\n [attr.aria-label]=\"i18n.cancel\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"cancel()\"\n >\n ✕\n </button>\n </div>\n }\n} @else {\n <button\n #display\n type=\"button\"\n class=\"mk-inline-edit__display\"\n [class.mk-inline-edit__display--empty]=\"!displayText()\"\n [disabled]=\"isDisabled()\"\n (click)=\"startEdit()\"\n >\n <span class=\"mk-visually-hidden\">{{ ariaLabel() }}</span>\n <span class=\"mk-inline-edit__text\">{{ displayText() || placeholder() }}</span>\n @if (!isDisabled()) {\n <svg\n class=\"mk-inline-edit__pencil\"\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M11.5 1.5l3 3L5 14l-3.5.5L2 11l9.5-9.5z\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linejoin=\"round\"\n />\n </svg>\n }\n </button>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n effect,\n untracked,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** A duration split into whole day/hour/minute/second parts. */\nexport interface MkDurationParts {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\n/**\n * Split a positive millisecond duration into whole days, hours, minutes and\n * seconds. Negative inputs clamp to zero.\n *\n * ```ts\n * mkSplitDuration(90_061_000); // { days: 1, hours: 1, minutes: 1, seconds: 1 }\n * ```\n */\nexport function mkSplitDuration(ms: number): MkDurationParts {\n const total = Math.max(0, Math.floor(ms / 1000));\n return {\n days: Math.floor(total / 86_400),\n hours: Math.floor((total % 86_400) / 3_600),\n minutes: Math.floor((total % 3_600) / 60),\n seconds: total % 60,\n };\n}\n\n/**\n * Countdown — ticks every second and shows the time remaining until a target\n * instant as days / hours / minutes / seconds. Emits {@link finished} once when\n * the target passes and then keeps showing zeros (or {@link finishedText}).\n *\n * ```html\n * <mk-countdown [to]=\"launchDate\" (finished)=\"onLaunch()\" />\n * ```\n */\n@Component({\n selector: 'mk-countdown',\n templateUrl: './countdown.html',\n styleUrl: './countdown.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-countdown',\n role: 'timer',\n },\n})\nexport class MkCountdown {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n protected readonly i18n = inject(MK_I18N);\n\n /** The target instant to count down to. */\n readonly to = input<Date | null>(null);\n /** Show the days segment; when false, days roll into the hours value. */\n readonly showDays = input(true, { transform: booleanAttribute });\n /** Show the textual label beneath each value. */\n readonly showLabels = input(true, { transform: booleanAttribute });\n /** Zero-pad values to two digits. */\n readonly pad = input(true, { transform: booleanAttribute });\n /** Text to show instead of zeros once the countdown finishes. */\n readonly finishedText = input('');\n\n /** Fires exactly once when the target instant is reached. */\n readonly finished = output<void>();\n\n /** Current wall-clock time, updated every tick. */\n protected readonly now = signal(Date.now());\n\n /** Remaining milliseconds, clamped at zero. */\n protected readonly remaining = computed(() => {\n const target = this.to();\n if (!target) return 0;\n return Math.max(0, target.getTime() - this.now());\n });\n\n protected readonly parts = computed(() => {\n const { days, hours, minutes, seconds } = mkSplitDuration(this.remaining());\n return this.showDays()\n ? { days, hours, minutes, seconds }\n : { days: 0, hours: days * 24 + hours, minutes, seconds };\n });\n\n protected readonly isDone = computed(() => !!this.to() && this.remaining() === 0);\n\n /**\n * Text for the polite live region. Deliberately formatted WITHOUT the\n * seconds segment so the string (and therefore the announcement) only\n * changes when a minute rolls over, instead of chattering every second.\n * When the countdown reaches zero it switches to a final \"finished\"\n * announcement ({@link finishedText} when provided).\n */\n protected readonly liveText = computed(() => {\n if (this.isDone()) return this.finishedText() || this.i18n.countdownFinished;\n const p = this.parts();\n const segs = this.showDays()\n ? [`${p.days} ${this.i18n.countdownDays}`]\n : [];\n return [\n ...segs,\n `${p.hours} ${this.i18n.countdownHours}`,\n `${p.minutes} ${this.i18n.countdownMinutes}`,\n ].join(', ');\n });\n\n private hasFinished = false;\n private intervalId?: number;\n /** Set once the first render has happened (browser only). */\n private viewReady = false;\n\n constructor() {\n // Re-arm whenever the target moves into the future again (e.g. a \"next\n // round\" pattern swapping `to` after completion): reset `finished` and\n // restart the stopped interval.\n effect(() => {\n const target = this.to();\n if (target && target.getTime() > untracked(this.now)) {\n this.hasFinished = false;\n if (this.viewReady && !this.document.hidden) {\n untracked(() => {\n this.tick();\n this.startInterval();\n });\n }\n }\n });\n afterNextRender(() => {\n if (!this.isBrowser) return;\n this.viewReady = true;\n this.document.addEventListener('visibilitychange', this.onVisibilityChange);\n this.tick();\n this.startInterval();\n });\n }\n\n /**\n * No ticking while the tab is hidden — every tick is a change-detection\n * pass in a zoneless app. On return, resync immediately from `Date.now()`\n * so the display never shows stale time.\n */\n private readonly onVisibilityChange = (): void => {\n if (this.document.hidden) {\n this.stopInterval();\n } else {\n this.tick();\n this.startInterval();\n }\n };\n\n private startInterval(): void {\n if (!this.isBrowser || this.intervalId != null) return;\n // Nothing left to count (no target, or already at zero) — stay idle\n // until the `to` input moves into the future again.\n if (this.remaining() === 0) return;\n this.intervalId = this.document.defaultView?.setInterval(() => this.tick(), 1000);\n }\n\n private stopInterval(): void {\n if (this.intervalId != null) {\n this.document.defaultView?.clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n }\n\n private tick(): void {\n this.now.set(Date.now());\n if (this.remaining() === 0) {\n // Reached zero — stop ticking entirely; the effect on `to` re-arms.\n this.stopInterval();\n if (!this.hasFinished && this.isDone()) {\n this.hasFinished = true;\n this.finished.emit();\n }\n }\n }\n\n protected format(value: number): string {\n return this.pad() ? String(value).padStart(2, '0') : String(value);\n }\n\n ngOnDestroy(): void {\n this.stopInterval();\n if (this.viewReady) {\n this.document.removeEventListener('visibilitychange', this.onVisibilityChange);\n }\n }\n}\n","@if (isDone() && finishedText()) {\n <span class=\"mk-countdown__done\">{{ finishedText() }}</span>\n} @else {\n @if (showDays()) {\n <span class=\"mk-countdown__segment\">\n <span class=\"mk-countdown__value\">{{ format(parts().days) }}</span>\n @if (showLabels()) {\n <span class=\"mk-countdown__label\">{{ i18n.countdownDays }}</span>\n }\n </span>\n <span class=\"mk-countdown__sep\" aria-hidden=\"true\">:</span>\n }\n <span class=\"mk-countdown__segment\">\n <span class=\"mk-countdown__value\">{{ format(parts().hours) }}</span>\n @if (showLabels()) {\n <span class=\"mk-countdown__label\">{{ i18n.countdownHours }}</span>\n }\n </span>\n <span class=\"mk-countdown__sep\" aria-hidden=\"true\">:</span>\n <span class=\"mk-countdown__segment\">\n <span class=\"mk-countdown__value\">{{ format(parts().minutes) }}</span>\n @if (showLabels()) {\n <span class=\"mk-countdown__label\">{{ i18n.countdownMinutes }}</span>\n }\n </span>\n <span class=\"mk-countdown__sep\" aria-hidden=\"true\">:</span>\n <span class=\"mk-countdown__segment\">\n <span class=\"mk-countdown__value\">{{ format(parts().seconds) }}</span>\n @if (showLabels()) {\n <span class=\"mk-countdown__label\">{{ i18n.countdownSeconds }}</span>\n }\n </span>\n}\n\n<!-- Minute-granular so the polite region doesn't re-announce every second. -->\n<span class=\"mk-countdown__sr\" aria-live=\"polite\" aria-atomic=\"true\">{{ liveText() }}</span>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n booleanAttribute,\n contentChildren,\n input,\n viewChild,\n} from '@angular/core';\n\n/** Layout for {@link MkDescriptionList}. */\nexport type MkDescriptionLayout = 'grid' | 'stacked';\n\n/**\n * A single term/detail row of {@link MkDescriptionList}: `term` becomes the\n * `<dt>`, the projected content the `<dd>`. The row itself renders nothing —\n * the list reads its rows and writes `<dt>`/`<dd>` as direct children of the\n * `<dl>`, which is what HTML and assistive tech require (a wrapper element\n * between `<dl>` and `<dt>` fails axe `definition-list` / `dlitem`).\n */\n@Component({\n selector: 'mk-desc-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<ng-template #content><ng-content /></ng-template>`,\n styles: [':host{display:none;}'],\n host: { class: 'mk-desc-item' },\n})\nexport class MkDescItem {\n /** The term (label) shown in the `<dt>`. */\n readonly term = input('');\n /** The row's detail content, rendered by the list inside its `<dd>`. @internal */\n readonly content = viewChild.required<TemplateRef<unknown>>('content');\n}\n\n/**\n * DescriptionList — a semantic `<dl>` of term/detail pairs for entity-detail and\n * metadata panels. Project {@link MkDescItem} rows; values may be rich content\n * (badges, links, …). In `grid` layout terms align in a shared column; in\n * `stacked` each term sits above its value.\n *\n * ```html\n * <mk-description-list>\n * <mk-desc-item term=\"Status\"><mk-badge tone=\"success\">Active</mk-badge></mk-desc-item>\n * <mk-desc-item term=\"Owner\">Ada Lovelace</mk-desc-item>\n * </mk-description-list>\n * ```\n *\n * Only `mk-desc-item` children are rendered; the `<dl>` always contains plain\n * `<dt>`/`<dd>` pairs.\n */\n@Component({\n selector: 'mk-description-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n template: `<dl\n class=\"mk-description-list__dl\"\n [attr.data-layout]=\"layout()\"\n [class.mk-description-list__dl--divided]=\"divided()\"\n >\n @for (item of items(); track item) {\n <dt class=\"mk-description-list__term\">{{ item.term() }}</dt>\n <dd class=\"mk-description-list__details\">\n <ng-container *ngTemplateOutlet=\"item.content()\" />\n </dd>\n }\n </dl>`,\n styleUrl: './description-list.scss',\n host: { class: 'mk-description-list' },\n})\nexport class MkDescriptionList {\n /** `grid` aligns terms in a column; `stacked` puts each term above its value. */\n readonly layout = input<MkDescriptionLayout>('grid');\n /** Draw a divider between rows. */\n readonly divided = input(false, { transform: booleanAttribute });\n\n protected readonly items = contentChildren(MkDescItem);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { MkCopyToClipboard } from '@mk-kit/ui/directives';\nimport { mkHighlight, type MkCodeLanguage } from '@mk-kit/ui/core';\n\n/**\n * Code — a read-only, themed code block with syntax highlighting, an optional\n * filename header, line numbers and a copy button. Highlighting reuses the same\n * dependency-free tokenizer as {@link MkCodeEditor}. For an editable field use\n * `mk-code-editor` instead.\n *\n * ```html\n * <mk-code language=\"json\" filename=\"config.json\" [code]=\"json\" />\n * ```\n */\n@Component({\n selector: 'mk-code',\n templateUrl: './code.html',\n styleUrl: './code.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkCopyToClipboard],\n host: {\n class: 'mk-code',\n '[class.mk-code--wrap]': 'wrap()',\n },\n})\nexport class MkCode {\n /** The source to display. */\n readonly code = input('');\n /** Language for highlighting. */\n readonly language = input<MkCodeLanguage>('plaintext');\n /** Optional filename shown in a header bar. */\n readonly filename = input<string>('');\n /** Show a line-number gutter. */\n readonly lineNumbers = input(false, { transform: booleanAttribute });\n /** Show the copy button. */\n readonly copyable = input(true, { transform: booleanAttribute });\n /** Soft-wrap long lines instead of scrolling horizontally. */\n readonly wrap = input(false, { transform: booleanAttribute });\n\n protected readonly highlighted = computed(() =>\n mkHighlight(this.code(), this.language()),\n );\n\n protected readonly lines = computed(() => {\n const count = this.code() ? this.code().split('\\n').length : 1;\n return Array.from({ length: count }, (_, i) => i + 1);\n });\n\n /** Whether to render the header bar (filename and/or copy button). */\n protected readonly hasHeader = computed(\n () => !!this.filename() || this.copyable(),\n );\n\n /**\n * Accessible name of the focusable scroll region: the filename when set,\n * else a generic \"Code\". (No MK_I18N key covers this today — the block\n * editor's `blockCode` string is scoped to the editor palette.)\n */\n protected readonly scrollLabel = computed(() => this.filename() || 'Code');\n}\n","@if (hasHeader()) {\n <div class=\"mk-code__header\">\n <span class=\"mk-code__filename\">{{ filename() }}</span>\n @if (copyable()) {\n <button\n type=\"button\"\n class=\"mk-code__copy\"\n [mkCopyToClipboard]=\"code()\"\n #copier=\"mkCopyToClipboard\"\n [attr.aria-label]=\"copier.justCopied() ? 'Copied' : 'Copy code'\"\n >\n {{ copier.justCopied() ? '✓ Copied' : 'Copy' }}\n </button>\n }\n </div>\n}\n\n<!-- Focusable so keyboard users can scroll the overflowing code (WCAG 2.1.1). -->\n<div\n class=\"mk-code__scroll\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"scrollLabel()\"\n>\n @if (lineNumbers()) {\n <div class=\"mk-code__gutter\" aria-hidden=\"true\">\n @for (n of lines(); track n) {\n <span class=\"mk-code__lineno\">{{ n }}</span>\n }\n </div>\n }\n <pre class=\"mk-code__pre\"><code [innerHTML]=\"highlighted()\"></code></pre>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n PLATFORM_ID,\n TemplateRef,\n afterNextRender,\n computed,\n contentChild,\n inject,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\n\n/**\n * VirtualScroll — renders only the rows visible in the viewport (plus a small\n * overscan), so a list of thousands of fixed-height items stays smooth. Give\n * the host a height and provide a row template:\n *\n * ```html\n * <mk-virtual-scroll [items]=\"rows\" [itemHeight]=\"40\" style=\"height: 20rem;\">\n * <ng-template let-row let-i=\"index\">{{ i }} — {{ row.name }}</ng-template>\n * </mk-virtual-scroll>\n * ```\n */\n@Component({\n selector: 'mk-virtual-scroll',\n templateUrl: './virtual-scroll.html',\n styleUrl: './virtual-scroll.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: { class: 'mk-virtual-scroll' },\n})\nexport class MkVirtualScroll {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly viewportRef =\n viewChild<ElementRef<HTMLElement>>('viewport');\n\n /** The full list of items. */\n readonly items = input<readonly unknown[]>([]);\n /** Fixed height of each row in px. */\n readonly itemHeight = input(40, { transform: numberAttribute });\n /** Extra rows rendered above/below the viewport to smooth fast scrolls. */\n readonly overscan = input(4, { transform: numberAttribute });\n\n /** The row template (`<ng-template let-item let-i=\"index\">`). */\n protected readonly template = contentChild(TemplateRef);\n\n protected readonly scrollTop = signal(0);\n protected readonly viewportHeight = signal(0);\n\n /** Total scrollable height (sizes the scrollbar). */\n protected readonly totalHeight = computed(\n () => this.items().length * this.itemHeight(),\n );\n\n /**\n * The [start, end) index window currently rendered. Custom equality means\n * per-pixel scrolling only re-renders when the window actually shifts.\n */\n private readonly range = computed(\n () => {\n const ih = this.itemHeight() || 1;\n const count = this.items().length;\n const visible = Math.ceil(this.viewportHeight() / ih);\n const start = Math.max(0, Math.floor(this.scrollTop() / ih) - this.overscan());\n const end = Math.min(count, start + visible + this.overscan() * 2);\n return { start, end };\n },\n { equal: (a, b) => a.start === b.start && a.end === b.end },\n );\n\n /** Offset of the first rendered row from the top. */\n protected readonly offset = computed(() => this.range().start * this.itemHeight());\n\n /** The rendered slice, each with its absolute index. */\n protected readonly visibleItems = computed(() => {\n const { start, end } = this.range();\n return this.items()\n .slice(start, end)\n .map((item, i) => ({ item, index: start + i }));\n });\n\n constructor() {\n afterNextRender(() => {\n this.measure();\n const view = this.viewportRef()?.nativeElement;\n if (view && this.isBrowser && 'ResizeObserver' in window) {\n this.resizeObserver = new ResizeObserver(() => this.measure());\n this.resizeObserver.observe(view);\n }\n });\n }\n\n private resizeObserver?: ResizeObserver;\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n private measure(): void {\n const view = this.viewportRef()?.nativeElement;\n if (view) this.viewportHeight.set(view.clientHeight);\n }\n\n protected onScroll(event: Event): void {\n this.scrollTop.set((event.target as HTMLElement).scrollTop);\n }\n}\n","<div #viewport class=\"mk-virtual-scroll__viewport\" tabindex=\"0\" (scroll)=\"onScroll($event)\">\n <div class=\"mk-virtual-scroll__spacer\" [style.height.px]=\"totalHeight()\">\n <div\n class=\"mk-virtual-scroll__content\"\n [style.transform]=\"'translateY(' + offset() + 'px)'\"\n >\n @for (row of visibleItems(); track row.index) {\n <div class=\"mk-virtual-scroll__item\" [style.height.px]=\"itemHeight()\">\n <ng-container\n [ngTemplateOutlet]=\"template() ?? null\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item, index: row.index }\"\n />\n </div>\n }\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n model,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** Horizontal movement (px) before a pointer gesture commits to a swipe. */\nconst SWIPE_START_PX = 30;\n\n/**\n * A single slide inside {@link MkCarousel}. Mark each slide element with\n * `mkCarouselSlide`; the carousel wires ARIA + visibility.\n */\n@Directive({\n selector: '[mkCarouselSlide]',\n host: {\n class: 'mk-carousel__slide',\n role: 'group',\n 'aria-roledescription': 'slide',\n },\n})\nexport class MkCarouselSlide {\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n}\n\n/**\n * Carousel — an accessible slides/gallery. Project slides marked with\n * `mkCarouselSlide`; get prev/next arrows, dot indicators, Arrow-key\n * navigation, pointer swipe (touch or mouse drag; vertical page scroll stays\n * native) and optional autoplay that pauses on hover/focus. The current slide\n * is a two-way `index` model.\n *\n * ```html\n * <mk-carousel ariaLabel=\"Featured\" autoplay>\n * <div mkCarouselSlide>…</div>\n * <div mkCarouselSlide>…</div>\n * </mk-carousel>\n * ```\n */\n@Component({\n selector: 'mk-carousel',\n templateUrl: './carousel.html',\n styleUrl: './carousel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-carousel' },\n})\nexport class MkCarousel {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly document = inject(DOCUMENT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly slides = contentChildren(MkCarouselSlide);\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n\n /** Two-way current slide index. */\n readonly index = model(0);\n /** Accessible label for the carousel region. */\n readonly ariaLabel = input(this.i18n.carouselLabel);\n /** Wrap around at the ends. */\n readonly loop = input(true, { transform: booleanAttribute });\n /** Show the dot indicators. */\n readonly showDots = input(true, { transform: booleanAttribute });\n /** Show the prev/next arrows. */\n readonly showArrows = input(true, { transform: booleanAttribute });\n /**\n * Advance automatically. Pauses transiently on hover/focus/pointer-down and\n * shows a persistent pause/play toggle (`userPaused`). Never runs when the\n * user prefers reduced motion.\n */\n readonly autoplay = input(false, { transform: booleanAttribute });\n /** Autoplay interval in ms. */\n readonly interval = input(5000, { transform: numberAttribute });\n\n /**\n * Persistent, user-controlled pause (WCAG 2.2.2). Latched by the pause/play\n * toggle; the transient hover/focus pause never overrides it. Two-way so\n * consumers can bind or preset it.\n */\n readonly userPaused = model(false);\n\n /** Transient pause (hover / focus / pointer held down inside the viewport). */\n protected readonly paused = signal(false);\n /** True while the autoplay interval is actually running. */\n protected readonly playing = signal(false);\n /** True while the browser tab is hidden — no advancing (or CD) in the dark. */\n private readonly pageHidden = signal(false);\n /** True while the carousel is fully scrolled out of the viewport. */\n private readonly offscreen = signal(false);\n private timer?: ReturnType<typeof setInterval>;\n private io?: IntersectionObserver;\n\n protected readonly count = computed(() => this.slides().length);\n protected readonly dots = computed(() =>\n Array.from({ length: this.count() }, (_, i) => i),\n );\n protected readonly liveText = computed(() =>\n this.count() ? this.i18n.slideOf(this.index() + 1, this.count()) : '',\n );\n /**\n * Silence the live region while the slideshow is auto-advancing — otherwise\n * every auto-advance is announced forever. Announce again as soon as the\n * user is in control (paused, latched, or autoplay off).\n */\n protected readonly liveMode = computed(() => (this.playing() ? 'off' : 'polite'));\n\n /** Resolved text direction ('ltr' until measured in the browser). */\n private readonly dir = signal<'ltr' | 'rtl'>('ltr');\n\n /** Live swipe gesture, or null when no pointer is being tracked. */\n private swipe: {\n startX: number;\n startY: number;\n startT: number;\n /** True once the gesture committed to a horizontal drag. */\n active: boolean;\n } | null = null;\n /** Visual drag offset (px) applied on top of the slide position. */\n private readonly dragOffset = signal(0);\n /** True while a horizontal drag is in flight (kills the track transition). */\n protected readonly dragging = signal(false);\n\n /**\n * Track offset — in RTL the flex track lays out right-to-left, so moving to\n * the next slide means translating in the positive X direction. While a\n * swipe is in flight the pixel drag offset rides on top.\n */\n protected readonly trackTransform = computed(() => {\n const sign = this.dir() === 'rtl' ? 1 : -1;\n const base = sign * this.index() * 100;\n const offset = this.dragOffset();\n return offset\n ? `translateX(calc(${base}% + ${offset}px))`\n : `translateX(${base}%)`;\n });\n\n constructor() {\n afterNextRender(() => {\n const { direction } = getComputedStyle(this.host.nativeElement);\n this.dir.set(direction === 'rtl' ? 'rtl' : 'ltr');\n // Autoplay only runs while the tab is visible…\n this.pageHidden.set(this.document.hidden ?? false);\n this.document.addEventListener('visibilitychange', this.onVisibilityChange);\n // …and while the carousel itself is at least partially on screen\n // (guarded — jsdom has no IntersectionObserver).\n if (typeof IntersectionObserver !== 'undefined') {\n this.io = new IntersectionObserver((entries) => {\n const entry = entries[entries.length - 1];\n this.offscreen.set(!entry.isIntersecting);\n });\n this.io.observe(this.host.nativeElement);\n }\n });\n // Reflect the active slide onto each slide element (visibility + a11y).\n effect(() => {\n const active = this.index();\n this.slides().forEach((slide, i) => {\n const el = slide.el.nativeElement;\n const hidden = i !== active;\n el.setAttribute('aria-hidden', String(hidden));\n if (hidden) el.setAttribute('inert', '');\n else el.removeAttribute('inert');\n el.setAttribute('aria-label', this.i18n.slideOf(i + 1, this.slides().length));\n });\n });\n // Autoplay lifecycle. Never starts under prefers-reduced-motion — the\n // motion itself must stop, not just the CSS transition. Also idles while\n // the tab is hidden or the carousel is fully offscreen: in a zoneless app\n // every unseen advance is a wasted change-detection pass.\n effect(() => {\n const on =\n this.autoplay() &&\n !this.paused() &&\n !this.userPaused() &&\n !this.pageHidden() &&\n !this.offscreen() &&\n this.count() > 1;\n this.stopTimer();\n const start = on && this.isBrowser && !this.prefersReducedMotion();\n this.playing.set(start);\n if (start) {\n this.timer = setInterval(() => this.next(), this.interval());\n }\n });\n }\n\n /** Go to slide `i` (clamped, or wrapped when `loop`). */\n goTo(i: number): void {\n const count = this.count();\n if (count === 0) return;\n if (this.loop()) {\n this.index.set((i + count) % count);\n } else {\n this.index.set(Math.max(0, Math.min(count - 1, i)));\n }\n }\n\n next(): void {\n this.goTo(this.index() + 1);\n }\n\n prev(): void {\n this.goTo(this.index() - 1);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n this.next();\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n this.prev();\n }\n }\n\n protected pause(): void {\n this.paused.set(true);\n }\n protected resume(): void {\n this.paused.set(false);\n }\n\n /** Latches / releases the persistent pause (the toolbar toggle button). */\n protected toggleUserPause(): void {\n this.userPaused.update((v) => !v);\n }\n\n /**\n * Touch users can't hover — holding a pointer down pauses autoplay\n * transiently. It also arms swipe tracking, except on the carousel's own\n * controls (play/pause, arrows), which must stay plain tappable buttons.\n */\n protected onPointerDown(event: PointerEvent): void {\n this.pause();\n const target = event.target as HTMLElement | null;\n if (this.count() < 2 || target?.closest?.('button')) return;\n this.swipe = {\n startX: event.clientX ?? 0,\n startY: event.clientY ?? 0,\n startT: performance.now(),\n active: false,\n };\n }\n\n protected onPointerMove(event: PointerEvent): void {\n const swipe = this.swipe;\n if (!swipe) return;\n const dx = (event.clientX ?? 0) - swipe.startX;\n const dy = (event.clientY ?? 0) - swipe.startY;\n if (!swipe.active) {\n // Mostly vertical — hand the gesture back to native page scroll\n // (touch-action: pan-y keeps that scroll running throughout).\n if (Math.abs(dy) > Math.abs(dx) && Math.abs(dy) > SWIPE_START_PX) {\n this.swipe = null;\n return;\n }\n // Commit to a horizontal drag only past the threshold.\n if (Math.abs(dx) < SWIPE_START_PX || Math.abs(dx) <= Math.abs(dy)) return;\n swipe.active = true;\n this.dragging.set(true);\n try {\n // Keep receiving moves when a mouse drag leaves the viewport.\n (event.currentTarget as HTMLElement | null)?.setPointerCapture?.(\n event.pointerId,\n );\n } catch {\n /* jsdom / detached target */\n }\n }\n this.dragOffset.set(dx);\n }\n\n protected onPointerUp(event: PointerEvent): void {\n // A mouse release while still hovering must not undo the hover pause.\n if (event.pointerType !== 'mouse') this.resume();\n\n const swipe = this.swipe;\n this.swipe = null;\n if (!swipe?.active) return;\n this.dragging.set(false);\n this.dragOffset.set(0); // springs back / snaps via the track transition\n\n const viewport = event.currentTarget as HTMLElement | null;\n if (event.type === 'pointercancel') return;\n\n const dx = (event.clientX ?? 0) - swipe.startX;\n const elapsed = performance.now() - swipe.startT;\n // Velocity only counts for gestures long enough to measure — guards\n // against nonsense values from near-zero durations.\n const velocity = elapsed >= 50 ? dx / elapsed : 0;\n const width = viewport?.offsetWidth || 360;\n if (Math.abs(dx) > width * 0.25 || Math.abs(velocity) > 0.5) {\n // In RTL the track lays out right-to-left, so dragging towards positive\n // X reveals the NEXT slide; in LTR it's the opposite.\n const toNext = this.dir() === 'rtl' ? dx > 0 : dx < 0;\n if (toNext) this.next();\n else this.prev();\n }\n // A real drag happened — swallow the click that follows so links/buttons\n // inside the slide don't activate from a swipe.\n if (viewport) this.suppressNextClick(viewport);\n }\n\n /**\n * Capture-phase, one-shot click swallow: the browser fires a synthetic click\n * right after pointerup, which would activate whatever link/button the drag\n * ended on. The safety timeout covers gestures that produce no click at all.\n */\n private suppressNextClick(viewport: HTMLElement): void {\n const swallow = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n };\n viewport.addEventListener('click', swallow, { capture: true, once: true });\n setTimeout(\n () => viewport.removeEventListener('click', swallow, { capture: true }),\n 400,\n );\n }\n\n private prefersReducedMotion(): boolean {\n return (\n this.document.defaultView?.matchMedia?.('(prefers-reduced-motion: reduce)')\n .matches ?? false\n );\n }\n\n private readonly onVisibilityChange = (): void => {\n this.pageHidden.set(this.document.hidden ?? false);\n };\n\n private stopTimer(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n ngOnDestroy(): void {\n this.stopTimer();\n if (this.isBrowser) {\n this.document.removeEventListener('visibilitychange', this.onVisibilityChange);\n }\n this.io?.disconnect();\n this.io = undefined;\n }\n}\n","<div\n class=\"mk-carousel__viewport\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n [attr.aria-label]=\"ariaLabel()\"\n tabindex=\"0\"\n (keydown)=\"onKeydown($event)\"\n (mouseenter)=\"pause()\"\n (mouseleave)=\"resume()\"\n (focusin)=\"pause()\"\n (focusout)=\"resume()\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n>\n @if (autoplay()) {\n <button\n type=\"button\"\n class=\"mk-carousel__playpause\"\n [attr.aria-label]=\"userPaused() ? i18n.playSlideshow : i18n.pauseSlideshow\"\n [attr.aria-pressed]=\"userPaused()\"\n (click)=\"toggleUserPause()\"\n >\n <span aria-hidden=\"true\">{{ userPaused() ? '▶' : '⏸' }}</span>\n </button>\n }\n <div\n class=\"mk-carousel__track\"\n [class.mk-carousel__track--dragging]=\"dragging()\"\n [style.transform]=\"trackTransform()\"\n >\n <ng-content />\n </div>\n\n @if (showArrows() && count() > 1) {\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--prev\"\n [attr.aria-label]=\"i18n.previousSlide\"\n (click)=\"prev()\"\n >\n <span aria-hidden=\"true\">‹</span>\n </button>\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--next\"\n [attr.aria-label]=\"i18n.nextSlide\"\n (click)=\"next()\"\n >\n <span aria-hidden=\"true\">›</span>\n </button>\n }\n</div>\n\n@if (showDots() && count() > 1) {\n <div class=\"mk-carousel__dots\">\n @for (dot of dots(); track dot) {\n <button\n type=\"button\"\n class=\"mk-carousel__dot\"\n [class.mk-carousel__dot--active]=\"dot === index()\"\n [attr.aria-current]=\"dot === index() || null\"\n [attr.aria-label]=\"i18n.goToSlide(dot + 1)\"\n (click)=\"goTo(dot)\"\n ></button>\n }\n </div>\n}\n\n<div class=\"mk-visually-hidden\" [attr.aria-live]=\"liveMode()\">{{ liveText() }}</div>\n","/** Delegates to `@mk-kit/core` — the exported names are unchanged. */\nexport {\n mkComputeDiff,\n mkDiffStats,\n type MkDiffOp,\n type MkDiffOptions,\n type MkDiffRow,\n type MkDiffSegment,\n type MkDiffStats,\n} from '@mk-kit/core';\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport {\n type MkDiffRow,\n mkComputeDiff,\n mkDiffStats,\n} from './diff-util';\n\n/** How {@link MkDiff} lays out the comparison. */\nexport type MkDiffMode = 'unified' | 'split';\n\ninterface SplitRow {\n left: MkDiffRow | null;\n right: MkDiffRow | null;\n}\n\n/**\n * Diff — a text comparison view for revisions (before ⇄ after). Computes an LCS\n * line diff with optional intra-line word highlighting and renders a `unified`\n * (single-column, +/-) or `split` (side-by-side) view with line numbers and an\n * add/remove summary.\n *\n * ```html\n * <mk-diff [before]=\"v1\" [after]=\"v2\" mode=\"split\" />\n * ```\n */\n@Component({\n selector: 'mk-diff',\n templateUrl: './diff.html',\n styleUrl: './diff.scss',\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-diff',\n '[class.mk-diff--split]': \"mode() === 'split'\",\n },\n})\nexport class MkDiff {\n protected readonly i18n = inject(MK_I18N);\n\n /** The original (\"before\") text. */\n readonly before = input('');\n /** The new (\"after\") text. */\n readonly after = input('');\n /** Layout: single-column `unified` or side-by-side `split`. */\n readonly mode = input<MkDiffMode>('unified');\n /** Highlight the specific words that changed within a line. */\n readonly wordHighlight = input(true, { transform: booleanAttribute });\n /** Show line-number gutters. */\n readonly lineNumbers = input(true, { transform: booleanAttribute });\n /** Ignore trailing whitespace when comparing lines. */\n readonly ignoreTrailingWhitespace = input(false, {\n transform: booleanAttribute,\n });\n /** Show the +added / −removed summary header. */\n readonly showStats = input(true, { transform: booleanAttribute });\n /** Column labels (split view header / a11y). */\n readonly beforeLabel = input(this.i18n.diffBefore);\n readonly afterLabel = input(this.i18n.diffAfter);\n\n protected readonly rows = computed(() =>\n mkComputeDiff(this.before(), this.after(), {\n wordHighlight: this.wordHighlight(),\n ignoreTrailingWhitespace: this.ignoreTrailingWhitespace(),\n }),\n );\n\n protected readonly stats = computed(() => mkDiffStats(this.rows()));\n\n /** Rows paired into two columns for the split view. */\n protected readonly splitRows = computed<SplitRow[]>(() => {\n const rows = this.rows();\n const out: SplitRow[] = [];\n let i = 0;\n while (i < rows.length) {\n if (rows[i].op === 'equal') {\n out.push({ left: rows[i], right: rows[i] });\n i++;\n continue;\n }\n let d = i;\n while (d < rows.length && rows[d].op === 'delete') d++;\n let s = d;\n while (s < rows.length && rows[s].op === 'insert') s++;\n const dels = rows.slice(i, d);\n const ins = rows.slice(d, s);\n const max = Math.max(dels.length, ins.length);\n for (let k = 0; k < max; k++) {\n out.push({ left: dels[k] ?? null, right: ins[k] ?? null });\n }\n i = s;\n }\n return out;\n });\n\n protected marker(op: MkDiffRow['op']): string {\n return op === 'insert' ? '+' : op === 'delete' ? '-' : ' ';\n }\n}\n","@if (showStats()) {\n <div class=\"mk-diff__header\">\n <span class=\"mk-diff__label\">{{ beforeLabel() }} → {{ afterLabel() }}</span>\n <span class=\"mk-diff__stats\" [attr.aria-label]=\"i18n.diffChanges\">\n <span class=\"mk-diff__stat mk-diff__stat--add\">+{{ stats().added }}</span>\n <span class=\"mk-diff__stat mk-diff__stat--del\">−{{ stats().removed }}</span>\n </span>\n </div>\n}\n\n<!-- Shared code cell (word segments when present, else plain text). -->\n<ng-template #cell let-row>\n @if (row.segments) {\n @for (seg of row.segments; track $index) {\n <span [class.mk-diff__word]=\"seg.changed\">{{ seg.text }}</span>\n }\n } @else {\n {{ row.text }}\n }\n</ng-template>\n\n<!-- The bodies scroll horizontally, so they are focusable labelled regions to\n stay keyboard-scrollable. Changed lines carry a visually-hidden\n \"Added:\"/\"Removed:\" prefix — color alone never marks a change. -->\n@if (mode() === 'split') {\n <div\n class=\"mk-diff__body mk-diff__body--split\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.diffChanges\"\n >\n @for (row of splitRows(); track $index) {\n <div\n class=\"mk-diff__cell\"\n [class.mk-diff__cell--delete]=\"row.left?.op === 'delete'\"\n [class.mk-diff__cell--empty]=\"!row.left\"\n >\n @if (lineNumbers()) {\n <span class=\"mk-diff__num\">{{ row.left?.beforeNo ?? '' }}</span>\n }\n @if (row.left?.op === 'delete') {\n <span class=\"mk-visually-hidden\">{{ i18n.diffRemovedLine }}</span>\n }\n <span class=\"mk-diff__marker\" aria-hidden=\"true\">{{\n row.left ? marker(row.left.op) : ''\n }}</span>\n <code class=\"mk-diff__code\">@if (row.left) {\n <ng-container [ngTemplateOutlet]=\"cell\" [ngTemplateOutletContext]=\"{ $implicit: row.left }\" />\n }</code>\n </div>\n <div\n class=\"mk-diff__cell\"\n [class.mk-diff__cell--insert]=\"row.right?.op === 'insert'\"\n [class.mk-diff__cell--empty]=\"!row.right\"\n >\n @if (lineNumbers()) {\n <span class=\"mk-diff__num\">{{ row.right?.afterNo ?? '' }}</span>\n }\n @if (row.right?.op === 'insert') {\n <span class=\"mk-visually-hidden\">{{ i18n.diffAddedLine }}</span>\n }\n <span class=\"mk-diff__marker\" aria-hidden=\"true\">{{\n row.right ? marker(row.right.op) : ''\n }}</span>\n <code class=\"mk-diff__code\">@if (row.right) {\n <ng-container [ngTemplateOutlet]=\"cell\" [ngTemplateOutletContext]=\"{ $implicit: row.right }\" />\n }</code>\n </div>\n }\n </div>\n} @else {\n <div\n class=\"mk-diff__body\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.diffChanges\"\n >\n @for (row of rows(); track $index) {\n <div\n class=\"mk-diff__row\"\n [class.mk-diff__row--insert]=\"row.op === 'insert'\"\n [class.mk-diff__row--delete]=\"row.op === 'delete'\"\n >\n @if (lineNumbers()) {\n <span class=\"mk-diff__num\">{{ row.beforeNo ?? '' }}</span>\n <span class=\"mk-diff__num\">{{ row.afterNo ?? '' }}</span>\n }\n @if (row.op === 'insert') {\n <span class=\"mk-visually-hidden\">{{ i18n.diffAddedLine }}</span>\n } @else if (row.op === 'delete') {\n <span class=\"mk-visually-hidden\">{{ i18n.diffRemovedLine }}</span>\n }\n <span class=\"mk-diff__marker\" aria-hidden=\"true\">{{ marker(row.op) }}</span>\n <code class=\"mk-diff__code\"><ng-container [ngTemplateOutlet]=\"cell\" [ngTemplateOutletContext]=\"{ $implicit: row }\" /></code>\n </div>\n }\n </div>\n}\n","/**\n * Dependency-free QR Code encoder.\n *\n * A from-scratch implementation of the QR encoding algorithm (ISO/IEC 18004):\n * byte-mode (UTF-8) data encoding, Reed–Solomon error correction over GF(256),\n * matrix construction with function patterns, all eight data masks scored by\n * the four penalty rules, and BCH format/version information.\n *\n * Scope: byte mode only, versions 1–10 (module counts 21…57), ECC levels\n * L/M/Q/H. That covers roughly 7–271 UTF-8 bytes depending on the ECC level.\n * Numeric/alphanumeric/kanji modes and versions ≥ 11 are intentionally out of\n * scope — everything is encoded as UTF-8 bytes, which is always valid.\n *\n * The single public entry point is {@link mkEncodeQr}, a pure function.\n */\n\nexport type MkQrEcc = 'L' | 'M' | 'Q' | 'H';\n\nconst ECC_INDEX: Record<MkQrEcc, number> = { L: 0, M: 1, Q: 2, H: 3 };\n\n/** ECC-level bits used inside the 15-bit format string (L=01, M=00, Q=11, H=10). */\nconst ECC_FORMAT_BITS: Record<MkQrEcc, number> = { L: 1, M: 0, Q: 3, H: 2 };\n\n/**\n * Error-correction block layout per version (1–10) and ECC level.\n *\n * Each entry is `[ecCodewordsPerBlock, numBlocksGroup1, dataCodewordsPerBlockGroup1,\n * numBlocksGroup2, dataCodewordsPerBlockGroup2]`. Group-2 blocks (when present)\n * hold exactly one more data codeword than group-1 blocks. Indexed\n * `ECC_BLOCKS[version][ECC_INDEX[ecc]]`; index 0 is an unused placeholder.\n */\nconst ECC_BLOCKS: number[][][] = [\n [], // version 0 — unused\n // v1\n [\n [7, 1, 19, 0, 0],\n [10, 1, 16, 0, 0],\n [13, 1, 13, 0, 0],\n [17, 1, 9, 0, 0],\n ],\n // v2\n [\n [10, 1, 34, 0, 0],\n [16, 1, 28, 0, 0],\n [22, 1, 22, 0, 0],\n [28, 1, 16, 0, 0],\n ],\n // v3\n [\n [15, 1, 55, 0, 0],\n [26, 1, 44, 0, 0],\n [18, 2, 17, 0, 0],\n [22, 2, 13, 0, 0],\n ],\n // v4\n [\n [20, 1, 80, 0, 0],\n [18, 2, 32, 0, 0],\n [26, 2, 24, 0, 0],\n [16, 4, 9, 0, 0],\n ],\n // v5\n [\n [26, 1, 108, 0, 0],\n [24, 2, 43, 0, 0],\n [18, 2, 15, 2, 16],\n [22, 2, 11, 2, 12],\n ],\n // v6\n [\n [18, 2, 68, 0, 0],\n [16, 4, 27, 0, 0],\n [24, 4, 19, 0, 0],\n [28, 4, 15, 0, 0],\n ],\n // v7\n [\n [20, 2, 78, 0, 0],\n [18, 4, 31, 0, 0],\n [18, 2, 14, 4, 15],\n [26, 4, 13, 1, 14],\n ],\n // v8\n [\n [24, 2, 97, 0, 0],\n [22, 2, 38, 2, 39],\n [22, 4, 18, 2, 19],\n [26, 4, 14, 2, 15],\n ],\n // v9\n [\n [30, 2, 116, 0, 0],\n [22, 3, 36, 2, 37],\n [20, 4, 16, 4, 17],\n [24, 4, 12, 4, 13],\n ],\n // v10\n [\n [18, 2, 68, 2, 69],\n [26, 4, 43, 1, 44],\n [24, 6, 19, 2, 20],\n [28, 6, 15, 2, 16],\n ],\n];\n\n/** Highest supported version. */\nconst MAX_VERSION = ECC_BLOCKS.length - 1;\n\n/**\n * Alignment-pattern centre coordinates per version. Alignment patterns are\n * placed at every (row, col) pair drawn from this list, except the three that\n * would collide with the finder patterns (the three outer corners).\n */\nconst ALIGN_POSITIONS: number[][] = [\n [], // 0\n [], // 1 — none\n [6, 18], // 2\n [6, 22], // 3\n [6, 26], // 4\n [6, 30], // 5\n [6, 34], // 6\n [6, 22, 38], // 7\n [6, 24, 42], // 8\n [6, 26, 46], // 9\n [6, 28, 50], // 10\n];\n\n// ── GF(256) arithmetic ──────────────────────────────────────────────────────\n// Galois field with primitive polynomial 0x11D (x^8 + x^4 + x^3 + x^2 + 1).\n\nconst GF_EXP = new Uint8Array(512);\nconst GF_LOG = new Uint8Array(256);\n(() => {\n let x = 1;\n for (let i = 0; i < 255; i++) {\n GF_EXP[i] = x;\n GF_LOG[x] = i;\n x <<= 1;\n if (x & 0x100) x ^= 0x11d;\n }\n for (let i = 255; i < 512; i++) GF_EXP[i] = GF_EXP[i - 255];\n})();\n\nfunction gfMul(a: number, b: number): number {\n if (a === 0 || b === 0) return 0;\n return GF_EXP[GF_LOG[a] + GF_LOG[b]];\n}\n\n/** Reed–Solomon generator polynomial (divisor) of the given degree. */\nfunction rsGenerator(degree: number): number[] {\n const result = new Array<number>(degree).fill(0);\n result[degree - 1] = 1; // start with the monomial 1 (coefficients low→high position)\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = gfMul(result[j], root);\n if (j + 1 < result.length) result[j] ^= result[j + 1];\n }\n root = gfMul(root, 0x02);\n }\n return result;\n}\n\n/** Reed–Solomon remainder (the ECC codewords) of `data` divided by `divisor`. */\nfunction rsRemainder(data: number[], divisor: number[]): number[] {\n const result = new Array<number>(divisor.length).fill(0);\n for (const b of data) {\n const factor = b ^ (result.shift() as number);\n result.push(0);\n for (let i = 0; i < divisor.length; i++) result[i] ^= gfMul(divisor[i], factor);\n }\n return result;\n}\n\n// ── Bit helpers ─────────────────────────────────────────────────────────────\n\nfunction getBit(x: number, i: number): boolean {\n return ((x >>> i) & 1) !== 0;\n}\n\n/** UTF-8 encode a string to a plain byte array (no runtime dependency). */\nfunction utf8Bytes(text: string): number[] {\n if (typeof TextEncoder !== 'undefined') {\n return Array.from(new TextEncoder().encode(text));\n }\n // Minimal fallback for environments without TextEncoder.\n const out: number[] = [];\n for (let i = 0; i < text.length; i++) {\n let code = text.charCodeAt(i);\n if (code >= 0xd800 && code <= 0xdbff && i + 1 < text.length) {\n const next = text.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n code = 0x10000 + ((code - 0xd800) << 10) + (next - 0xdc00);\n i++;\n }\n }\n if (code < 0x80) out.push(code);\n else if (code < 0x800) out.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n else if (code < 0x10000)\n out.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));\n else\n out.push(\n 0xf0 | (code >> 18),\n 0x80 | ((code >> 12) & 0x3f),\n 0x80 | ((code >> 6) & 0x3f),\n 0x80 | (code & 0x3f),\n );\n }\n return out;\n}\n\n// ── Capacity / version selection ────────────────────────────────────────────\n\n/** Total data codewords available at a given version + ECC level. */\nfunction dataCodewordCount(version: number, ecc: MkQrEcc): number {\n const [, g1n, g1d, g2n, g2d] = ECC_BLOCKS[version][ECC_INDEX[ecc]];\n return g1n * g1d + g2n * g2d;\n}\n\n/** Byte-mode character-count-indicator width: 8 bits for v1–9, 16 bits for v10+. */\nfunction charCountBits(version: number): number {\n return version < 10 ? 8 : 16;\n}\n\n/** Smallest supporting version, or throw if the payload is too large. */\nfunction selectVersion(byteLen: number, ecc: MkQrEcc): number {\n for (let v = 1; v <= MAX_VERSION; v++) {\n const needed = 4 + charCountBits(v) + byteLen * 8;\n if (needed <= dataCodewordCount(v, ecc) * 8) return v;\n }\n throw new Error(\n `mkEncodeQr: payload of ${byteLen} bytes is too large for QR versions 1–${MAX_VERSION} at ECC level ${ecc}.`,\n );\n}\n\n// ── Data codewords (encoding + padding + RS + interleaving) ──────────────────\n\nfunction buildCodewords(bytes: number[], version: number, ecc: MkQrEcc): number[] {\n const totalData = dataCodewordCount(version, ecc);\n const capacityBits = totalData * 8;\n\n // Bit buffer.\n const bits: number[] = [];\n const push = (val: number, len: number) => {\n for (let i = len - 1; i >= 0; i--) bits.push((val >> i) & 1);\n };\n\n push(0b0100, 4); // byte mode indicator\n push(bytes.length, charCountBits(version)); // character count\n for (const b of bytes) push(b, 8); // UTF-8 payload\n\n // Terminator: up to 4 zero bits, not exceeding capacity.\n push(0, Math.min(4, capacityBits - bits.length));\n // Pad to a byte boundary.\n while (bits.length % 8 !== 0) bits.push(0);\n\n // Convert to data codeword bytes.\n const dataCodewords: number[] = [];\n for (let i = 0; i < bits.length; i += 8) {\n let b = 0;\n for (let j = 0; j < 8; j++) b = (b << 1) | bits[i + j];\n dataCodewords.push(b);\n }\n // Pad bytes 0xEC / 0x11 alternating until full.\n const pad = [0xec, 0x11];\n for (let i = 0; dataCodewords.length < totalData; i++) dataCodewords.push(pad[i % 2]);\n\n // Split into ECC blocks.\n const [ecPerBlock, g1n, g1d, g2n] = ECC_BLOCKS[version][ECC_INDEX[ecc]];\n const totalBlocks = g1n + g2n;\n const divisor = rsGenerator(ecPerBlock);\n\n const dataBlocks: number[][] = [];\n const eccBlocks: number[][] = [];\n let offset = 0;\n for (let b = 0; b < totalBlocks; b++) {\n const len = b < g1n ? g1d : g1d + 1;\n const block = dataCodewords.slice(offset, offset + len);\n offset += len;\n dataBlocks.push(block);\n eccBlocks.push(rsRemainder(block, divisor));\n }\n\n // Interleave data codewords, then ECC codewords.\n const result: number[] = [];\n const maxData = Math.max(...dataBlocks.map((b) => b.length));\n for (let i = 0; i < maxData; i++) {\n for (const block of dataBlocks) if (i < block.length) result.push(block[i]);\n }\n for (let i = 0; i < ecPerBlock; i++) {\n for (const block of eccBlocks) result.push(block[i]);\n }\n return result;\n}\n\n// ── Matrix construction ─────────────────────────────────────────────────────\n\ninterface Grid {\n size: number;\n modules: boolean[][]; // true = dark\n fn: boolean[][]; // true = function module (not maskable, not data)\n}\n\nfunction makeGrid(version: number): Grid {\n const size = version * 4 + 17;\n const modules = Array.from({ length: size }, () => new Array<boolean>(size).fill(false));\n const fn = Array.from({ length: size }, () => new Array<boolean>(size).fill(false));\n return { size, modules, fn };\n}\n\nfunction setFn(g: Grid, r: number, c: number, dark: boolean): void {\n g.modules[r][c] = dark;\n g.fn[r][c] = true;\n}\n\nfunction drawFinder(g: Grid, cr: number, cc: number): void {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const r = cr + dy;\n const c = cc + dx;\n if (r < 0 || r >= g.size || c < 0 || c >= g.size) continue;\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n // dark for the 3×3 centre (dist ≤ 1) and the outer ring (dist 3);\n // white for the inner ring (dist 2) and the separator (dist 4).\n setFn(g, r, c, dist !== 2 && dist !== 4);\n }\n }\n}\n\nfunction drawAlignment(g: Grid, cr: number, cc: number): void {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n setFn(g, cr + dy, cc + dx, dist !== 1);\n }\n }\n}\n\nfunction drawFunctionPatterns(g: Grid, version: number, ecc: MkQrEcc): void {\n const n = g.size;\n\n // Timing patterns (drawn first; overlaps with finders are overwritten below).\n for (let i = 0; i < n; i++) {\n setFn(g, 6, i, i % 2 === 0);\n setFn(g, i, 6, i % 2 === 0);\n }\n\n // Three finder patterns (+ their separators).\n drawFinder(g, 3, 3);\n drawFinder(g, 3, n - 4);\n drawFinder(g, n - 4, 3);\n\n // Alignment patterns — all pairs except the three finder corners.\n const pos = ALIGN_POSITIONS[version];\n const last = pos.length - 1;\n for (let i = 0; i < pos.length; i++) {\n for (let j = 0; j < pos.length; j++) {\n if ((i === 0 && j === 0) || (i === 0 && j === last) || (i === last && j === 0)) continue;\n drawAlignment(g, pos[i], pos[j]);\n }\n }\n\n // Dark module.\n setFn(g, n - 8, 8, true);\n\n // Reserve format-info area (placeholder) and draw version info (v ≥ 7).\n drawFormatBits(g, ecc, 0);\n drawVersion(g, version);\n}\n\nfunction drawFormatBits(g: Grid, ecc: MkQrEcc, mask: number): void {\n const data = (ECC_FORMAT_BITS[ecc] << 3) | mask;\n let rem = data;\n for (let i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >>> 9) * 0x537);\n const bits = ((data << 10) | rem) ^ 0x5412; // 15-bit format string\n const n = g.size;\n\n // First copy — around the top-left finder.\n for (let i = 0; i <= 5; i++) setFn(g, 8, i, getBit(bits, i));\n setFn(g, 8, 7, getBit(bits, 6));\n setFn(g, 8, 8, getBit(bits, 7));\n setFn(g, 7, 8, getBit(bits, 8));\n for (let i = 9; i < 15; i++) setFn(g, 14 - i, 8, getBit(bits, i));\n\n // Second copy — split across the top-right and bottom-left finders.\n for (let i = 0; i < 8; i++) setFn(g, n - 1 - i, 8, getBit(bits, i));\n for (let i = 8; i < 15; i++) setFn(g, 8, n - 15 + i, getBit(bits, i));\n}\n\nfunction drawVersion(g: Grid, version: number): void {\n if (version < 7) return;\n let rem = version;\n for (let i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25);\n const bits = (version << 12) | rem; // 18-bit version string\n const n = g.size;\n for (let i = 0; i < 18; i++) {\n const bit = getBit(bits, i);\n const a = n - 11 + (i % 3);\n const b = Math.floor(i / 3);\n setFn(g, a, b, bit);\n setFn(g, b, a, bit);\n }\n}\n\n/** Place the interleaved codeword bit stream in the zig-zag pattern. */\nfunction placeData(g: Grid, codewords: number[]): void {\n const n = g.size;\n let bitIndex = 0;\n const totalBits = codewords.length * 8;\n const nextBit = (): boolean => {\n if (bitIndex >= totalBits) return false; // remainder bits are 0\n const bit = getBit(codewords[bitIndex >> 3], 7 - (bitIndex & 7));\n bitIndex++;\n return bit;\n };\n\n let upward = true;\n for (let col = n - 1; col > 0; col -= 2) {\n if (col === 6) col--; // skip the vertical timing column\n for (let i = 0; i < n; i++) {\n const row = upward ? n - 1 - i : i;\n for (let c = 0; c < 2; c++) {\n const cc = col - c;\n if (!g.fn[row][cc]) g.modules[row][cc] = nextBit();\n }\n }\n upward = !upward;\n }\n}\n\n// ── Masking ─────────────────────────────────────────────────────────────────\n\nfunction maskCondition(mask: number, r: number, c: number): boolean {\n switch (mask) {\n case 0:\n return (r + c) % 2 === 0;\n case 1:\n return r % 2 === 0;\n case 2:\n return c % 3 === 0;\n case 3:\n return (r + c) % 3 === 0;\n case 4:\n return (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0;\n case 5:\n return ((r * c) % 2) + ((r * c) % 3) === 0;\n case 6:\n return (((r * c) % 2) + ((r * c) % 3)) % 2 === 0;\n case 7:\n return (((r + c) % 2) + ((r * c) % 3)) % 2 === 0;\n default:\n return false;\n }\n}\n\n/** XOR the mask onto every non-function module (self-inverse). */\nfunction applyMask(g: Grid, mask: number): void {\n for (let r = 0; r < g.size; r++) {\n for (let c = 0; c < g.size; c++) {\n if (!g.fn[r][c] && maskCondition(mask, r, c)) g.modules[r][c] = !g.modules[r][c];\n }\n }\n}\n\nconst FINDER_LINE = [true, false, true, true, true, false, true, false, false, false, false];\nconst FINDER_LINE_REV = [...FINDER_LINE].reverse();\n\nfunction matchesAt(get: (i: number) => boolean, pattern: boolean[], start: number): boolean {\n for (let i = 0; i < pattern.length; i++) if (get(start + i) !== pattern[i]) return false;\n return true;\n}\n\n/** The four penalty rules; lower is better. */\nfunction penaltyScore(g: Grid): number {\n const n = g.size;\n const m = g.modules;\n let score = 0;\n\n // Rule 1 — runs of ≥ 5 same-colour modules in each row and column.\n for (let r = 0; r < n; r++) {\n let color = m[r][0];\n let run = 1;\n for (let c = 1; c < n; c++) {\n if (m[r][c] === color) run++;\n else {\n if (run >= 5) score += run - 2;\n color = m[r][c];\n run = 1;\n }\n }\n if (run >= 5) score += run - 2;\n }\n for (let c = 0; c < n; c++) {\n let color = m[0][c];\n let run = 1;\n for (let r = 1; r < n; r++) {\n if (m[r][c] === color) run++;\n else {\n if (run >= 5) score += run - 2;\n color = m[r][c];\n run = 1;\n }\n }\n if (run >= 5) score += run - 2;\n }\n\n // Rule 2 — 2×2 blocks of the same colour.\n for (let r = 0; r < n - 1; r++) {\n for (let c = 0; c < n - 1; c++) {\n const v = m[r][c];\n if (v === m[r][c + 1] && v === m[r + 1][c] && v === m[r + 1][c + 1]) score += 3;\n }\n }\n\n // Rule 3 — finder-like 1:1:3:1:1 pattern with 4 light modules on one side.\n for (let r = 0; r < n; r++) {\n for (let c = 0; c <= n - 11; c++) {\n const get = (i: number) => m[r][i];\n if (matchesAt(get, FINDER_LINE, c) || matchesAt(get, FINDER_LINE_REV, c)) score += 40;\n }\n }\n for (let c = 0; c < n; c++) {\n for (let r = 0; r <= n - 11; r++) {\n const get = (i: number) => m[i][c];\n if (matchesAt(get, FINDER_LINE, r) || matchesAt(get, FINDER_LINE_REV, r)) score += 40;\n }\n }\n\n // Rule 4 — deviation of the dark-module ratio from 50%.\n let dark = 0;\n for (let r = 0; r < n; r++) for (let c = 0; c < n; c++) if (m[r][c]) dark++;\n const percent = (dark * 100) / (n * n);\n score += Math.floor(Math.abs(percent - 50) / 5) * 10;\n\n return score;\n}\n\n// ── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Encode `text` (UTF-8, byte mode) as a QR code module matrix.\n *\n * @param text The payload. May be empty.\n * @param ecc Error-correction level: `L` (~7%), `M` (~15%), `Q` (~25%), `H` (~30%).\n * @returns A square `boolean[][]` where `true` marks a dark module. The side\n * length is `17 + 4 * version` (21 for v1 … 57 for v10).\n * @throws If the payload does not fit in versions 1–10 at the chosen ECC level.\n */\nexport function mkEncodeQr(text: string, ecc: MkQrEcc): boolean[][] {\n const bytes = utf8Bytes(text);\n const version = selectVersion(bytes.length, ecc);\n const codewords = buildCodewords(bytes, version, ecc);\n\n const g = makeGrid(version);\n drawFunctionPatterns(g, version, ecc);\n placeData(g, codewords);\n\n // Choose the mask with the lowest penalty.\n let bestMask = 0;\n let bestScore = Infinity;\n for (let mask = 0; mask < 8; mask++) {\n applyMask(g, mask);\n drawFormatBits(g, ecc, mask);\n const score = penaltyScore(g);\n if (score < bestScore) {\n bestScore = score;\n bestMask = mask;\n }\n applyMask(g, mask); // undo (XOR is self-inverse)\n }\n applyMask(g, bestMask);\n drawFormatBits(g, ecc, bestMask);\n\n return g.modules;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { mkEncodeQr, MkQrEcc } from './qr-encode';\n\n/**\n * QR Code — a dependency-free QR generator rendered as an SVG. The entire\n * encoding (byte mode, Reed–Solomon ECC, masking, format info) is implemented\n * from scratch in {@link mkEncodeQr}; no npm library is used. Dark modules are\n * drawn as `<rect>`s over a background rectangle that also fills the quiet zone,\n * so the code is theme-aware (`var(--mk-text)` on `var(--mk-surface)`) and\n * fully overridable. Exposes `role=\"img\"` with an `aria-label` for assistive\n * tech.\n *\n * Supports versions 1–10 and ECC levels L/M/Q/H (byte mode / UTF-8).\n *\n * ```html\n * <mk-qr-code value=\"https://example.com\" ecc=\"M\" [size]=\"200\" />\n * ```\n */\n@Component({\n selector: 'mk-qr-code',\n templateUrl: './qr-code.html',\n styleUrl: './qr-code.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-qr-code',\n role: 'img',\n '[attr.aria-label]': 'effectiveLabel()',\n },\n})\nexport class MkQrCode {\n protected readonly i18n = inject(MK_I18N);\n\n /** The text to encode (UTF-8, byte mode). */\n readonly value = input.required<string>();\n /** Error-correction level: `L` (~7%), `M` (~15%), `Q` (~25%), `H` (~30%). */\n readonly ecc = input<MkQrEcc>('M');\n /** Rendered pixel size of the (square) SVG. */\n readonly size = input(160, { transform: numberAttribute });\n /** Width of the light margin around the code, in modules (spec recommends 4). */\n readonly quietZone = input(4, { transform: numberAttribute });\n /** Dark-module colour. */\n readonly color = input('var(--mk-text)');\n /** Background / quiet-zone colour. */\n readonly background = input('var(--mk-surface)');\n /**\n * Accessible label for the image. When omitted, the label carries the\n * encoded content (`QR code: <value>`) so AT users learn what the code says.\n */\n readonly label = input('');\n\n /** The label actually exposed on the host: `label`, or a generated default. */\n protected readonly effectiveLabel = computed(\n () => this.label() || this.i18n.qrCodeLabel(this.value()),\n );\n\n /** The module matrix (`true` = dark); empty if encoding fails (e.g. too long). */\n protected readonly matrix = computed<boolean[][]>(() => {\n try {\n return mkEncodeQr(this.value() ?? '', this.ecc());\n } catch {\n return [];\n }\n });\n\n /** Quiet zone clamped to a non-negative integer. */\n protected readonly quiet = computed(() => Math.max(0, Math.round(this.quietZone())));\n\n /** Side length of the viewBox in modules (code + both quiet-zone margins). */\n protected readonly dimension = computed(() => this.matrix().length + 2 * this.quiet());\n\n /** Top-left coordinates (in module units) of every dark module. */\n protected readonly modules = computed(() => {\n const m = this.matrix();\n const q = this.quiet();\n const out: { x: number; y: number }[] = [];\n for (let r = 0; r < m.length; r++) {\n const row = m[r];\n for (let c = 0; c < row.length; c++) {\n if (row[c]) out.push({ x: c + q, y: r + q });\n }\n }\n return out;\n });\n}\n","<svg\n class=\"mk-qr-code__svg\"\n [attr.viewBox]=\"'0 0 ' + dimension() + ' ' + dimension()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n preserveAspectRatio=\"xMidYMid meet\"\n shape-rendering=\"crispEdges\"\n aria-hidden=\"true\"\n focusable=\"false\"\n>\n <rect\n class=\"mk-qr-code__bg\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"dimension()\"\n [attr.height]=\"dimension()\"\n [style.fill]=\"background()\"\n />\n @for (module of modules(); track $index) {\n <rect\n class=\"mk-qr-code__module\"\n [attr.x]=\"module.x\"\n [attr.y]=\"module.y\"\n width=\"1\"\n height=\"1\"\n [style.fill]=\"color()\"\n />\n }\n</svg>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n numberAttribute,\n signal,\n untracked,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** One rendered node of the JSON tree. */\nexport interface MkJsonNode {\n /** Property name / array index; `null` for the root. */\n key: string | null;\n /** Node kind (drives colouring + expandability). */\n type: 'object' | 'array' | 'string' | 'number' | 'boolean' | 'null' | 'circular';\n /** Display text for primitives. */\n display: string;\n /** Children for objects/arrays. */\n children: MkJsonNode[];\n /** Unique path (e.g. `$.users[0].name`) used for expansion tracking. */\n path: string;\n /** Nesting depth (root = 0). */\n depth: number;\n}\n\n/** Build the node tree for a JSON-ish value (circular refs marked). */\nexport function mkBuildJsonTree(value: unknown): MkJsonNode {\n const seen = new WeakSet<object>();\n\n const build = (\n v: unknown,\n key: string | null,\n path: string,\n depth: number,\n ): MkJsonNode => {\n if (v === null || v === undefined) {\n return { key, type: 'null', display: String(v), children: [], path, depth };\n }\n if (typeof v === 'string') {\n return { key, type: 'string', display: JSON.stringify(v), children: [], path, depth };\n }\n if (typeof v === 'number' || typeof v === 'bigint') {\n return { key, type: 'number', display: String(v), children: [], path, depth };\n }\n if (typeof v === 'boolean') {\n return { key, type: 'boolean', display: String(v), children: [], path, depth };\n }\n if (typeof v === 'object') {\n if (seen.has(v)) {\n return { key, type: 'circular', display: '[Circular]', children: [], path, depth };\n }\n seen.add(v);\n if (Array.isArray(v)) {\n const children = v.map((item, i) =>\n build(item, String(i), `${path}[${i}]`, depth + 1),\n );\n seen.delete(v);\n return { key, type: 'array', display: '', children, path, depth };\n }\n const children = Object.entries(v as Record<string, unknown>).map(\n ([k, item]) => build(item, k, `${path}.${k}`, depth + 1),\n );\n seen.delete(v);\n return { key, type: 'object', display: '', children, path, depth };\n }\n // Functions/symbols — not JSON, shown as text.\n return { key, type: 'null', display: String(v), children: [], path, depth };\n };\n\n return build(value, null, '$', 0);\n}\n\n/**\n * JsonViewer — a read-only, collapsible tree for JSON-ish data: objects and\n * arrays fold behind disclosure buttons (with a `{…} n items` preview),\n * primitives are colour-coded by type, and circular references render as\n * `[Circular]` instead of recursing. `expandDepth` controls how much is open\n * initially; `expandAll()` / `collapseAll()` are available on the component.\n *\n * The complement of `mk-code-editor`: the editor edits JSON text, this\n * explores JSON *data* (API responses, entity payloads, config dumps).\n *\n * ```html\n * <mk-json-viewer [data]=\"response\" [expandDepth]=\"2\" />\n * ```\n */\n@Component({\n selector: 'mk-json-viewer',\n templateUrl: './json-viewer.html',\n styleUrl: './json-viewer.scss',\n exportAs: 'mkJsonViewer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: {\n class: 'mk-json-viewer',\n // The host scrolls horizontally; make it keyboard-scrollable (WCAG 2.1.1).\n role: 'region',\n tabindex: '0',\n '[attr.aria-label]': 'ariaLabel()',\n },\n})\nexport class MkJsonViewer {\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n\n /** The value to display (any JSON-serialisable data). */\n readonly data = input.required<unknown>();\n /** How many levels start expanded (root = level 1). */\n readonly expandDepth = input(1, { transform: numberAttribute });\n /** Accessible label of the tree region. */\n readonly ariaLabel = input<string>(this.i18n.jsonLabel, {\n alias: 'aria-label',\n });\n\n /**\n * Paths currently expanded. Mutated in place — a toggle is O(1) instead of\n * copying the whole set — with `expansionVersion` bumped so signal-driven\n * bindings re-evaluate. Always read through {@link isExpanded}.\n */\n private readonly expanded = new Set<string>();\n /** Bumped on every expansion change; the reactive face of `expanded`. */\n private readonly expansionVersion = signal(0);\n\n /** The built node tree. */\n protected readonly root = computed(() => mkBuildJsonTree(this.data()));\n\n /**\n * Collapsed previews, cached per node so template bindings don't rebuild the\n * string on every change-detection pass. Keyed weakly: entries die with the\n * tree when `data` changes.\n */\n private readonly previews = new WeakMap<MkJsonNode, string>();\n\n constructor() {\n // Reset expansion to `expandDepth` whenever the data (or depth) changes.\n effect(() => {\n const root = this.root();\n const depth = this.expandDepth();\n untracked(() => this.replaceExpanded(collectToDepth(root, depth)));\n });\n }\n\n protected isExpanded(path: string): boolean {\n this.expansionVersion(); // Track: re-evaluate when expansion changes.\n return this.expanded.has(path);\n }\n\n protected toggle(path: string): void {\n if (!this.expanded.delete(path)) this.expanded.add(path);\n this.expansionVersion.update((v) => v + 1);\n }\n\n /** Expand every object/array node. */\n expandAll(): void {\n this.replaceExpanded(collectToDepth(this.root(), Number.POSITIVE_INFINITY));\n }\n\n /** Collapse everything (the root stays visible). */\n collapseAll(): void {\n this.replaceExpanded(EMPTY_PATHS);\n }\n\n /** Swap the expansion set's contents and notify bindings. */\n private replaceExpanded(paths: ReadonlySet<string>): void {\n this.expanded.clear();\n for (const path of paths) this.expanded.add(path);\n this.expansionVersion.update((v) => v + 1);\n }\n\n /** Collapsed preview, e.g. `{…}` / `[…]` + item count (cached per node). */\n protected preview(node: MkJsonNode): string {\n let text = this.previews.get(node);\n if (text === undefined) {\n const braces = node.type === 'array' ? '[…]' : '{…}';\n text = `${braces} ${this.i18n.groupCount(node.children.length)}`;\n this.previews.set(node, text);\n }\n return text;\n }\n}\n\nconst EMPTY_PATHS: ReadonlySet<string> = new Set();\n\n/** All container paths with depth < `maxDepth`. */\nfunction collectToDepth(root: MkJsonNode, maxDepth: number): Set<string> {\n const paths = new Set<string>();\n const walk = (node: MkJsonNode): void => {\n if (node.children.length === 0 && node.type !== 'object' && node.type !== 'array') {\n return;\n }\n if (node.type === 'object' || node.type === 'array') {\n if (node.depth < maxDepth) paths.add(node.path);\n node.children.forEach(walk);\n }\n };\n walk(root);\n return paths;\n}\n","<div class=\"mk-json-viewer__root\" role=\"group\" [attr.aria-label]=\"ariaLabel()\">\n <ng-container\n *ngTemplateOutlet=\"nodeTpl; context: { $implicit: root() }\"\n />\n</div>\n\n<ng-template #nodeTpl let-node>\n @if (node.type === 'object' || node.type === 'array') {\n <div class=\"mk-json-viewer__node\">\n <button\n type=\"button\"\n class=\"mk-json-viewer__toggle\"\n [attr.aria-expanded]=\"isExpanded(node.path)\"\n [attr.aria-label]=\"node.key === null ? ariaLabel() : null\"\n (click)=\"toggle(node.path)\"\n >\n <span class=\"mk-json-viewer__chevron\" aria-hidden=\"true\"></span>\n @if (node.key !== null) {\n <span class=\"mk-json-viewer__key\">{{ node.key }}</span>\n <span class=\"mk-json-viewer__colon\" aria-hidden=\"true\">:</span>\n }\n @if (!isExpanded(node.path)) {\n <span class=\"mk-json-viewer__preview\">{{ preview(node) }}</span>\n } @else {\n <span class=\"mk-json-viewer__brace\" aria-hidden=\"true\">{{\n node.type === 'array' ? '[' : '{'\n }}</span>\n }\n </button>\n @if (isExpanded(node.path)) {\n <ul class=\"mk-json-viewer__children\">\n @for (child of node.children; track child.path) {\n <li>\n <ng-container\n *ngTemplateOutlet=\"nodeTpl; context: { $implicit: child }\"\n />\n </li>\n } @empty {\n <li class=\"mk-json-viewer__empty\">{{ i18n.noData }}</li>\n }\n </ul>\n <span class=\"mk-json-viewer__brace\" aria-hidden=\"true\">{{\n node.type === 'array' ? ']' : '}'\n }}</span>\n }\n </div>\n } @else {\n <div class=\"mk-json-viewer__leaf\">\n @if (node.key !== null) {\n <span class=\"mk-json-viewer__key\">{{ node.key }}</span>\n <span class=\"mk-json-viewer__colon\" aria-hidden=\"true\">:</span>\n }\n <span\n class=\"mk-json-viewer__value\"\n [class.mk-json-viewer__value--string]=\"node.type === 'string'\"\n [class.mk-json-viewer__value--number]=\"node.type === 'number'\"\n [class.mk-json-viewer__value--boolean]=\"node.type === 'boolean'\"\n [class.mk-json-viewer__value--null]=\"\n node.type === 'null' || node.type === 'circular'\n \"\n >{{ node.display }}</span\n >\n </div>\n }\n</ng-template>\n","/** Delegates to `@mk-kit/core` — the exported names are unchanged. */\nexport { mkParseAnsi, mkStripAnsi, type MkAnsiSpan } from '@mk-kit/core';\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n PLATFORM_ID,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkCopyToClipboard } from '@mk-kit/ui/directives';\nimport { type MkAnsiSpan, mkParseAnsi, mkStripAnsi } from './ansi';\n\n/** One render token of a log line: a styled run, optionally a search match. */\nexport interface MkLogToken {\n text: string;\n /** Space-joined `mk-ansi--*` classes ('' for plain text). */\n cls: string;\n /** True when the token is part of a search-query match. */\n mark: boolean;\n}\n\ninterface MkLogLine {\n /** Absolute index within the (ring-buffered) lines. */\n index: number;\n tokens: MkLogToken[];\n}\n\n/** Rows rendered above/below the viewport to smooth fast scrolls. */\nconst OVERSCAN = 6;\n/** Upper bound on the wrap-mode parse cache before it is reset. */\nconst PARSE_CACHE_MAX = 20_000;\n\n/**\n * LogViewer — a virtualized, tail-following log / terminal pane. Renders only\n * the visible window of a (ring-buffered) line array, parses ANSI SGR colour\n * codes into theme-aware spans, follows new output at the bottom until the\n * user scrolls away, and highlights plain-string search matches.\n *\n * ```html\n * <mk-log-viewer\n * [lines]=\"lines()\"\n * [(follow)]=\"follow\"\n * [query]=\"search()\"\n * (matches)=\"count.set($event)\"\n * />\n * ```\n *\n * Wrap mode (`[wrap]=\"true\"` or the toolbar toggle) soft-wraps long lines;\n * because wrapped rows have no fixed height, wrap mode renders **without**\n * virtualization — fine up to a few thousand lines, so keep `maxLines`\n * modest when wrapping is expected.\n *\n * `query` is matched as a case-insensitive plain string — no regex.\n */\n@Component({\n selector: 'mk-log-viewer',\n templateUrl: './log-viewer.html',\n styleUrl: './log-viewer.scss',\n exportAs: 'mkLogViewer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkCopyToClipboard],\n host: { class: 'mk-log-viewer' },\n})\nexport class MkLogViewer {\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly viewportRef =\n viewChild<ElementRef<HTMLElement>>('viewport');\n\n /** The log lines (may contain ANSI SGR escape sequences). */\n readonly lines = input<readonly string[]>([]);\n /** Stick to the bottom as new lines arrive (two-way; detaches on scroll-up). */\n readonly follow = model(true);\n /** Soft-wrap long lines (two-way; disables virtualization — see class docs). */\n readonly wrap = model(false);\n /** Parse ANSI SGR colour codes; `false` renders lines verbatim. */\n readonly ansi = input(true, { transform: booleanAttribute });\n /** Case-insensitive plain-string search; matches are highlighted. */\n readonly query = input('');\n /** Ring buffer size: oldest lines are dropped beyond this. */\n readonly maxLines = input(10_000, { transform: numberAttribute });\n /** Fixed row height in px (drives virtualization; also sets line-height). */\n readonly itemHeight = input(20, { transform: numberAttribute });\n /** Hide the built-in toolbar row. */\n readonly hideToolbar = input(false, { transform: booleanAttribute });\n /** Accessible label of the log region. */\n readonly ariaLabel = input<string>(this.i18n.logViewerLabel, {\n alias: 'aria-label',\n });\n\n /** Emits the total number of `query` matches whenever it changes. */\n readonly matches = output<number>();\n\n // --- Ring buffer ----------------------------------------------------------\n\n /** The lines actually shown: the newest `maxLines` of `lines`. */\n protected readonly buffered = computed<readonly string[]>(() => {\n const lines = this.lines();\n const max = Math.max(1, this.maxLines());\n return lines.length > max ? lines.slice(lines.length - max) : lines;\n });\n\n // --- Virtual window (same technique as MkVirtualScroll) -------------------\n\n protected readonly scrollTop = signal(0);\n protected readonly viewportHeight = signal(0);\n\n protected readonly totalHeight = computed(\n () => this.buffered().length * this.itemHeight(),\n );\n\n private readonly range = computed(\n () => {\n const ih = this.itemHeight() || 1;\n const count = this.buffered().length;\n const visible = Math.ceil(this.viewportHeight() / ih);\n const start = Math.max(0, Math.floor(this.scrollTop() / ih) - OVERSCAN);\n const end = Math.min(count, start + visible + OVERSCAN * 2);\n return { start, end };\n },\n { equal: (a, b) => a.start === b.start && a.end === b.end },\n );\n\n protected readonly offset = computed(\n () => this.range().start * this.itemHeight(),\n );\n\n /** The virtualized window — only ~viewport+overscan lines are parsed. */\n protected readonly visibleLines = computed<MkLogLine[]>(() => {\n const { start, end } = this.range();\n const lines = this.buffered();\n const out: MkLogLine[] = [];\n for (let i = start; i < end; i++) out.push(this.renderLine(lines[i], i, false));\n return out;\n });\n\n /** Wrap mode: every line, non-virtualized (parse memoized per content). */\n protected readonly wrappedLines = computed<MkLogLine[]>(() =>\n this.buffered().map((line, i) => this.renderLine(line, i, true)),\n );\n\n // --- Search ---------------------------------------------------------------\n\n /** Total number of case-insensitive plain-string matches of `query`. */\n readonly matchCount = computed(() => {\n const q = this.query().toLowerCase();\n if (!q) return 0;\n const useAnsi = this.ansi();\n let count = 0;\n for (const raw of this.buffered()) {\n const text = (useAnsi ? mkStripAnsi(raw) : raw).toLowerCase();\n for (let i = text.indexOf(q); i !== -1; i = text.indexOf(q, i + q.length)) {\n count++;\n }\n }\n return count;\n });\n\n // --- Copy -----------------------------------------------------------------\n\n /** The full buffer as plain text (escapes stripped) for copy-all. */\n protected readonly allText = computed(() => {\n const useAnsi = this.ansi();\n return this.buffered()\n .map((line) => (useAnsi ? mkStripAnsi(line) : line))\n .join('\\n');\n });\n\n /**\n * Wrap-mode parse cache, keyed by line content: appending N lines re-parses\n * only the N new ones (duplicate lines share one entry — harmless, spans\n * are immutable render data). Virtual mode skips it: parsing the ~30-row\n * window per render is cheaper than any bookkeeping.\n */\n private readonly parseCache = new Map<string, MkAnsiSpan[]>();\n\n /** Guards against treating our own scrollTop writes as user scrolling. */\n private programmaticScroll = false;\n private resizeObserver?: ResizeObserver;\n\n constructor() {\n afterNextRender(() => {\n this.measure();\n const view = this.viewportRef()?.nativeElement;\n if (view && this.isBrowser && 'ResizeObserver' in window) {\n this.resizeObserver = new ResizeObserver(() => {\n this.measure();\n // Keep the tail pinned when the pane itself resizes.\n if (this.follow()) this.scrollToBottom();\n });\n this.resizeObserver.observe(view);\n }\n });\n\n // Follow mode: pin to the bottom after any render that changed the\n // content (new lines, wrap toggle) or re-enabled follow.\n afterRenderEffect(() => {\n this.buffered();\n this.wrap();\n if (this.follow()) untracked(() => this.scrollToBottom());\n });\n\n // Surface the match count as an output.\n effect(() => this.matches.emit(this.matchCount()));\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n /** Re-enable follow mode and jump to the newest line. */\n protected resumeFollow(): void {\n this.follow.set(true);\n this.scrollToBottom();\n }\n\n protected onScroll(event: Event): void {\n const view = event.target as HTMLElement;\n this.scrollTop.set(view.scrollTop);\n if (this.programmaticScroll) {\n this.programmaticScroll = false;\n return;\n }\n const distance = view.scrollHeight - view.clientHeight - view.scrollTop;\n const threshold = Math.max(this.itemHeight() * 2, 32);\n if (distance > threshold) {\n if (this.follow()) this.follow.set(false);\n } else if (!this.follow()) {\n // Scrolled back to the tail — re-stick, like every log UI.\n this.follow.set(true);\n }\n }\n\n private scrollToBottom(): void {\n const view = this.viewportRef()?.nativeElement;\n if (!view) return;\n const target = view.scrollHeight - view.clientHeight;\n if (view.scrollTop >= target) return; // already at the bottom\n this.programmaticScroll = true;\n view.scrollTop = target;\n this.scrollTop.set(view.scrollTop);\n }\n\n private measure(): void {\n const view = this.viewportRef()?.nativeElement;\n if (view) this.viewportHeight.set(view.clientHeight);\n }\n\n // --- Line rendering -------------------------------------------------------\n\n private parse(raw: string, cached: boolean): MkAnsiSpan[] {\n if (!cached) return mkParseAnsi(raw);\n let spans = this.parseCache.get(raw);\n if (!spans) {\n if (this.parseCache.size >= PARSE_CACHE_MAX) this.parseCache.clear();\n spans = mkParseAnsi(raw);\n this.parseCache.set(raw, spans);\n }\n return spans;\n }\n\n /** Turn one raw line into render tokens (ANSI spans split at matches). */\n private renderLine(raw: string, index: number, cached: boolean): MkLogLine {\n const spans: readonly MkAnsiSpan[] = this.ansi()\n ? this.parse(raw, cached)\n : raw\n ? [{ text: raw, classes: [] }]\n : [];\n\n const q = this.query().toLowerCase();\n const tokens: MkLogToken[] = [];\n\n if (!q) {\n for (const s of spans) {\n if (s.text) tokens.push({ text: s.text, cls: s.classes.join(' '), mark: false });\n }\n } else {\n // Match ranges over the line's plain text…\n const plain = spans.map((s) => s.text).join('');\n const lower = plain.toLowerCase();\n const ranges: [number, number][] = [];\n for (let i = lower.indexOf(q); i !== -1; i = lower.indexOf(q, i + q.length)) {\n ranges.push([i, i + q.length]);\n }\n // …then split each styled span at the range boundaries.\n let offset = 0;\n for (const s of spans) {\n const cls = s.classes.join(' ');\n const start = offset;\n const end = offset + s.text.length;\n let pos = start;\n for (const [rs, re] of ranges) {\n if (re <= start) continue;\n if (rs >= end) break;\n const from = Math.max(rs, start);\n const to = Math.min(re, end);\n if (from > pos) {\n tokens.push({ text: s.text.slice(pos - start, from - start), cls, mark: false });\n }\n tokens.push({ text: s.text.slice(from - start, to - start), cls, mark: true });\n pos = to;\n }\n if (pos < end) {\n tokens.push({ text: s.text.slice(pos - start), cls, mark: false });\n }\n offset = end;\n }\n }\n\n // A blank line still occupies a row (white-space: pre keeps the space).\n if (tokens.length === 0) tokens.push({ text: ' ', cls: '', mark: false });\n return { index, tokens };\n }\n}\n","@if (!hideToolbar()) {\n <div class=\"mk-log-viewer__toolbar\">\n <ng-content />\n <span class=\"mk-log-viewer__toolbar-spacer\"></span>\n <button\n type=\"button\"\n class=\"mk-log-viewer__tool\"\n [class.mk-log-viewer__tool--active]=\"wrap()\"\n [attr.aria-pressed]=\"wrap()\"\n (click)=\"wrap.set(!wrap())\"\n >\n {{ i18n.logWrapLines }}\n </button>\n <button\n type=\"button\"\n class=\"mk-log-viewer__tool\"\n [mkCopyToClipboard]=\"allText()\"\n #copier=\"mkCopyToClipboard\"\n >\n {{ copier.justCopied() ? '✓ ' + i18n.logCopyAll : i18n.logCopyAll }}\n </button>\n </div>\n}\n\n<div class=\"mk-log-viewer__body\">\n <!--\n role=\"log\" makes additions politely announced without re-reading the whole\n buffer; tabindex=\"0\" keeps the overflowing region keyboard-scrollable.\n Tokens are emitted on one line: the rows render `white-space: pre`, so any\n inter-element template whitespace would corrupt log alignment.\n -->\n <div\n #viewport\n class=\"mk-log-viewer__viewport\"\n role=\"log\"\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabel()\"\n (scroll)=\"onScroll($event)\"\n >\n @if (wrap()) {\n <div class=\"mk-log-viewer__lines mk-log-viewer__lines--wrap\">\n @for (line of wrappedLines(); track line.index) {\n <div class=\"mk-log-viewer__line\">@for (t of line.tokens; track $index) {@if (t.mark) {<mark class=\"mk-log-viewer__match {{ t.cls }}\">{{ t.text }}</mark>} @else {<span class=\"{{ t.cls }}\">{{ t.text }}</span>}}</div>\n }\n </div>\n } @else {\n <div class=\"mk-log-viewer__spacer\" [style.height.px]=\"totalHeight()\">\n <div\n class=\"mk-log-viewer__window\"\n [style.transform]=\"'translateY(' + offset() + 'px)'\"\n >\n @for (line of visibleLines(); track line.index) {\n <div\n class=\"mk-log-viewer__line\"\n [style.height.px]=\"itemHeight()\"\n [style.line-height.px]=\"itemHeight()\"\n >@for (t of line.tokens; track $index) {@if (t.mark) {<mark class=\"mk-log-viewer__match {{ t.cls }}\">{{ t.text }}</mark>} @else {<span class=\"{{ t.cls }}\">{{ t.text }}</span>}}</div>\n }\n </div>\n </div>\n }\n </div>\n\n @if (!follow()) {\n <button\n type=\"button\"\n class=\"mk-log-viewer__follow\"\n (click)=\"resumeFollow()\"\n >\n {{ i18n.logFollow }} <span aria-hidden=\"true\">↓</span>\n </button>\n }\n</div>\n\n@if (query()) {\n <span class=\"mk-visually-hidden\" aria-live=\"polite\">\n {{ i18n.resultsCount(matchCount()) }}\n </span>\n}\n","/** Delegates to `@mk-kit/core` — the exported names are unchanged. */\nexport {\n mkParseMarkdown,\n mkRenderMarkdown,\n type MkMarkdownAlign,\n type MkMarkdownBlock,\n type MkMarkdownInline,\n type MkMarkdownList,\n type MkMarkdownListItem,\n type MkMarkdownParseOptions,\n type MkMarkdownRenderOptions,\n} from '@mk-kit/core';\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { mkParseMarkdown, mkRenderMarkdown } from './markdown-parse';\n\n/**\n * Markdown — renders a CommonMark subset (see {@link mkParseMarkdown} for the\n * exact syntax list) with zero runtime dependencies. Built for admin-app\n * content: changelogs, AI output, user notes.\n *\n * SECURITY MODEL: raw HTML in the source is never passed through — it is\n * always escaped and shown as text, and link/image URLs are restricted to\n * http/https/mailto/relative, so the rendered string contains only markup the\n * renderer itself generates. It is bound via `[innerHTML]` and additionally\n * passes through Angular's `DomSanitizer` (no `bypassSecurityTrustHtml`),\n * which keeps every element and attribute the renderer emits.\n *\n * ```html\n * <mk-markdown [source]=\"changelog\" linkTarget=\"_blank\" />\n * ```\n */\n@Component({\n selector: 'mk-markdown',\n templateUrl: './markdown.html',\n styleUrl: './markdown.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // Unencapsulated: the markup arrives via [innerHTML], which emulated\n // encapsulation attributes never reach. Every rule in markdown.scss is\n // namespaced under `.mk-markdown` so nothing leaks.\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mk-markdown' },\n})\nexport class MkMarkdown {\n /** Markdown source text. */\n readonly source = input('');\n /** Turn bare `http(s)://…` URLs into links. Off by default. */\n readonly autolink = input(false, { transform: booleanAttribute });\n /** Link target; `'_blank'` also adds `rel=\"noopener noreferrer\"`. */\n readonly linkTarget = input<'' | '_blank'>('');\n\n /** The rendered (safe-by-construction) HTML string. */\n protected readonly html = computed(() =>\n mkRenderMarkdown(mkParseMarkdown(this.source(), { autolink: this.autolink() }), {\n linkTarget: this.linkTarget(),\n }),\n );\n}\n","<!-- Safe by construction: the renderer escapes all source text, and Angular's\n sanitizer re-checks the markup here (same pattern as mk-code). -->\n<div class=\"mk-markdown__body\" [innerHTML]=\"html()\"></div>\n","/**\n * Data Display components group barrel for @mk-kit/ui.\n * Re-exports every public symbol from each component folder.\n * (Icon, chip and table are their own entry points — import\n * `@mk-kit/ui/icon` / `/chip` / `/table` directly.)\n */\nexport * from './card';\nexport * from './divider';\nexport * from './tag';\nexport * from './avatar';\nexport * from './list';\nexport * from './timeline';\nexport * from './org-chart';\nexport * from './stat-card';\nexport * from './profile-card';\nexport * from './progress-bar';\nexport * from './progress-ring';\nexport * from './charts';\nexport * from './skeleton';\nexport * from './inline-edit';\nexport * from './countdown';\nexport * from './description-list';\nexport * from './code';\nexport * from './virtual-scroll';\nexport * from './carousel';\nexport * from './diff';\nexport * from './qr-code';\nexport * from './json-viewer';\nexport * from './log-viewer';\nexport * from './markdown';\n// Spinner, badge and empty-state moved to `@mk-kit/ui/status` in 0.53 (so\n// `feedback` can use them without depending on this whole group); re-exported\n// here so existing `@mk-kit/ui/data` imports keep working. Kanban moved to\n// `@mk-kit/ui/kanban` and is NOT re-exported — it would pull dnd back in.\nexport * from '@mk-kit/ui/status';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["MARGIN","DOCUMENT"],"mappings":"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"}
|