@mk-kit/ui 0.50.0 → 0.52.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.
@@ -1,7 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, DOCUMENT, ElementRef, viewChild, input, booleanAttribute, output, signal, computed, afterRenderEffect, ChangeDetectionStrategy, Component, model, forwardRef } from '@angular/core';
3
3
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { MK_I18N, MkFieldContext, mkInjectFieldTouched } from '@mk-kit/ui/core';
4
+ import { MK_I18N, MkFieldContext } from '@mk-kit/ui/core';
5
+ import { mkInjectFieldTouched } from '@mk-kit/ui/core/signal-forms';
5
6
 
6
7
  /**
7
8
  * Rich-text engine — an accessible contenteditable surface with a floating
@@ -1 +1 @@
1
- {"version":3,"file":"mk-kit-ui-rich-text.mjs","sources":["../../../projects/mk-kit/rich-text/rich-text-engine.ts","../../../projects/mk-kit/rich-text/rich-text-engine.html","../../../projects/mk-kit/rich-text/sanitize.ts","../../../projects/mk-kit/rich-text/rich-text.ts","../../../projects/mk-kit/rich-text/rich-text.html","../../../projects/mk-kit/rich-text/index.ts","../../../projects/mk-kit/rich-text/mk-kit-ui-rich-text.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n OnDestroy,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** Payload for a split (Enter) event: text before/after the caret. */\nexport interface MkRichTextSplit {\n before: string;\n after: string;\n}\n\n/** A formatting command exposed by the floating toolbar. */\ninterface MkInlineTool {\n id: string;\n label: string;\n icon: string;\n shortcut?: string;\n}\n\n/**\n * Rich-text engine — an accessible contenteditable surface with a floating\n * inline formatting toolbar (Bold, Italic, Underline, Strikethrough, Inline\n * code, Link, Clear). Built on the native Selection API +\n * `document.execCommand` (deprecated but universally supported and\n * dependency-free — the only practical way to do inline formatting without a\n * heavyweight editor engine).\n *\n * This is the low-level building block: it emits HTML via `contentChange`, and\n * structural intents (`splitAt`, `removeEmpty`, `arrowOut`) so a block-editor\n * host can create, merge or navigate blocks. For a standalone form control use\n * {@link MkRichText} (`<mk-rich-text>`), which wraps this engine in a CVA over\n * a sanitised HTML string.\n */\n@Component({\n selector: 'mk-rich-text-engine',\n templateUrl: './rich-text-engine.html',\n styleUrl: './rich-text-engine.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-rich-text' },\n})\nexport class MkRichTextEngine implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly editableRef = viewChild.required<ElementRef<HTMLElement>>('editable');\n protected readonly i18n = inject(MK_I18N);\n /** Pending toolbar-hide delay from `onBlur`; cleared on destroy. */\n private blurTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Current HTML content. */\n readonly html = input<string>('');\n /** Placeholder shown when empty. */\n readonly placeholder = input<string>('');\n /** Disable editing. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Allow soft line breaks (Shift+Enter). Plain Enter always splits. */\n readonly multiline = input(true, { transform: booleanAttribute });\n /**\n * Emit `splitAt` on Enter (block-editor hosts). When `false` — standalone\n * field usage — Enter inserts a line break inside this surface instead.\n */\n readonly splitOnEnter = input(true, { transform: booleanAttribute });\n /** Minimum height of the editable surface (any CSS length). */\n readonly minHeight = input<string | null>(null);\n /** Accessible label for the editable region. */\n readonly ariaLabel = input<string>(this.i18n.blockEditor.editableText);\n /** Id of an external label element, for `aria-labelledby`. */\n readonly labelledBy = input<string | null>(null);\n /** Space-separated id list for `aria-describedby`. */\n readonly describedBy = input<string | null>(null);\n /** Reflect an invalid state via `aria-invalid`. */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /** Fired on every edit with the sanitised-by-construction HTML. */\n readonly contentChange = output<string>();\n /** Enter pressed: `before` stays in this block, `after` starts a new one. */\n readonly splitAt = output<MkRichTextSplit>();\n /** Backspace at the very start of an empty block. */\n readonly removeEmpty = output<void>();\n /** Caret tried to leave the top/bottom edge with an arrow key. */\n readonly arrowOut = output<'up' | 'down'>();\n /** Focus/blur bubbled so the wrapper can show selection chrome. */\n readonly focusChange = output<boolean>();\n\n protected readonly isEmpty = signal(true);\n protected readonly toolbar = signal<{ visible: boolean; top: number; left: number }>({\n visible: false,\n top: 0,\n left: 0,\n });\n protected readonly activeFormats = signal<Set<string>>(new Set());\n\n protected readonly tools: MkInlineTool[] = [\n { id: 'bold', label: this.i18n.blockEditor.bold, icon: 'B', shortcut: 'Ctrl+B' },\n { id: 'italic', label: this.i18n.blockEditor.italic, icon: 'I', shortcut: 'Ctrl+I' },\n { id: 'underline', label: this.i18n.blockEditor.underline, icon: 'U', shortcut: 'Ctrl+U' },\n { id: 'strikeThrough', label: this.i18n.blockEditor.strikethrough, icon: 'S' },\n { id: 'code', label: this.i18n.blockEditor.inlineCode, icon: '</>' },\n { id: 'link', label: this.i18n.blockEditor.link, icon: '🔗' },\n { id: 'clear', label: this.i18n.blockEditor.clearFormatting, icon: '⌫' },\n ];\n\n protected readonly showPlaceholder = computed(() => this.isEmpty());\n\n constructor() {\n // Sync the DOM from the `html` input only when the user is not actively\n // editing this element — otherwise setting innerHTML would reset the caret.\n afterRenderEffect(() => {\n const value = this.html() ?? '';\n const el = this.editableRef().nativeElement;\n if (this.document.activeElement === el) return;\n if (el.innerHTML !== value) el.innerHTML = value;\n this.isEmpty.set(this.computeEmpty(el));\n });\n }\n\n /** Places the caret and focuses (called by the host for navigation). */\n focus(position: 'start' | 'end' = 'end'): void {\n const el = this.editableRef().nativeElement;\n el.focus();\n this.setCaret(el, position);\n }\n\n protected onInput(): void {\n const el = this.editableRef().nativeElement;\n this.isEmpty.set(this.computeEmpty(el));\n this.contentChange.emit(el.innerHTML);\n }\n\n protected onFocus(): void {\n this.focusChange.emit(true);\n }\n\n ngOnDestroy(): void {\n if (this.blurTimer !== null) {\n clearTimeout(this.blurTimer);\n this.blurTimer = null;\n }\n }\n\n protected onBlur(): void {\n this.focusChange.emit(false);\n // Hide the toolbar on a delay, but only if focus really left the\n // component — Tabbing into the toolbar itself must not dismiss it.\n if (this.blurTimer !== null) clearTimeout(this.blurTimer);\n this.blurTimer = setTimeout(() => {\n this.blurTimer = null;\n const active = this.document.activeElement;\n if (active && this.host.nativeElement.contains(active)) return;\n this.toolbar.update((t) => (t.visible ? { ...t, visible: false } : t));\n }, 150);\n }\n\n protected onSelectionChange(): void {\n this.updateToolbar();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n const el = this.editableRef().nativeElement;\n\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (this.splitOnEnter()) this.emitSplit(el);\n else this.insertLineBreak();\n return;\n }\n // Shift+Enter in single-line mode is a hard split too.\n if (event.key === 'Enter' && event.shiftKey && !this.multiline()) {\n event.preventDefault();\n if (this.splitOnEnter()) this.emitSplit(el);\n else this.insertLineBreak();\n return;\n }\n if (event.key === 'Backspace' && this.isCaretAtStart(el) && this.isSelectionCollapsed()) {\n if (this.computeEmpty(el)) {\n event.preventDefault();\n this.removeEmpty.emit();\n }\n return;\n }\n if (event.key === 'ArrowUp' && this.isCaretAtStart(el) && this.isSelectionCollapsed()) {\n event.preventDefault();\n this.arrowOut.emit('up');\n return;\n }\n if (event.key === 'ArrowDown' && this.isCaretAtEnd(el) && this.isSelectionCollapsed()) {\n event.preventDefault();\n this.arrowOut.emit('down');\n return;\n }\n }\n\n /** Escape inside the toolbar returns focus to the text; arrows move tools. */\n protected onToolbarKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.toolbar.update((t) => ({ ...t, visible: false }));\n this.editableRef().nativeElement.focus();\n return;\n }\n if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {\n const bar = event.currentTarget as HTMLElement;\n const buttons = Array.from(bar.querySelectorAll<HTMLButtonElement>('.mk-rich-text__tool'));\n const current = buttons.indexOf(this.document.activeElement as HTMLButtonElement);\n if (current === -1 || buttons.length === 0) return;\n event.preventDefault();\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n buttons[(current + delta + buttons.length) % buttons.length].focus();\n }\n }\n\n /** Runs a toolbar command, keeping the model + toolbar state in sync. */\n protected runTool(id: string): void {\n const el = this.editableRef().nativeElement;\n el.focus();\n switch (id) {\n case 'bold':\n case 'italic':\n case 'underline':\n case 'strikeThrough':\n this.document.execCommand(id);\n break;\n case 'code':\n this.wrapInlineCode();\n break;\n case 'link':\n this.applyLink();\n break;\n case 'clear':\n this.document.execCommand('removeFormat');\n this.document.execCommand('unlink');\n break;\n }\n this.onInput();\n this.updateToolbar();\n }\n\n protected isActive(id: string): boolean {\n return this.activeFormats().has(id);\n }\n\n // --- internals ------------------------------------------------------------\n\n private emitSplit(el: HTMLElement): void {\n const { before, after } = this.splitHtmlAtCaret(el);\n this.splitAt.emit({ before, after });\n }\n\n /** Inserts a `<br>` at the caret (Enter in `splitOnEnter=false` mode). */\n private insertLineBreak(): void {\n // insertHTML keeps the markup to the sanitiser's allow-list (`<br>`),\n // unlike the browser's default Enter handling which wraps lines in divs.\n this.document.execCommand('insertHTML', false, '<br>');\n this.onInput();\n }\n\n /** Extracts markup after the caret so the host can start a new block with it. */\n private splitHtmlAtCaret(el: HTMLElement): MkRichTextSplit {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return { before: el.innerHTML, after: '' };\n }\n const range = selection.getRangeAt(0);\n const tail = range.cloneRange();\n tail.selectNodeContents(el);\n tail.setStart(range.endContainer, range.endOffset);\n const fragment = tail.cloneContents();\n const holder = this.document.createElement('div');\n holder.appendChild(fragment);\n const after = holder.innerHTML;\n\n const head = range.cloneRange();\n head.selectNodeContents(el);\n head.setEnd(range.startContainer, range.startOffset);\n const headHolder = this.document.createElement('div');\n headHolder.appendChild(head.cloneContents());\n const before = headHolder.innerHTML;\n return { before, after };\n }\n\n private wrapInlineCode(): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0 || selection.isCollapsed) return;\n const range = selection.getRangeAt(0);\n const code = this.document.createElement('code');\n try {\n range.surroundContents(code);\n } catch {\n // Selection crosses element boundaries — fall back to insertHTML.\n const html = range.toString();\n this.document.execCommand('insertHTML', false, `<code>${escapeText(html)}</code>`);\n }\n }\n\n private applyLink(): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.isCollapsed) return;\n const url = this.document.defaultView?.prompt(\n this.i18n.blockEditor.linkUrlPrompt,\n 'https://',\n );\n if (url == null) return;\n const trimmed = url.trim();\n if (trimmed === '') {\n this.document.execCommand('unlink');\n return;\n }\n if (!/^(https?:|mailto:|tel:|\\/|#)/i.test(trimmed)) return; // block javascript: etc.\n this.document.execCommand('createLink', false, trimmed);\n }\n\n private updateToolbar(): void {\n const el = this.editableRef().nativeElement;\n const selection = this.document.defaultView?.getSelection();\n if (\n this.disabled() ||\n !selection ||\n selection.rangeCount === 0 ||\n selection.isCollapsed ||\n !el.contains(selection.anchorNode)\n ) {\n this.toolbar.update((t) => (t.visible ? { ...t, visible: false } : t));\n return;\n }\n const rect = selection.getRangeAt(0).getBoundingClientRect();\n const host = el.getBoundingClientRect();\n this.toolbar.set({\n visible: true,\n top: rect.top - host.top - 8,\n left: rect.left - host.left + rect.width / 2,\n });\n const active = new Set<string>();\n for (const id of ['bold', 'italic', 'underline', 'strikeThrough']) {\n try {\n if (this.document.queryCommandState(id)) active.add(id);\n } catch {\n /* queryCommandState can throw in some engines */\n }\n }\n this.activeFormats.set(active);\n }\n\n private computeEmpty(el: HTMLElement): boolean {\n const text = el.textContent?.trim() ?? '';\n return text === '' && !el.querySelector('img, hr, iframe');\n }\n\n private setCaret(el: HTMLElement, position: 'start' | 'end'): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection) return;\n const range = this.document.createRange();\n range.selectNodeContents(el);\n range.collapse(position === 'start');\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n private isSelectionCollapsed(): boolean {\n return this.document.defaultView?.getSelection()?.isCollapsed ?? true;\n }\n\n private isCaretAtStart(el: HTMLElement): boolean {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0).cloneRange();\n range.selectNodeContents(el);\n range.setEnd(selection.anchorNode!, selection.anchorOffset);\n return range.toString().length === 0;\n }\n\n private isCaretAtEnd(el: HTMLElement): boolean {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0).cloneRange();\n range.selectNodeContents(el);\n range.setStart(selection.anchorNode!, selection.anchorOffset);\n return range.toString().length === 0;\n }\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n","@if (toolbar().visible && !disabled()) {\n <div\n class=\"mk-rich-text__toolbar\"\n role=\"toolbar\"\n [attr.aria-label]=\"i18n.blockEditor.textFormatting\"\n [style.top.px]=\"toolbar().top\"\n [style.left.px]=\"toolbar().left\"\n (keydown)=\"onToolbarKeydown($event)\"\n >\n @for (tool of tools; track tool.id) {\n <button\n type=\"button\"\n class=\"mk-rich-text__tool\"\n [class.mk-rich-text__tool--active]=\"isActive(tool.id)\"\n [class.mk-rich-text__tool--code]=\"tool.id === 'code'\"\n [attr.aria-pressed]=\"isActive(tool.id)\"\n [attr.aria-label]=\"tool.label + (tool.shortcut ? ' (' + tool.shortcut + ')' : '')\"\n [title]=\"tool.label\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"runTool(tool.id)\"\n >\n {{ tool.icon }}\n </button>\n }\n </div>\n}\n\n<div\n #editable\n class=\"mk-rich-text__editable\"\n data-mk-editable\n role=\"textbox\"\n aria-multiline=\"true\"\n [attr.aria-label]=\"labelledBy() ? null : ariaLabel()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n [attr.contenteditable]=\"disabled() ? null : 'true'\"\n [attr.data-placeholder]=\"placeholder()\"\n [style.min-height]=\"minHeight()\"\n [class.mk-rich-text__editable--empty]=\"showPlaceholder()\"\n (input)=\"onInput()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n (keyup)=\"onSelectionChange()\"\n (mouseup)=\"onSelectionChange()\"\n></div>\n","/**\n * Allow-list sanitiser for inline rich-text HTML — the security backbone of\n * both `<mk-rich-text>` and the block editor's text blocks.\n *\n * SECURITY MODEL: rich-text surfaces store HTML authored through the editor's\n * restricted formatting commands. Before that markup is emitted, persisted or\n * re-rendered it is passed through {@link sanitizeInlineHtml}, an allow-list\n * cleaner that strips scripts, event handlers and dangerous URLs. Angular's\n * `DomSanitizer` re-sanitises at display time where applicable. This module is\n * dependency-free so it can run on a server (SSG/SSR) — never feed its output\n * back into `innerHTML` without sanitising again.\n */\n\nconst ALLOWED_INLINE_TAGS = new Set([\n 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'code', 'a', 'br', 'span', 'mark', 'sub', 'sup',\n]);\n\n/** Escapes a value for safe placement in a double-quoted attribute. */\nfunction escapeAttr(value: string): string {\n return String(value ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/** True for URL schemes safe to place in `href`/`src`. */\nfunction isSafeUrl(url: string): boolean {\n const trimmed = String(url ?? '').trim();\n if (trimmed === '') return false;\n // Allow relative, http(s), mailto, tel and data:image.\n if (/^(https?:|mailto:|tel:)/i.test(trimmed)) return true;\n if (/^data:image\\//i.test(trimmed)) return true;\n if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) return false; // any other scheme\n return true; // relative / anchor / protocol-relative-ish\n}\n\n/**\n * Allow-list cleaner for inline rich text. Keeps a small set of formatting\n * tags, strips everything else's tags (preserving their text), removes event\n * handler attributes and unsafe `href`s. Not a substitute for `DomSanitizer`,\n * but makes the serialised string safe by construction.\n */\nexport function sanitizeInlineHtml(html: string): string {\n if (!html) return '';\n let out = String(html);\n // Drop script/style blocks entirely.\n out = out.replace(/<\\s*(script|style)[\\s\\S]*?<\\s*\\/\\s*\\1\\s*>/gi, '');\n // Rewrite each tag: keep allow-listed ones with a scrubbed attribute set.\n out = out.replace(/<\\/?[a-z][a-z0-9]*\\b[^>]*>/gi, (tag) => {\n const closing = /^<\\s*\\//.test(tag);\n const name = (tag.match(/^<\\s*\\/?\\s*([a-z0-9]+)/i)?.[1] ?? '').toLowerCase();\n if (!ALLOWED_INLINE_TAGS.has(name)) return '';\n if (closing) return `</${name}>`;\n if (name === 'a') {\n const href = tag.match(/\\shref\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/i);\n const url = href?.[1] ?? href?.[2] ?? '';\n if (url && isSafeUrl(url)) {\n return `<a href=\"${escapeAttr(url)}\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">`;\n }\n return '<a>';\n }\n return `<${name}>`;\n });\n return out;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\nimport { MK_I18N, MkFieldContext } from '@mk-kit/ui/core';\nimport { mkInjectFieldTouched } from '@mk-kit/ui/core';\nimport { MkRichTextEngine } from './rich-text-engine';\nimport { sanitizeInlineHtml } from './sanitize';\n\n/**\n * Rich text — a small WYSIWYG form control over a sanitised HTML string, for\n * single \"description\"-style fields where the full block editor is overkill.\n * Renders a textarea-like surface with the floating inline formatting toolbar\n * (Bold, Italic, Underline, Strikethrough, Inline code, Link, Clear) on text\n * selection; Enter inserts a line break.\n *\n * Implements `ControlValueAccessor` with a two-way `value` model, so it works\n * with `[(ngModel)]`, reactive forms and `[(value)]`. Every value — written or\n * emitted — passes through {@link sanitizeInlineHtml}, and a visually empty\n * surface (whitespace / lone `<br>`s) normalises to `''` so `required`\n * validation behaves.\n *\n * ```html\n * <mk-rich-text [(ngModel)]=\"description\" placeholder=\"Describe it…\" />\n * <mk-rich-text [(value)]=\"html\" minHeight=\"8rem\" />\n * ```\n */\n@Component({\n selector: 'mk-rich-text',\n templateUrl: './rich-text.html',\n styleUrl: './rich-text.scss',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-rich-text-field',\n '[class.mk-rich-text-field--disabled]': 'isDisabled()',\n '[class.mk-rich-text-field--invalid]': 'isInvalid()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MkRichText),\n multi: true,\n },\n ],\n})\nexport class MkRichText implements ControlValueAccessor {\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 private readonly i18n = inject(MK_I18N);\n\n /** Two-way HTML string value (sanitised; `''` when visually empty). */\n readonly value = model<string>('');\n /** Placeholder shown when empty. */\n readonly placeholder = input<string>('');\n /** Disable the control. */\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 /** Minimum height of the editable area (any CSS length). */\n readonly minHeight = input<string>('4.5em');\n /** Accessible label when not labelled by an `mk-form-field`. */\n readonly ariaLabel = input<string>('', { alias: 'aria-label' });\n\n private readonly cvaDisabled = signal(false);\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n protected readonly isInvalid = computed(\n () => (this.invalid() && this.fieldTouched()) || (this.field?.hasError() ?? false),\n );\n protected readonly labelledBy = this.field?.labelId ?? null;\n protected readonly describedBy = computed(() => this.field?.describedBy() ?? null);\n protected readonly effectiveAriaLabel = computed(\n () => this.ariaLabel() || this.i18n.blockEditor.editableText,\n );\n\n /** Sanitised view of the model, rendered into the engine. */\n protected readonly safeHtml = computed(() => sanitizeInlineHtml(this.value()));\n\n /** User edit: sanitise, normalise the empty state, propagate. */\n protected onContentChange(html: string): void {\n const value = normalizeRichTextValue(html);\n this.value.set(value);\n this.onChange(value);\n }\n\n protected onFocusChange(focused: boolean): void {\n if (!focused) this.onTouched();\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n writeValue(value: unknown): void {\n this.value.set(normalizeRichTextValue(value == null ? '' : String(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\n/**\n * Sanitises an HTML string and collapses visually empty markup (whitespace,\n * `&nbsp;`s, lone `<br>`s and empty formatting tags) to `''`.\n */\nfunction normalizeRichTextValue(html: string): string {\n const sanitized = sanitizeInlineHtml(html);\n const text = sanitized\n .replace(/<[^>]*>/g, '')\n .replace(/&nbsp;/gi, ' ')\n .trim();\n return text === '' ? '' : sanitized;\n}\n","<mk-rich-text-engine\n [html]=\"safeHtml()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [splitOnEnter]=\"false\"\n [minHeight]=\"minHeight()\"\n [ariaLabel]=\"effectiveAriaLabel()\"\n [labelledBy]=\"labelledBy\"\n [describedBy]=\"describedBy()\"\n [invalid]=\"isInvalid()\"\n (contentChange)=\"onContentChange($event)\"\n (focusChange)=\"onFocusChange($event)\"\n/>\n","/**\n * RICH TEXT entry for @mk-kit/ui.\n *\n * A small WYSIWYG form control (`<mk-rich-text>`) over a sanitised HTML\n * string, plus the low-level contenteditable engine and the allow-list\n * sanitiser it is built on. The block editor composes the same engine for its\n * paragraph, heading, quote and list blocks.\n *\n * NOTE: this barrel deliberately does not export an HTML-escape helper — the\n * block-editor entry exports `mkEscapeHtml` and the root umbrella re-exports\n * both entries.\n */\nexport { MkRichText } from './rich-text';\nexport { MkRichTextEngine, type MkRichTextSplit } from './rich-text-engine';\nexport { sanitizeInlineHtml } from './sanitize';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AA+BA;;;;;;;;;;;;;AAaG;MAQU,gBAAgB,CAAA;AACV,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;AAClD,IAAA,WAAW,GAAG,SAAS,CAAC,QAAQ,CAA0B,UAAU;oFAAC;AACnE,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;IAEjC,SAAS,GAAyC,IAAI;;IAGrD,IAAI,GAAG,KAAK,CAAS,EAAE;6EAAC;;IAExB,WAAW,GAAG,KAAK,CAAS,EAAE;oFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,SAAS,GAAG,KAAK,CAAC,IAAI,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACjE;;;AAGG;IACM,YAAY,GAAG,KAAK,CAAC,IAAI,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAE3D,SAAS,GAAG,KAAK,CAAgB,IAAI;kFAAC;;IAEtC,SAAS,GAAG,KAAK,CAAS,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY;kFAAC;;IAE7D,UAAU,GAAG,KAAK,CAAgB,IAAI;mFAAC;;IAEvC,WAAW,GAAG,KAAK,CAAgB,IAAI;oFAAC;;IAExC,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGvD,aAAa,GAAG,MAAM,EAAU;;IAEhC,OAAO,GAAG,MAAM,EAAmB;;IAEnC,WAAW,GAAG,MAAM,EAAQ;;IAE5B,QAAQ,GAAG,MAAM,EAAiB;;IAElC,WAAW,GAAG,MAAM,EAAW;IAErB,OAAO,GAAG,MAAM,CAAC,IAAI;gFAAC;IACtB,OAAO,GAAG,MAAM,CAAkD;AACnF,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,IAAI,EAAE,CAAC;AACR,KAAA;gFAAC;AACiB,IAAA,aAAa,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE;sFAAC;AAE9C,IAAA,KAAK,GAAmB;QACzC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;QAChF,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACpF,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAC1F,QAAA,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE;AAC9E,QAAA,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;AACpE,QAAA,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAC7D,QAAA,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE;KACzE;IAEkB,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE;wFAAC;AAEnE,IAAA,WAAA,GAAA;;;QAGE,iBAAiB,CAAC,MAAK;YACrB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,aAAa;AAC3C,YAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,EAAE;gBAAE;AACxC,YAAA,IAAI,EAAE,CAAC,SAAS,KAAK,KAAK;AAAE,gBAAA,EAAE,CAAC,SAAS,GAAG,KAAK;AAChD,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;AACzC,QAAA,CAAC,CAAC;IACJ;;IAGA,KAAK,CAAC,WAA4B,KAAK,EAAA;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,aAAa;QAC3C,EAAE,CAAC,KAAK,EAAE;AACV,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAC7B;IAEU,OAAO,GAAA;QACf,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,aAAa;AAC3C,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;IACvC;IAEU,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;IACF;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;;;AAG5B,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AACzD,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC1C,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE;AACxD,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACxE,CAAC,EAAE,GAAG,CAAC;IACT;IAEU,iBAAiB,GAAA;QACzB,IAAI,CAAC,aAAa,EAAE;IACtB;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,aAAa;QAE3C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC5C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,gBAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;;gBACtC,IAAI,CAAC,eAAe,EAAE;YAC3B;QACF;;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YAChE,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,gBAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;;gBACtC,IAAI,CAAC,eAAe,EAAE;YAC3B;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AACvF,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE;gBACzB,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;YACzB;YACA;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;YACrF,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;YACrF,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B;QACF;IACF;;AAGU,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AAC7C,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;YACxC;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;AAC3D,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,aAA4B;AAC9C,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAoB,qBAAqB,CAAC,CAAC;AAC1F,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAkC,CAAC;YACjF,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE;YAC5C,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;AACjD,YAAA,OAAO,CAAC,CAAC,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE;QACtE;IACF;;AAGU,IAAA,OAAO,CAAC,EAAU,EAAA;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,aAAa;QAC3C,EAAE,CAAC,KAAK,EAAE;QACV,QAAQ,EAAE;AACR,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,eAAe;AAClB,gBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B;AACF,YAAA,KAAK,MAAM;gBACT,IAAI,CAAC,cAAc,EAAE;gBACrB;AACF,YAAA,KAAK,MAAM;gBACT,IAAI,CAAC,SAAS,EAAE;gBAChB;AACF,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC;AACzC,gBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC;gBACnC;;QAEJ,IAAI,CAAC,OAAO,EAAE;QACd,IAAI,CAAC,aAAa,EAAE;IACtB;AAEU,IAAA,QAAQ,CAAC,EAAU,EAAA;QAC3B,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACrC;;AAIQ,IAAA,SAAS,CAAC,EAAe,EAAA;AAC/B,QAAA,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACtC;;IAGQ,eAAe,GAAA;;;QAGrB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC;QACtD,IAAI,CAAC,OAAO,EAAE;IAChB;;AAGQ,IAAA,gBAAgB,CAAC,EAAe,EAAA;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE;QAC3D,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,CAAC,EAAE;YAC5C,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5C;QACA,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AACrC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE;AAC/B,QAAA,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC;AAClD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACjD,QAAA,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC5B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS;AAE9B,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE;AAC/B,QAAA,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QACrD,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AAC5C,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS;AACnC,QAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;IAC1B;IAEQ,cAAc,GAAA;QACpB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE;QAC3D,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,CAAC,IAAI,SAAS,CAAC,WAAW;YAAE;QACvE,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AAChD,QAAA,IAAI;AACF,YAAA,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAC9B;AAAE,QAAA,MAAM;;AAEN,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE;AAC7B,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE,CAAA,MAAA,EAAS,UAAU,CAAC,IAAI,CAAC,CAAA,OAAA,CAAS,CAAC;QACpF;IACF;IAEQ,SAAS,GAAA;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE;AAC3D,QAAA,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,WAAW;YAAE;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EACnC,UAAU,CACX;QACD,IAAI,GAAG,IAAI,IAAI;YAAE;AACjB,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE;AAC1B,QAAA,IAAI,OAAO,KAAK,EAAE,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC;YACnC;QACF;AACA,QAAA,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO;QAC3D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC;IACzD;IAEQ,aAAa,GAAA;QACnB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,aAAa;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE;QAC3D,IACE,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,CAAC,SAAS;YACV,SAAS,CAAC,UAAU,KAAK,CAAC;AAC1B,YAAA,SAAS,CAAC,WAAW;YACrB,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAClC;AACA,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YACtE;QACF;QACA,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE;AAC5D,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE;AACvC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AACf,YAAA,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;AAC5B,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;AAC7C,SAAA,CAAC;AACF,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU;AAChC,QAAA,KAAK,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE;AACjE,YAAA,IAAI;AACF,gBAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;AAAE,oBAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD;AAAE,YAAA,MAAM;;YAER;QACF;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;IAChC;AAEQ,IAAA,YAAY,CAAC,EAAe,EAAA;QAClC,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;QACzC,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC;IAC5D;IAEQ,QAAQ,CAAC,EAAe,EAAE,QAAyB,EAAA;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE;AAC3D,QAAA,IAAI,CAAC,SAAS;YAAE;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;AACzC,QAAA,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;AAC5B,QAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC;QACpC,SAAS,CAAC,eAAe,EAAE;AAC3B,QAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC3B;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE,WAAW,IAAI,IAAI;IACvE;AAEQ,IAAA,cAAc,CAAC,EAAe,EAAA;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE;AAC3D,QAAA,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE;AAClD,QAAA,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,UAAW,EAAE,SAAS,CAAC,YAAY,CAAC;QAC3D,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,KAAK,CAAC;IACtC;AAEQ,IAAA,YAAY,CAAC,EAAe,EAAA;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE;AAC3D,QAAA,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE;AAClD,QAAA,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAW,EAAE,SAAS,CAAC,YAAY,CAAC;QAC7D,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,KAAK,CAAC;IACtC;uGAlVW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,qrDCpD7B,gkDAgDA,EAAA,MAAA,EAAA,CAAA,k+DAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDIa,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;+BACE,qBAAqB,EAAA,eAAA,EAGd,uBAAuB,CAAC,MAAM,QACzC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAA,QAAA,EAAA,gkDAAA,EAAA,MAAA,EAAA,CAAA,k+DAAA,CAAA,EAAA;mGAK4C,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;AAkVvF,SAAS,UAAU,CAAC,KAAa,EAAA;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;AACjF;;AE3YA;;;;;;;;;;;AAWG;AAEH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;AAC9F,CAAA,CAAC;AAEF;AACA,SAAS,UAAU,CAAC,KAAa,EAAA;AAC/B,IAAA,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE;AACtB,SAAA,OAAO,CAAC,IAAI,EAAE,OAAO;AACrB,SAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,SAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,SAAA,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC5B;AAEA;AACA,SAAS,SAAS,CAAC,GAAW,EAAA;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;IACxC,IAAI,OAAO,KAAK,EAAE;AAAE,QAAA,OAAO,KAAK;;AAEhC,IAAA,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC;AAAE,QAAA,OAAO,IAAI;AACzD,IAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;AAAE,QAAA,OAAO,IAAI;AAC/C,IAAA,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,OAAO,IAAI,CAAC;AACd;AAEA;;;;;AAKG;AACG,SAAU,kBAAkB,CAAC,IAAY,EAAA;AAC7C,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,EAAE;AACpB,IAAA,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;;IAEtB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,6CAA6C,EAAE,EAAE,CAAC;;IAEpE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC,GAAG,KAAI;QACxD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AACnC,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE;AAC5E,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,EAAE;AAC7C,QAAA,IAAI,OAAO;YAAE,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAG;AAChC,QAAA,IAAI,IAAI,KAAK,GAAG,EAAE;YAChB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,uCAAuC,CAAC;AAC/D,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE;AACxC,YAAA,IAAI,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE;AACzB,gBAAA,OAAO,YAAY,UAAU,CAAC,GAAG,CAAC,uDAAuD;YAC3F;AACA,YAAA,OAAO,KAAK;QACd;QACA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG;AACpB,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,GAAG;AACZ;;AChDA;;;;;;;;;;;;;;;;;AAiBG;MAoBU,UAAU,CAAA;IACJ,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;IAElD,YAAY,GAAG,oBAAoB,EAAE;AACrC,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;IAG9B,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;;IAEzB,WAAW,GAAG,KAAK,CAAS,EAAE;oFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEvD,SAAS,GAAG,KAAK,CAAS,OAAO;kFAAC;;IAElC,SAAS,GAAG,KAAK,CAAS,EAAE,iFAAI,KAAK,EAAE,YAAY,EAAA,CAAG;IAE9C,WAAW,GAAG,MAAM,CAAC,KAAK;oFAAC;AACpC,IAAA,QAAQ,GAA4B,MAAK,EAAE,CAAC;AAC5C,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAErB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE;mFAAC;IAClE,SAAS,GAAG,QAAQ,CACrC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,KAAK,CAAC;kFACnF;IACkB,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI;AACxC,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,IAAI;oFAAC;AAC/D,IAAA,kBAAkB,GAAG,QAAQ,CAC9C,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY;2FAC7D;;AAGkB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;iFAAC;;AAGpE,IAAA,eAAe,CAAC,IAAY,EAAA;AACpC,QAAA,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC;AAC1C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtB;AAEU,IAAA,aAAa,CAAC,OAAgB,EAAA;AACtC,QAAA,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,SAAS,EAAE;IAChC;;AAGA,IAAA,UAAU,CAAC,KAAc,EAAA;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E;AACA,IAAA,gBAAgB,CAAC,EAA2B,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AACA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;IAClC;uGA3DW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oCAAA,EAAA,cAAA,EAAA,mCAAA,EAAA,aAAA,EAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,EAAA,SAAA,EARV;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,UAAU,CAAC;AACzC,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpDH,mZAaA,+oCD0BY,gBAAgB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAef,UAAU,EAAA,UAAA,EAAA,CAAA;kBAnBtB,SAAS;+BACE,cAAc,EAAA,OAAA,EAGf,CAAC,gBAAgB,CAAC,mBACV,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,oBAAoB;AAC3B,wBAAA,sCAAsC,EAAE,cAAc;AACtD,wBAAA,qCAAqC,EAAE,aAAa;qBACrD,EAAA,SAAA,EACU;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC;AACzC,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,mZAAA,EAAA,MAAA,EAAA,CAAA,ulCAAA,CAAA,EAAA;;AAgEH;;;AAGG;AACH,SAAS,sBAAsB,CAAC,IAAY,EAAA;AAC1C,IAAA,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG;AACV,SAAA,OAAO,CAAC,UAAU,EAAE,EAAE;AACtB,SAAA,OAAO,CAAC,UAAU,EAAE,GAAG;AACvB,SAAA,IAAI,EAAE;IACT,OAAO,IAAI,KAAK,EAAE,GAAG,EAAE,GAAG,SAAS;AACrC;;AE/HA;;;;;;;;;;;AAWG;;ACXH;;AAEG;;;;"}
1
+ {"version":3,"file":"mk-kit-ui-rich-text.mjs","sources":["../../../projects/mk-kit/rich-text/rich-text-engine.ts","../../../projects/mk-kit/rich-text/rich-text-engine.html","../../../projects/mk-kit/rich-text/sanitize.ts","../../../projects/mk-kit/rich-text/rich-text.ts","../../../projects/mk-kit/rich-text/rich-text.html","../../../projects/mk-kit/rich-text/index.ts","../../../projects/mk-kit/rich-text/mk-kit-ui-rich-text.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n OnDestroy,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** Payload for a split (Enter) event: text before/after the caret. */\nexport interface MkRichTextSplit {\n before: string;\n after: string;\n}\n\n/** A formatting command exposed by the floating toolbar. */\ninterface MkInlineTool {\n id: string;\n label: string;\n icon: string;\n shortcut?: string;\n}\n\n/**\n * Rich-text engine — an accessible contenteditable surface with a floating\n * inline formatting toolbar (Bold, Italic, Underline, Strikethrough, Inline\n * code, Link, Clear). Built on the native Selection API +\n * `document.execCommand` (deprecated but universally supported and\n * dependency-free — the only practical way to do inline formatting without a\n * heavyweight editor engine).\n *\n * This is the low-level building block: it emits HTML via `contentChange`, and\n * structural intents (`splitAt`, `removeEmpty`, `arrowOut`) so a block-editor\n * host can create, merge or navigate blocks. For a standalone form control use\n * {@link MkRichText} (`<mk-rich-text>`), which wraps this engine in a CVA over\n * a sanitised HTML string.\n */\n@Component({\n selector: 'mk-rich-text-engine',\n templateUrl: './rich-text-engine.html',\n styleUrl: './rich-text-engine.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-rich-text' },\n})\nexport class MkRichTextEngine implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly editableRef = viewChild.required<ElementRef<HTMLElement>>('editable');\n protected readonly i18n = inject(MK_I18N);\n /** Pending toolbar-hide delay from `onBlur`; cleared on destroy. */\n private blurTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Current HTML content. */\n readonly html = input<string>('');\n /** Placeholder shown when empty. */\n readonly placeholder = input<string>('');\n /** Disable editing. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Allow soft line breaks (Shift+Enter). Plain Enter always splits. */\n readonly multiline = input(true, { transform: booleanAttribute });\n /**\n * Emit `splitAt` on Enter (block-editor hosts). When `false` — standalone\n * field usage — Enter inserts a line break inside this surface instead.\n */\n readonly splitOnEnter = input(true, { transform: booleanAttribute });\n /** Minimum height of the editable surface (any CSS length). */\n readonly minHeight = input<string | null>(null);\n /** Accessible label for the editable region. */\n readonly ariaLabel = input<string>(this.i18n.blockEditor.editableText);\n /** Id of an external label element, for `aria-labelledby`. */\n readonly labelledBy = input<string | null>(null);\n /** Space-separated id list for `aria-describedby`. */\n readonly describedBy = input<string | null>(null);\n /** Reflect an invalid state via `aria-invalid`. */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /** Fired on every edit with the sanitised-by-construction HTML. */\n readonly contentChange = output<string>();\n /** Enter pressed: `before` stays in this block, `after` starts a new one. */\n readonly splitAt = output<MkRichTextSplit>();\n /** Backspace at the very start of an empty block. */\n readonly removeEmpty = output<void>();\n /** Caret tried to leave the top/bottom edge with an arrow key. */\n readonly arrowOut = output<'up' | 'down'>();\n /** Focus/blur bubbled so the wrapper can show selection chrome. */\n readonly focusChange = output<boolean>();\n\n protected readonly isEmpty = signal(true);\n protected readonly toolbar = signal<{ visible: boolean; top: number; left: number }>({\n visible: false,\n top: 0,\n left: 0,\n });\n protected readonly activeFormats = signal<Set<string>>(new Set());\n\n protected readonly tools: MkInlineTool[] = [\n { id: 'bold', label: this.i18n.blockEditor.bold, icon: 'B', shortcut: 'Ctrl+B' },\n { id: 'italic', label: this.i18n.blockEditor.italic, icon: 'I', shortcut: 'Ctrl+I' },\n { id: 'underline', label: this.i18n.blockEditor.underline, icon: 'U', shortcut: 'Ctrl+U' },\n { id: 'strikeThrough', label: this.i18n.blockEditor.strikethrough, icon: 'S' },\n { id: 'code', label: this.i18n.blockEditor.inlineCode, icon: '</>' },\n { id: 'link', label: this.i18n.blockEditor.link, icon: '🔗' },\n { id: 'clear', label: this.i18n.blockEditor.clearFormatting, icon: '⌫' },\n ];\n\n protected readonly showPlaceholder = computed(() => this.isEmpty());\n\n constructor() {\n // Sync the DOM from the `html` input only when the user is not actively\n // editing this element — otherwise setting innerHTML would reset the caret.\n afterRenderEffect(() => {\n const value = this.html() ?? '';\n const el = this.editableRef().nativeElement;\n if (this.document.activeElement === el) return;\n if (el.innerHTML !== value) el.innerHTML = value;\n this.isEmpty.set(this.computeEmpty(el));\n });\n }\n\n /** Places the caret and focuses (called by the host for navigation). */\n focus(position: 'start' | 'end' = 'end'): void {\n const el = this.editableRef().nativeElement;\n el.focus();\n this.setCaret(el, position);\n }\n\n protected onInput(): void {\n const el = this.editableRef().nativeElement;\n this.isEmpty.set(this.computeEmpty(el));\n this.contentChange.emit(el.innerHTML);\n }\n\n protected onFocus(): void {\n this.focusChange.emit(true);\n }\n\n ngOnDestroy(): void {\n if (this.blurTimer !== null) {\n clearTimeout(this.blurTimer);\n this.blurTimer = null;\n }\n }\n\n protected onBlur(): void {\n this.focusChange.emit(false);\n // Hide the toolbar on a delay, but only if focus really left the\n // component — Tabbing into the toolbar itself must not dismiss it.\n if (this.blurTimer !== null) clearTimeout(this.blurTimer);\n this.blurTimer = setTimeout(() => {\n this.blurTimer = null;\n const active = this.document.activeElement;\n if (active && this.host.nativeElement.contains(active)) return;\n this.toolbar.update((t) => (t.visible ? { ...t, visible: false } : t));\n }, 150);\n }\n\n protected onSelectionChange(): void {\n this.updateToolbar();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n const el = this.editableRef().nativeElement;\n\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (this.splitOnEnter()) this.emitSplit(el);\n else this.insertLineBreak();\n return;\n }\n // Shift+Enter in single-line mode is a hard split too.\n if (event.key === 'Enter' && event.shiftKey && !this.multiline()) {\n event.preventDefault();\n if (this.splitOnEnter()) this.emitSplit(el);\n else this.insertLineBreak();\n return;\n }\n if (event.key === 'Backspace' && this.isCaretAtStart(el) && this.isSelectionCollapsed()) {\n if (this.computeEmpty(el)) {\n event.preventDefault();\n this.removeEmpty.emit();\n }\n return;\n }\n if (event.key === 'ArrowUp' && this.isCaretAtStart(el) && this.isSelectionCollapsed()) {\n event.preventDefault();\n this.arrowOut.emit('up');\n return;\n }\n if (event.key === 'ArrowDown' && this.isCaretAtEnd(el) && this.isSelectionCollapsed()) {\n event.preventDefault();\n this.arrowOut.emit('down');\n return;\n }\n }\n\n /** Escape inside the toolbar returns focus to the text; arrows move tools. */\n protected onToolbarKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.toolbar.update((t) => ({ ...t, visible: false }));\n this.editableRef().nativeElement.focus();\n return;\n }\n if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {\n const bar = event.currentTarget as HTMLElement;\n const buttons = Array.from(bar.querySelectorAll<HTMLButtonElement>('.mk-rich-text__tool'));\n const current = buttons.indexOf(this.document.activeElement as HTMLButtonElement);\n if (current === -1 || buttons.length === 0) return;\n event.preventDefault();\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n buttons[(current + delta + buttons.length) % buttons.length].focus();\n }\n }\n\n /** Runs a toolbar command, keeping the model + toolbar state in sync. */\n protected runTool(id: string): void {\n const el = this.editableRef().nativeElement;\n el.focus();\n switch (id) {\n case 'bold':\n case 'italic':\n case 'underline':\n case 'strikeThrough':\n this.document.execCommand(id);\n break;\n case 'code':\n this.wrapInlineCode();\n break;\n case 'link':\n this.applyLink();\n break;\n case 'clear':\n this.document.execCommand('removeFormat');\n this.document.execCommand('unlink');\n break;\n }\n this.onInput();\n this.updateToolbar();\n }\n\n protected isActive(id: string): boolean {\n return this.activeFormats().has(id);\n }\n\n // --- internals ------------------------------------------------------------\n\n private emitSplit(el: HTMLElement): void {\n const { before, after } = this.splitHtmlAtCaret(el);\n this.splitAt.emit({ before, after });\n }\n\n /** Inserts a `<br>` at the caret (Enter in `splitOnEnter=false` mode). */\n private insertLineBreak(): void {\n // insertHTML keeps the markup to the sanitiser's allow-list (`<br>`),\n // unlike the browser's default Enter handling which wraps lines in divs.\n this.document.execCommand('insertHTML', false, '<br>');\n this.onInput();\n }\n\n /** Extracts markup after the caret so the host can start a new block with it. */\n private splitHtmlAtCaret(el: HTMLElement): MkRichTextSplit {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return { before: el.innerHTML, after: '' };\n }\n const range = selection.getRangeAt(0);\n const tail = range.cloneRange();\n tail.selectNodeContents(el);\n tail.setStart(range.endContainer, range.endOffset);\n const fragment = tail.cloneContents();\n const holder = this.document.createElement('div');\n holder.appendChild(fragment);\n const after = holder.innerHTML;\n\n const head = range.cloneRange();\n head.selectNodeContents(el);\n head.setEnd(range.startContainer, range.startOffset);\n const headHolder = this.document.createElement('div');\n headHolder.appendChild(head.cloneContents());\n const before = headHolder.innerHTML;\n return { before, after };\n }\n\n private wrapInlineCode(): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0 || selection.isCollapsed) return;\n const range = selection.getRangeAt(0);\n const code = this.document.createElement('code');\n try {\n range.surroundContents(code);\n } catch {\n // Selection crosses element boundaries — fall back to insertHTML.\n const html = range.toString();\n this.document.execCommand('insertHTML', false, `<code>${escapeText(html)}</code>`);\n }\n }\n\n private applyLink(): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.isCollapsed) return;\n const url = this.document.defaultView?.prompt(\n this.i18n.blockEditor.linkUrlPrompt,\n 'https://',\n );\n if (url == null) return;\n const trimmed = url.trim();\n if (trimmed === '') {\n this.document.execCommand('unlink');\n return;\n }\n if (!/^(https?:|mailto:|tel:|\\/|#)/i.test(trimmed)) return; // block javascript: etc.\n this.document.execCommand('createLink', false, trimmed);\n }\n\n private updateToolbar(): void {\n const el = this.editableRef().nativeElement;\n const selection = this.document.defaultView?.getSelection();\n if (\n this.disabled() ||\n !selection ||\n selection.rangeCount === 0 ||\n selection.isCollapsed ||\n !el.contains(selection.anchorNode)\n ) {\n this.toolbar.update((t) => (t.visible ? { ...t, visible: false } : t));\n return;\n }\n const rect = selection.getRangeAt(0).getBoundingClientRect();\n const host = el.getBoundingClientRect();\n this.toolbar.set({\n visible: true,\n top: rect.top - host.top - 8,\n left: rect.left - host.left + rect.width / 2,\n });\n const active = new Set<string>();\n for (const id of ['bold', 'italic', 'underline', 'strikeThrough']) {\n try {\n if (this.document.queryCommandState(id)) active.add(id);\n } catch {\n /* queryCommandState can throw in some engines */\n }\n }\n this.activeFormats.set(active);\n }\n\n private computeEmpty(el: HTMLElement): boolean {\n const text = el.textContent?.trim() ?? '';\n return text === '' && !el.querySelector('img, hr, iframe');\n }\n\n private setCaret(el: HTMLElement, position: 'start' | 'end'): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection) return;\n const range = this.document.createRange();\n range.selectNodeContents(el);\n range.collapse(position === 'start');\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n private isSelectionCollapsed(): boolean {\n return this.document.defaultView?.getSelection()?.isCollapsed ?? true;\n }\n\n private isCaretAtStart(el: HTMLElement): boolean {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0).cloneRange();\n range.selectNodeContents(el);\n range.setEnd(selection.anchorNode!, selection.anchorOffset);\n return range.toString().length === 0;\n }\n\n private isCaretAtEnd(el: HTMLElement): boolean {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0).cloneRange();\n range.selectNodeContents(el);\n range.setStart(selection.anchorNode!, selection.anchorOffset);\n return range.toString().length === 0;\n }\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n","@if (toolbar().visible && !disabled()) {\n <div\n class=\"mk-rich-text__toolbar\"\n role=\"toolbar\"\n [attr.aria-label]=\"i18n.blockEditor.textFormatting\"\n [style.top.px]=\"toolbar().top\"\n [style.left.px]=\"toolbar().left\"\n (keydown)=\"onToolbarKeydown($event)\"\n >\n @for (tool of tools; track tool.id) {\n <button\n type=\"button\"\n class=\"mk-rich-text__tool\"\n [class.mk-rich-text__tool--active]=\"isActive(tool.id)\"\n [class.mk-rich-text__tool--code]=\"tool.id === 'code'\"\n [attr.aria-pressed]=\"isActive(tool.id)\"\n [attr.aria-label]=\"tool.label + (tool.shortcut ? ' (' + tool.shortcut + ')' : '')\"\n [title]=\"tool.label\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"runTool(tool.id)\"\n >\n {{ tool.icon }}\n </button>\n }\n </div>\n}\n\n<div\n #editable\n class=\"mk-rich-text__editable\"\n data-mk-editable\n role=\"textbox\"\n aria-multiline=\"true\"\n [attr.aria-label]=\"labelledBy() ? null : ariaLabel()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n [attr.contenteditable]=\"disabled() ? null : 'true'\"\n [attr.data-placeholder]=\"placeholder()\"\n [style.min-height]=\"minHeight()\"\n [class.mk-rich-text__editable--empty]=\"showPlaceholder()\"\n (input)=\"onInput()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n (keyup)=\"onSelectionChange()\"\n (mouseup)=\"onSelectionChange()\"\n></div>\n","/**\n * Allow-list sanitiser for inline rich-text HTML — the security backbone of\n * both `<mk-rich-text>` and the block editor's text blocks.\n *\n * SECURITY MODEL: rich-text surfaces store HTML authored through the editor's\n * restricted formatting commands. Before that markup is emitted, persisted or\n * re-rendered it is passed through {@link sanitizeInlineHtml}, an allow-list\n * cleaner that strips scripts, event handlers and dangerous URLs. Angular's\n * `DomSanitizer` re-sanitises at display time where applicable. This module is\n * dependency-free so it can run on a server (SSG/SSR) — never feed its output\n * back into `innerHTML` without sanitising again.\n */\n\nconst ALLOWED_INLINE_TAGS = new Set([\n 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'code', 'a', 'br', 'span', 'mark', 'sub', 'sup',\n]);\n\n/** Escapes a value for safe placement in a double-quoted attribute. */\nfunction escapeAttr(value: string): string {\n return String(value ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/** True for URL schemes safe to place in `href`/`src`. */\nfunction isSafeUrl(url: string): boolean {\n const trimmed = String(url ?? '').trim();\n if (trimmed === '') return false;\n // Allow relative, http(s), mailto, tel and data:image.\n if (/^(https?:|mailto:|tel:)/i.test(trimmed)) return true;\n if (/^data:image\\//i.test(trimmed)) return true;\n if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) return false; // any other scheme\n return true; // relative / anchor / protocol-relative-ish\n}\n\n/**\n * Allow-list cleaner for inline rich text. Keeps a small set of formatting\n * tags, strips everything else's tags (preserving their text), removes event\n * handler attributes and unsafe `href`s. Not a substitute for `DomSanitizer`,\n * but makes the serialised string safe by construction.\n */\nexport function sanitizeInlineHtml(html: string): string {\n if (!html) return '';\n let out = String(html);\n // Drop script/style blocks entirely.\n out = out.replace(/<\\s*(script|style)[\\s\\S]*?<\\s*\\/\\s*\\1\\s*>/gi, '');\n // Rewrite each tag: keep allow-listed ones with a scrubbed attribute set.\n out = out.replace(/<\\/?[a-z][a-z0-9]*\\b[^>]*>/gi, (tag) => {\n const closing = /^<\\s*\\//.test(tag);\n const name = (tag.match(/^<\\s*\\/?\\s*([a-z0-9]+)/i)?.[1] ?? '').toLowerCase();\n if (!ALLOWED_INLINE_TAGS.has(name)) return '';\n if (closing) return `</${name}>`;\n if (name === 'a') {\n const href = tag.match(/\\shref\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/i);\n const url = href?.[1] ?? href?.[2] ?? '';\n if (url && isSafeUrl(url)) {\n return `<a href=\"${escapeAttr(url)}\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">`;\n }\n return '<a>';\n }\n return `<${name}>`;\n });\n return out;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\nimport { MK_I18N, MkFieldContext } from '@mk-kit/ui/core';\nimport { mkInjectFieldTouched } from '@mk-kit/ui/core/signal-forms';\nimport { MkRichTextEngine } from './rich-text-engine';\nimport { sanitizeInlineHtml } from './sanitize';\n\n/**\n * Rich text — a small WYSIWYG form control over a sanitised HTML string, for\n * single \"description\"-style fields where the full block editor is overkill.\n * Renders a textarea-like surface with the floating inline formatting toolbar\n * (Bold, Italic, Underline, Strikethrough, Inline code, Link, Clear) on text\n * selection; Enter inserts a line break.\n *\n * Implements `ControlValueAccessor` with a two-way `value` model, so it works\n * with `[(ngModel)]`, reactive forms and `[(value)]`. Every value — written or\n * emitted — passes through {@link sanitizeInlineHtml}, and a visually empty\n * surface (whitespace / lone `<br>`s) normalises to `''` so `required`\n * validation behaves.\n *\n * ```html\n * <mk-rich-text [(ngModel)]=\"description\" placeholder=\"Describe it…\" />\n * <mk-rich-text [(value)]=\"html\" minHeight=\"8rem\" />\n * ```\n */\n@Component({\n selector: 'mk-rich-text',\n templateUrl: './rich-text.html',\n styleUrl: './rich-text.scss',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-rich-text-field',\n '[class.mk-rich-text-field--disabled]': 'isDisabled()',\n '[class.mk-rich-text-field--invalid]': 'isInvalid()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MkRichText),\n multi: true,\n },\n ],\n})\nexport class MkRichText implements ControlValueAccessor {\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 private readonly i18n = inject(MK_I18N);\n\n /** Two-way HTML string value (sanitised; `''` when visually empty). */\n readonly value = model<string>('');\n /** Placeholder shown when empty. */\n readonly placeholder = input<string>('');\n /** Disable the control. */\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 /** Minimum height of the editable area (any CSS length). */\n readonly minHeight = input<string>('4.5em');\n /** Accessible label when not labelled by an `mk-form-field`. */\n readonly ariaLabel = input<string>('', { alias: 'aria-label' });\n\n private readonly cvaDisabled = signal(false);\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n protected readonly isInvalid = computed(\n () => (this.invalid() && this.fieldTouched()) || (this.field?.hasError() ?? false),\n );\n protected readonly labelledBy = this.field?.labelId ?? null;\n protected readonly describedBy = computed(() => this.field?.describedBy() ?? null);\n protected readonly effectiveAriaLabel = computed(\n () => this.ariaLabel() || this.i18n.blockEditor.editableText,\n );\n\n /** Sanitised view of the model, rendered into the engine. */\n protected readonly safeHtml = computed(() => sanitizeInlineHtml(this.value()));\n\n /** User edit: sanitise, normalise the empty state, propagate. */\n protected onContentChange(html: string): void {\n const value = normalizeRichTextValue(html);\n this.value.set(value);\n this.onChange(value);\n }\n\n protected onFocusChange(focused: boolean): void {\n if (!focused) this.onTouched();\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n writeValue(value: unknown): void {\n this.value.set(normalizeRichTextValue(value == null ? '' : String(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\n/**\n * Sanitises an HTML string and collapses visually empty markup (whitespace,\n * `&nbsp;`s, lone `<br>`s and empty formatting tags) to `''`.\n */\nfunction normalizeRichTextValue(html: string): string {\n const sanitized = sanitizeInlineHtml(html);\n const text = sanitized\n .replace(/<[^>]*>/g, '')\n .replace(/&nbsp;/gi, ' ')\n .trim();\n return text === '' ? '' : sanitized;\n}\n","<mk-rich-text-engine\n [html]=\"safeHtml()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [splitOnEnter]=\"false\"\n [minHeight]=\"minHeight()\"\n [ariaLabel]=\"effectiveAriaLabel()\"\n [labelledBy]=\"labelledBy\"\n [describedBy]=\"describedBy()\"\n [invalid]=\"isInvalid()\"\n (contentChange)=\"onContentChange($event)\"\n (focusChange)=\"onFocusChange($event)\"\n/>\n","/**\n * RICH TEXT entry for @mk-kit/ui.\n *\n * A small WYSIWYG form control (`<mk-rich-text>`) over a sanitised HTML\n * string, plus the low-level contenteditable engine and the allow-list\n * sanitiser it is built on. The block editor composes the same engine for its\n * paragraph, heading, quote and list blocks.\n *\n * NOTE: this barrel deliberately does not export an HTML-escape helper — the\n * block-editor entry exports `mkEscapeHtml` and the root umbrella re-exports\n * both entries.\n */\nexport { MkRichText } from './rich-text';\nexport { MkRichTextEngine, type MkRichTextSplit } from './rich-text-engine';\nexport { sanitizeInlineHtml } from './sanitize';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -226,9 +226,20 @@ class MkHarnessLoader {
226
226
  elements(selector) {
227
227
  return Array.from(this.root.querySelectorAll(selector)).map((el) => new MkTestElement(el, this.settle));
228
228
  }
229
- /** First matching harness; throws when there is none. */
229
+ /**
230
+ * First matching harness; throws when there is none. Retries for a short
231
+ * while first: overlays such as `MkDialogService.prompt()` render after a
232
+ * lazy chunk resolves, so the host may appear a few ticks after the call.
233
+ * `has()` / `getOrNull()` stay immediate so absence can be asserted.
234
+ */
230
235
  async get(type, filters = {}) {
231
- const [first] = await this.getAll(type, filters);
236
+ let first;
237
+ for (let attempt = 0; attempt < 30; attempt++) {
238
+ [first] = await this.getAll(type, filters);
239
+ if (first)
240
+ break;
241
+ await new Promise((resolve) => setTimeout(resolve, 10));
242
+ }
232
243
  if (!first) {
233
244
  throw new Error(`No ${type.name} found (host "${type.hostSelector}"${filters.selector ? `, selector "${filters.selector}"` : ''}${filters.text ? `, text ${String(filters.text)}` : ''}) under <${this.root.tagName.toLowerCase()}>.`);
234
245
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mk-kit-ui-testing.mjs","sources":["../../../projects/mk-kit/testing/harness.ts","../../../projects/mk-kit/testing/harnesses/form-controls.harness.ts","../../../projects/mk-kit/testing/harnesses/navigation.harness.ts","../../../projects/mk-kit/testing/harnesses/table.harness.ts","../../../projects/mk-kit/testing/harnesses/overlays.harness.ts","../../../projects/mk-kit/testing/index.ts","../../../projects/mk-kit/testing/mk-kit-ui-testing.ts"],"sourcesContent":["import type { ComponentFixture } from '@angular/core/testing';\n\n/**\n * Filters every harness lookup accepts. `selector` narrows the host elements\n * considered (e.g. a class or attribute your template sets); `text` matches\n * the host's trimmed text content — a string must match exactly, a RegExp\n * is tested.\n */\nexport interface MkHarnessFilters {\n selector?: string;\n text?: string | RegExp;\n}\n\n/** Constructor shape of every harness class: a static `hostSelector`. */\nexport interface MkHarnessType<T extends MkHarness> {\n new (host: MkTestElement, loader: MkHarnessLoader): T;\n readonly hostSelector: string;\n}\n\n/** Keys accepted by `MkTestElement.sendKeys` besides printable characters. */\nexport type MkTestKey =\n | 'Enter'\n | 'Escape'\n | 'Tab'\n | 'Backspace'\n | 'Delete'\n | ' '\n | 'ArrowUp'\n | 'ArrowDown'\n | 'ArrowLeft'\n | 'ArrowRight'\n | 'Home'\n | 'End'\n | 'PageUp'\n | 'PageDown';\n\nconst NO_OP = async (): Promise<void> => {};\n\n/**\n * A DOM element wrapped for tests: reads are synchronous, every interaction\n * dispatches the same events a user would and then settles change detection\n * (`fixture.detectChanges()` + `whenStable()`), so the next read sees the\n * updated view.\n */\nexport class MkTestElement {\n constructor(\n /** The underlying element — reach for it when a harness has no getter. */\n readonly native: HTMLElement,\n /** Flush change detection after an interaction. */\n readonly settle: () => Promise<void> = NO_OP,\n ) {}\n\n /** Trimmed text content with whitespace collapsed. */\n text(): string {\n return (this.native.textContent ?? '').replace(/\\s+/g, ' ').trim();\n }\n\n attr(name: string): string | null {\n return this.native.getAttribute(name);\n }\n\n hasClass(name: string): boolean {\n return this.native.classList.contains(name);\n }\n\n /** Read a DOM property (`value`, `checked`, `open`, …). */\n prop<T = unknown>(name: string): T {\n return (this.native as unknown as Record<string, T>)[name];\n }\n\n matches(selector: string): boolean {\n return this.native.matches(selector);\n }\n\n isFocused(): boolean {\n return this.native.ownerDocument.activeElement === this.native;\n }\n\n /** Native `disabled`, `aria-disabled=\"true\"` or a `--disabled` host class. */\n isDisabled(): boolean {\n const el = this.native as HTMLElement & { disabled?: boolean };\n return (\n el.disabled === true ||\n el.getAttribute('aria-disabled') === 'true' ||\n Array.from(el.classList).some((c) => c.endsWith('--disabled'))\n );\n }\n\n query(selector: string): MkTestElement | null {\n const el = this.native.querySelector<HTMLElement>(selector);\n return el ? new MkTestElement(el, this.settle) : null;\n }\n\n queryAll(selector: string): MkTestElement[] {\n return Array.from(this.native.querySelectorAll<HTMLElement>(selector)).map(\n (el) => new MkTestElement(el, this.settle),\n );\n }\n\n /** Like `query`, but throws a readable error when nothing matches. */\n child(selector: string): MkTestElement {\n const el = this.query(selector);\n if (!el) throw new Error(`Expected \"${selector}\" inside <${this.describe()}>.`);\n return el;\n }\n\n /** pointerdown → mousedown → focus → pointerup → mouseup → click, like a user. */\n async click(): Promise<void> {\n const el = this.native;\n el.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, cancelable: true }));\n el.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true }));\n el.focus();\n el.dispatchEvent(new PointerEvent('pointerup', { bubbles: true, cancelable: true }));\n el.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true }));\n el.click();\n await this.settle();\n }\n\n async hover(): Promise<void> {\n for (const type of ['pointerenter', 'mouseenter', 'pointerover', 'mouseover']) {\n this.native.dispatchEvent(new MouseEvent(type, { bubbles: type.endsWith('over') }));\n }\n this.native.dispatchEvent(new MouseEvent('mousemove', { bubbles: true }));\n await this.settle();\n }\n\n async leave(): Promise<void> {\n for (const type of ['pointerleave', 'mouseleave', 'pointerout', 'mouseout']) {\n this.native.dispatchEvent(new MouseEvent(type, { bubbles: type.endsWith('out') }));\n }\n await this.settle();\n }\n\n async focus(): Promise<void> {\n this.native.focus();\n if (!this.isFocused()) this.native.dispatchEvent(new FocusEvent('focus'));\n await this.settle();\n }\n\n async blur(): Promise<void> {\n this.native.blur();\n this.native.dispatchEvent(new FocusEvent('blur'));\n this.native.dispatchEvent(new FocusEvent('focusout', { bubbles: true }));\n await this.settle();\n }\n\n /**\n * Type into an input/textarea/contenteditable character by character —\n * keydown, `value` append, `input`, keyup — then settle. Use `setValue`\n * to replace the value in one go.\n */\n async type(text: string): Promise<void> {\n const el = this.native as HTMLInputElement;\n el.focus();\n for (const ch of text) {\n const down = new KeyboardEvent('keydown', { key: ch, bubbles: true, cancelable: true });\n el.dispatchEvent(down);\n if (!down.defaultPrevented) {\n if (el.isContentEditable) el.textContent = (el.textContent ?? '') + ch;\n else el.value = (el.value ?? '') + ch;\n el.dispatchEvent(new InputEvent('input', { bubbles: true, data: ch, inputType: 'insertText' }));\n }\n el.dispatchEvent(new KeyboardEvent('keyup', { key: ch, bubbles: true }));\n }\n await this.settle();\n }\n\n /** Set the value of an input/textarea/select and fire `input` + `change`. */\n async setValue(value: string): Promise<void> {\n const el = this.native as HTMLInputElement;\n el.focus();\n el.value = value;\n el.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertReplacementText' }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n await this.settle();\n }\n\n async clear(): Promise<void> {\n const el = this.native as HTMLInputElement;\n el.focus();\n el.value = '';\n el.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'deleteContentBackward' }));\n await this.settle();\n }\n\n /** Dispatch keydown/keyup for each key. Printable single characters are also typed. */\n async sendKeys(...keys: Array<MkTestKey | (string & {})>): Promise<void> {\n for (const key of keys) {\n const mods = parseKey(key);\n const down = new KeyboardEvent('keydown', { ...mods, bubbles: true, cancelable: true });\n this.native.dispatchEvent(down);\n if (!down.defaultPrevented && mods.key.length === 1 && !mods.ctrlKey && !mods.metaKey) {\n const el = this.native as HTMLInputElement;\n if ('value' in el && typeof el.value === 'string' && !el.isContentEditable && isTextField(el)) {\n el.value += mods.key;\n el.dispatchEvent(new InputEvent('input', { bubbles: true, data: mods.key, inputType: 'insertText' }));\n }\n }\n this.native.dispatchEvent(new KeyboardEvent('keyup', { ...mods, bubbles: true }));\n }\n await this.settle();\n }\n\n /** Dispatch any event on the element and settle. */\n async dispatch(event: Event): Promise<void> {\n this.native.dispatchEvent(event);\n await this.settle();\n }\n\n private describe(): string {\n const el = this.native;\n const id = el.id ? `#${el.id}` : '';\n const cls = el.classList.length ? `.${Array.from(el.classList).slice(0, 2).join('.')}` : '';\n return `${el.tagName.toLowerCase()}${id}${cls}`;\n }\n}\n\n/** `Control+a`, `Shift+Tab`, `Enter`, `a` → KeyboardEventInit. */\nfunction parseKey(key: string): KeyboardEventInit & { key: string } {\n const parts = key.split('+');\n const k = parts.pop() ?? key;\n const has = (m: string) => parts.some((p) => p.toLowerCase() === m);\n return {\n key: k,\n ctrlKey: has('control') || has('ctrl'),\n metaKey: has('meta') || has('cmd'),\n shiftKey: has('shift'),\n altKey: has('alt'),\n };\n}\n\nfunction isTextField(el: HTMLElement): boolean {\n if (el instanceof HTMLTextAreaElement) return true;\n if (!(el instanceof HTMLInputElement)) return false;\n return !['checkbox', 'radio', 'button', 'submit', 'reset', 'file', 'range', 'color'].includes(el.type);\n}\n\n/**\n * Finds harnesses under a root element. Create one with\n * `MkHarnessLoader.fromFixture(fixture)`; use `.document()` for content that\n * mk-kit teleports into `document.body` (dialogs, toasts, menus, select\n * panels) and `.within(el)` to scope lookups.\n */\nexport class MkHarnessLoader {\n constructor(\n readonly root: Element,\n readonly settle: () => Promise<void>,\n ) {}\n\n /**\n * Loader rooted at the fixture's host element. Every interaction runs\n * `fixture.detectChanges()` and awaits `fixture.whenStable()` afterwards,\n * so it works in zoneless and zone-based TestBeds alike.\n */\n static fromFixture(fixture: ComponentFixture<unknown>): MkHarnessLoader {\n const settle = async () => {\n fixture.detectChanges();\n await fixture.whenStable();\n fixture.detectChanges();\n };\n return new MkHarnessLoader(fixture.nativeElement as Element, settle);\n }\n\n /** Same settle function, rooted at `document.body` — for overlays. */\n document(): MkHarnessLoader {\n return new MkHarnessLoader(this.root.ownerDocument.body, this.settle);\n }\n\n within(root: Element | MkTestElement): MkHarnessLoader {\n return new MkHarnessLoader(root instanceof MkTestElement ? root.native : root, this.settle);\n }\n\n /** Wrap the root element itself. */\n rootElement(): MkTestElement {\n return new MkTestElement(this.root as HTMLElement, this.settle);\n }\n\n element(selector: string): MkTestElement {\n const el = this.root.querySelector<HTMLElement>(selector) ?? (this.root.matches(selector) ? (this.root as HTMLElement) : null);\n if (!el) throw new Error(`No element matches \"${selector}\" under <${this.root.tagName.toLowerCase()}>.`);\n return new MkTestElement(el, this.settle);\n }\n\n elements(selector: string): MkTestElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>(selector)).map((el) => new MkTestElement(el, this.settle));\n }\n\n /** First matching harness; throws when there is none. */\n async get<T extends MkHarness>(type: MkHarnessType<T>, filters: MkHarnessFilters = {}): Promise<T> {\n const [first] = await this.getAll(type, filters);\n if (!first) {\n throw new Error(\n `No ${type.name} found (host \"${type.hostSelector}\"${filters.selector ? `, selector \"${filters.selector}\"` : ''}${\n filters.text ? `, text ${String(filters.text)}` : ''\n }) under <${this.root.tagName.toLowerCase()}>.`,\n );\n }\n return first;\n }\n\n async getOrNull<T extends MkHarness>(type: MkHarnessType<T>, filters: MkHarnessFilters = {}): Promise<T | null> {\n const [first] = await this.getAll(type, filters);\n return first ?? null;\n }\n\n async has<T extends MkHarness>(type: MkHarnessType<T>, filters: MkHarnessFilters = {}): Promise<boolean> {\n return (await this.getAll(type, filters)).length > 0;\n }\n\n async getAll<T extends MkHarness>(type: MkHarnessType<T>, filters: MkHarnessFilters = {}): Promise<T[]> {\n await this.settle();\n const hosts = new Set<HTMLElement>();\n for (const part of type.hostSelector.split(',')) {\n const sel = part.trim();\n if (this.root.matches(sel)) hosts.add(this.root as HTMLElement);\n for (const el of Array.from(this.root.querySelectorAll<HTMLElement>(sel))) hosts.add(el);\n }\n const out: T[] = [];\n for (const host of hosts) {\n if (filters.selector && !host.matches(filters.selector)) continue;\n const el = new MkTestElement(host, this.settle);\n if (filters.text !== undefined && !matchText(el.text(), filters.text)) continue;\n out.push(new type(el, this));\n }\n // Document order.\n out.sort((a, b) => (a.host.native.compareDocumentPosition(b.host.native) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1));\n return out;\n }\n}\n\nexport function matchText(actual: string, expected: string | RegExp): boolean {\n return typeof expected === 'string' ? actual === expected : expected.test(actual);\n}\n\n/**\n * Base class of every mk-kit harness. Subclasses declare `hostSelector`\n * and expose user-level actions (`click()`, `selectOption()`, …) and reads\n * (`isChecked()`, `text()`), so specs never depend on the component's DOM.\n */\nexport abstract class MkHarness {\n static readonly hostSelector: string = '';\n\n constructor(\n /** The component's host element. */\n readonly host: MkTestElement,\n protected readonly loader: MkHarnessLoader,\n ) {}\n\n protected settle(): Promise<void> {\n return this.loader.settle();\n }\n\n /** Query inside the host. */\n protected q(selector: string): MkTestElement | null {\n return this.host.query(selector);\n }\n\n protected qAll(selector: string): MkTestElement[] {\n return this.host.queryAll(selector);\n }\n\n /** Query the whole document — for panels teleported to `document.body`. */\n protected qDocument(selector: string): MkTestElement | null {\n const el = this.host.native.ownerDocument.querySelector<HTMLElement>(selector);\n return el ? new MkTestElement(el, this.host.settle) : null;\n }\n\n /** Element referenced by an `aria-controls` / `aria-owns` id on `from`. */\n protected controlled(from: MkTestElement, attribute = 'aria-controls'): MkTestElement | null {\n const id = from.attr(attribute);\n if (!id) return null;\n const el = this.host.native.ownerDocument.getElementById(id);\n return el ? new MkTestElement(el, this.host.settle) : null;\n }\n}\n\n/** Resolve \"by index or by label\" arguments shared by option-style harnesses. */\nexport function pickBy<T>(items: T[], which: number | string | RegExp, label: (item: T) => string, what: string): T {\n const item =\n typeof which === 'number'\n ? items[which]\n : items.find((i) => matchText(label(i), which));\n if (!item) {\n throw new Error(\n `No ${what} ${typeof which === 'number' ? `at index ${which}` : `matching ${String(which)}`}. Available: ${items\n .map((i) => JSON.stringify(label(i)))\n .join(', ') || '(none)'}.`,\n );\n }\n return item;\n}\n","import { MkHarness, MkTestElement, pickBy } from '../harness';\n\n/** `button[mkButton]` / `a[mkButton]`. */\nexport class MkButtonHarness extends MkHarness {\n static override readonly hostSelector = 'button[mkButton], a[mkButton], .mk-button';\n\n text(): string {\n return this.host.text();\n }\n\n async click(): Promise<void> {\n await this.host.click();\n }\n\n async focus(): Promise<void> {\n await this.host.focus();\n }\n\n isDisabled(): boolean {\n return this.host.isDisabled();\n }\n\n isLoading(): boolean {\n return this.host.hasClass('mk-button--loading');\n }\n\n tone(): string | null {\n return this.host.attr('data-tone');\n }\n\n /** `solid` | `soft` | `outline` | `ghost` | `link`. */\n variant(): string | null {\n const m = Array.from(this.host.native.classList).find((c) =>\n /^mk-button--(solid|soft|outline|ghost|link)$/.test(c),\n );\n return m ? m.replace('mk-button--', '') : null;\n }\n\n size(): string | null {\n const m = Array.from(this.host.native.classList).find((c) => /^mk-button--(sm|md|lg)$/.test(c));\n return m ? m.replace('mk-button--', '') : null;\n }\n}\n\n/** Native `input[mkInput]` / `textarea[mkInput]`. */\nexport class MkInputHarness extends MkHarness {\n static override readonly hostSelector = '[mkInput], .mk-input';\n\n value(): string {\n return this.host.prop<string>('value') ?? '';\n }\n\n /** Replace the value (fires `input` + `change`). */\n async setValue(value: string): Promise<void> {\n await this.host.setValue(value);\n }\n\n /** Append text one character at a time (keydown / input / keyup). */\n async type(text: string): Promise<void> {\n await this.host.type(text);\n }\n\n async clear(): Promise<void> {\n await this.host.clear();\n }\n\n async focus(): Promise<void> {\n await this.host.focus();\n }\n\n async blur(): Promise<void> {\n await this.host.blur();\n }\n\n placeholder(): string {\n return this.host.attr('placeholder') ?? '';\n }\n\n type_(): string {\n return this.host.attr('type') ?? (this.host.native.tagName === 'TEXTAREA' ? 'textarea' : 'text');\n }\n\n isDisabled(): boolean {\n return this.host.isDisabled();\n }\n\n isInvalid(): boolean {\n return this.host.hasClass('mk-input--invalid') || this.host.attr('aria-invalid') === 'true';\n }\n\n isRequired(): boolean {\n return this.host.prop<boolean>('required') === true || this.host.attr('aria-required') === 'true';\n }\n\n isFocused(): boolean {\n return this.host.isFocused();\n }\n}\n\n/** `mk-checkbox`. */\nexport class MkCheckboxHarness extends MkHarness {\n static override readonly hostSelector = 'mk-checkbox';\n\n private get input(): MkTestElement {\n return this.host.child('input[type=\"checkbox\"]');\n }\n\n label(): string {\n return this.q('.mk-checkbox__text')?.text() ?? '';\n }\n\n isChecked(): boolean {\n return this.input.prop<boolean>('checked') === true;\n }\n\n isIndeterminate(): boolean {\n return this.input.prop<boolean>('indeterminate') === true;\n }\n\n isDisabled(): boolean {\n return this.input.isDisabled();\n }\n\n isRequired(): boolean {\n return this.input.prop<boolean>('required') === true;\n }\n\n async toggle(): Promise<void> {\n await this.input.click();\n }\n\n async check(): Promise<void> {\n if (!this.isChecked()) await this.toggle();\n }\n\n async uncheck(): Promise<void> {\n if (this.isChecked()) await this.toggle();\n }\n\n async focus(): Promise<void> {\n await this.input.focus();\n }\n\n async blur(): Promise<void> {\n await this.input.blur();\n }\n}\n\n/** `mk-switch`. */\nexport class MkSwitchHarness extends MkHarness {\n static override readonly hostSelector = 'mk-switch';\n\n private get control(): MkTestElement {\n return this.host.child('[role=\"switch\"]');\n }\n\n label(): string {\n return this.q('.mk-switch__label')?.text() ?? '';\n }\n\n isChecked(): boolean {\n return this.control.attr('aria-checked') === 'true';\n }\n\n isDisabled(): boolean {\n return this.control.isDisabled();\n }\n\n async toggle(): Promise<void> {\n await this.control.click();\n }\n\n async check(): Promise<void> {\n if (!this.isChecked()) await this.toggle();\n }\n\n async uncheck(): Promise<void> {\n if (this.isChecked()) await this.toggle();\n }\n\n async focus(): Promise<void> {\n await this.control.focus();\n }\n}\n\n/** One `mk-radio` inside a group. */\nexport class MkRadioHarness extends MkHarness {\n static override readonly hostSelector = 'mk-radio';\n\n label(): string {\n return this.q('.mk-radio__label')?.text() ?? this.host.text();\n }\n\n isChecked(): boolean {\n return this.host.attr('aria-checked') === 'true';\n }\n\n isDisabled(): boolean {\n return this.host.isDisabled();\n }\n\n async select(): Promise<void> {\n await this.host.click();\n }\n\n async focus(): Promise<void> {\n await this.host.focus();\n }\n}\n\n/** `mk-radio-group`. */\nexport class MkRadioGroupHarness extends MkHarness {\n static override readonly hostSelector = 'mk-radio-group';\n\n radios(): Promise<MkRadioHarness[]> {\n return this.loader.within(this.host).getAll(MkRadioHarness);\n }\n\n async labels(): Promise<string[]> {\n return (await this.radios()).map((r) => r.label());\n }\n\n /** Label of the checked radio, or `null`. */\n async checkedLabel(): Promise<string | null> {\n return (await this.radios()).find((r) => r.isChecked())?.label() ?? null;\n }\n\n async checkedIndex(): Promise<number> {\n return (await this.radios()).findIndex((r) => r.isChecked());\n }\n\n /** Select by index, exact label or RegExp. */\n async select(which: number | string | RegExp): Promise<void> {\n const radios = await this.radios();\n await pickBy(radios, which, (r) => r.label(), 'radio').select();\n }\n\n isDisabled(): boolean {\n return this.host.hasClass('mk-radio-group--disabled');\n }\n}\n\nexport interface MkSelectOptionState {\n label: string;\n selected: boolean;\n disabled: boolean;\n}\n\n/** `mk-select` — opens the teleported listbox and picks options like a user. */\nexport class MkSelectHarness extends MkHarness {\n static override readonly hostSelector = 'mk-select';\n\n private get trigger(): MkTestElement {\n return this.host.child('[role=\"combobox\"]');\n }\n\n /** Label of the selected option, or `''` when only the placeholder shows. */\n valueText(): string {\n const v = this.q('.mk-select__value');\n return v && !v.hasClass('mk-select__value--placeholder') ? v.text() : '';\n }\n\n placeholder(): string {\n return this.q('.mk-select__value--placeholder')?.text() ?? '';\n }\n\n isOpen(): boolean {\n return this.trigger.attr('aria-expanded') === 'true';\n }\n\n isDisabled(): boolean {\n return this.trigger.isDisabled();\n }\n\n isInvalid(): boolean {\n return this.trigger.attr('aria-invalid') === 'true';\n }\n\n async open(): Promise<void> {\n if (!this.isOpen()) await this.trigger.click();\n }\n\n async close(): Promise<void> {\n if (this.isOpen()) await this.trigger.sendKeys('Escape');\n if (this.isOpen()) await this.trigger.click();\n }\n\n async focus(): Promise<void> {\n await this.trigger.focus();\n }\n\n /** Options of the (opened) listbox. Opens it if needed. */\n async options(): Promise<MkSelectOptionState[]> {\n const els = await this.optionElements();\n return els.map((el) => ({\n label: el.text(),\n selected: el.attr('aria-selected') === 'true',\n disabled: el.attr('aria-disabled') === 'true',\n }));\n }\n\n /** Pick an option by index, exact label or RegExp (opens the list first). */\n async selectOption(which: number | string | RegExp): Promise<void> {\n const els = await this.optionElements();\n await pickBy(els, which, (el) => el.text(), 'option').click();\n }\n\n private async optionElements(): Promise<MkTestElement[]> {\n await this.open();\n const list = this.controlled(this.trigger);\n if (!list) throw new Error('mk-select listbox did not open.');\n return list.queryAll('[role=\"option\"]');\n }\n}\n\n/** `mk-form-field` — label / hint / error around any control. */\nexport class MkFormFieldHarness extends MkHarness {\n static override readonly hostSelector = 'mk-form-field';\n\n label(): string {\n return this.q('.mk-form-field__label-text')?.text() ?? '';\n }\n\n hint(): string | null {\n return this.q('.mk-form-field__hint')?.text() ?? null;\n }\n\n /** The visible validation message, or `null` when the field is valid/untouched. */\n error(): string | null {\n return this.q('.mk-form-field__error')?.text() ?? null;\n }\n\n hasError(): boolean {\n return this.error() !== null;\n }\n\n isRequired(): boolean {\n return !!this.q('.mk-form-field__required');\n }\n\n /** The control inside the field, as a harness of the given type. */\n control<T extends MkHarness>(type: Parameters<typeof this.loader.get<T>>[0]): Promise<T> {\n return this.loader.within(this.host).get(type);\n }\n}\n","import { MkHarness, MkTestElement, pickBy } from '../harness';\n\n/** `mk-tabs`. */\nexport class MkTabsHarness extends MkHarness {\n static override readonly hostSelector = 'mk-tabs';\n\n private tabButtons(): MkTestElement[] {\n return this.qAll('[role=\"tab\"]');\n }\n\n labels(): string[] {\n return this.tabButtons().map((t) => t.text());\n }\n\n selectedIndex(): number {\n return this.tabButtons().findIndex((t) => t.attr('aria-selected') === 'true');\n }\n\n selectedLabel(): string | null {\n const i = this.selectedIndex();\n return i >= 0 ? this.labels()[i] : null;\n }\n\n /** Select by index, exact label or RegExp. */\n async select(which: number | string | RegExp): Promise<void> {\n await pickBy(this.tabButtons(), which, (t) => t.text(), 'tab').click();\n }\n\n isDisabled(which: number | string | RegExp): boolean {\n return pickBy(this.tabButtons(), which, (t) => t.text(), 'tab').isDisabled();\n }\n\n /** The visible tab panel (`mk-tab` host). */\n selectedPanel(): MkTestElement | null {\n const tab = this.tabButtons()[this.selectedIndex()];\n return tab ? this.controlled(tab) : null;\n }\n\n /** Text of the visible panel. */\n selectedPanelText(): string {\n return this.selectedPanel()?.text() ?? '';\n }\n}\n\n/**\n * A `[mkMenuTriggerFor]` trigger and the `mk-menu` panel it opens. The host\n * is matched by the trigger's `aria-haspopup=\"menu\"` (the directive's\n * attribute is an input binding, so it is not in the DOM).\n */\nexport class MkMenuHarness extends MkHarness {\n static override readonly hostSelector = '[aria-haspopup=\"menu\"]';\n\n isOpen(): boolean {\n return this.host.attr('aria-expanded') === 'true';\n }\n\n async open(): Promise<void> {\n if (!this.isOpen()) await this.host.click();\n }\n\n async close(): Promise<void> {\n if (this.isOpen()) await this.panel()?.sendKeys('Escape');\n if (this.isOpen()) await this.host.click();\n }\n\n /** The teleported panel (`[role=\"menu\"]`), or `null` while closed. */\n panel(): MkTestElement | null {\n return this.controlled(this.host);\n }\n\n /** Item texts of the open menu (opens it if needed). Submenu panels excluded. */\n async items(): Promise<string[]> {\n return (await this.itemElements()).map((i) => i.text());\n }\n\n /** Click an item by index, exact text or RegExp (opens the menu first). */\n async clickItem(which: number | string | RegExp): Promise<void> {\n await pickBy(await this.itemElements(), which, (i) => i.text(), 'menu item').click();\n }\n\n async isItemDisabled(which: number | string | RegExp): Promise<boolean> {\n return pickBy(await this.itemElements(), which, (i) => i.text(), 'menu item').isDisabled();\n }\n\n private async itemElements(): Promise<MkTestElement[]> {\n await this.open();\n const panel = this.panel();\n if (!panel) throw new Error('mk-menu panel did not open.');\n return panel.queryAll('[role=\"menuitem\"]');\n }\n}\n","import { MkHarness, MkTestElement, pickBy } from '../harness';\nimport { MkCheckboxHarness } from './form-controls.harness';\n\n/** One data row of `mk-table`. */\nexport class MkTableRowHarness extends MkHarness {\n static override readonly hostSelector = 'tr.mk-table__row';\n\n /** Cell texts of the data columns (expand / select cells excluded). */\n cells(): string[] {\n return this.dataCells().map((c) => c.text());\n }\n\n cell(index: number): string {\n return this.cells()[index] ?? '';\n }\n\n isSelected(): boolean {\n return this.host.hasClass('mk-table__row--selected');\n }\n\n isExpanded(): boolean {\n return this.host.hasClass('mk-table__row--expanded') || this.host.attr('aria-expanded') === 'true';\n }\n\n async click(): Promise<void> {\n await this.host.click();\n }\n\n /** Toggle the selection checkbox (throws when the table is not `selectable`). */\n async toggleSelected(): Promise<void> {\n const cb = await this.loader.within(this.host.child('.mk-table__td--select')).get(MkCheckboxHarness);\n await cb.toggle();\n }\n\n /** Toggle the expand / tree control of the row. */\n async toggleExpanded(): Promise<void> {\n const btn = this.q('.mk-table__td--expand button') ?? this.q('.mk-table__tree-toggle') ?? this.q('button[aria-expanded]');\n if (!btn) throw new Error('Row has no expand toggle (table is not expandable / has no children).');\n await btn.click();\n }\n\n private dataCells(): MkTestElement[] {\n return this.qAll('td.mk-table__td').filter(\n (c) => !c.hasClass('mk-table__td--expand') && !c.hasClass('mk-table__td--select'),\n );\n }\n}\n\n/** `mk-table`. */\nexport class MkTableHarness extends MkHarness {\n static override readonly hostSelector = 'mk-table';\n\n /** Header labels of the data columns, in display order. */\n headers(): string[] {\n return this.headerCells().map((th) => th.child('.mk-table__th-label').text());\n }\n\n rows(): Promise<MkTableRowHarness[]> {\n return this.loader.within(this.host).getAll(MkTableRowHarness);\n }\n\n async rowCount(): Promise<number> {\n return (await this.rows()).length;\n }\n\n /** Every data cell as text: `rows()[r].cells()`. */\n async cellTexts(): Promise<string[][]> {\n return (await this.rows()).map((r) => r.cells());\n }\n\n /** Click a sortable header (by index, exact label or RegExp). */\n async sortBy(which: number | string | RegExp): Promise<void> {\n const th = pickBy(this.headerCells(), which, (h) => h.child('.mk-table__th-label').text(), 'column');\n const btn = th.query('.mk-table__th-button');\n if (!btn) throw new Error(`Column \"${th.text()}\" is not sortable.`);\n await btn.click();\n }\n\n /** `'ascending' | 'descending' | 'none' | null` (null = not sortable). */\n sortDirection(which: number | string | RegExp): string | null {\n return pickBy(this.headerCells(), which, (h) => h.child('.mk-table__th-label').text(), 'column').attr('aria-sort');\n }\n\n async selectedRowCount(): Promise<number> {\n return (await this.rows()).filter((r) => r.isSelected()).length;\n }\n\n /** Toggle the header \"select all\" checkbox. */\n async toggleAll(): Promise<void> {\n const th = this.q('.mk-table__th--select');\n if (!th) throw new Error('Table is not selectable.');\n await (await this.loader.within(th).get(MkCheckboxHarness)).toggle();\n }\n\n isEmpty(): boolean {\n return !this.q('tr.mk-table__row');\n }\n\n /**\n * Set a header-row filter (table is `filterable`). `value` is typed into\n * a text / number / date box, or picked from a select by option label or\n * value; `''` clears that filter.\n */\n async setFilter(key: string, value: string): Promise<void> {\n const control = this.filterControl(key);\n if (control.native instanceof HTMLSelectElement) {\n const options = Array.from(control.native.options);\n const match =\n value === ''\n ? options[0]\n : options.find((o) => o.value === value || o.textContent?.trim() === value);\n if (!match) throw new Error(`Filter \"${key}\" has no option \"${value}\".`);\n await control.setValue(match.value);\n return;\n }\n await control.setValue(value);\n }\n\n /** The current value of a header-row filter control (`''` when unset). */\n filterValue(key: string): string {\n return (this.filterControl(key).native as HTMLInputElement).value ?? '';\n }\n\n /** Clear every header-row filter. */\n async clearFilters(): Promise<void> {\n for (const control of this.qAll('.mk-table__filter-control')) {\n if ((control.native as HTMLInputElement).value !== '') await control.setValue('');\n }\n }\n\n /**\n * Scroll a `virtual` table so the row at display `index` is at the top of\n * the viewport (drives the scroll box, so only the rows around it render).\n */\n async scrollToRow(index: number): Promise<void> {\n const scroller = this.q('.mk-table__scroll');\n if (!scroller) throw new Error('Table has no scroll container.');\n const rowHeight = Number(scroller.attr('data-row-height')) || 44;\n const top = Math.max(0, index) * rowHeight;\n const el = scroller.native;\n el.scrollTop = top;\n if (el.scrollTop !== top) {\n // jsdom has no layout, so scrollTop does not stick — pin it.\n Object.defineProperty(el, 'scrollTop', { value: top, configurable: true, writable: true });\n }\n await scroller.dispatch(new Event('scroll', { bubbles: false }));\n }\n\n private filterControl(key: string): MkTestElement {\n const control = this.q(`.mk-table__filter-control[data-filter-key=\"${key}\"]`);\n if (!control) throw new Error(`Table has no filter control for column \"${key}\" (is it filterable?).`);\n return control;\n }\n\n private headerCells(): MkTestElement[] {\n return this.qAll('th.mk-table__th').filter(\n (th) => !th.hasClass('mk-table__th--expand') && !th.hasClass('mk-table__th--select'),\n );\n }\n}\n","import { MkHarness, MkTestElement, pickBy } from '../harness';\n\n/**\n * A dialog opened by `MkDialogService` (`open()`, `confirm()`, `alert()`,\n * `prompt()`). Dialogs live in `document.body`, so look them up through\n * `loader.document()`.\n */\nexport class MkDialogHarness extends MkHarness {\n static override readonly hostSelector = '.mk-overlay-panel[role=\"dialog\"], .mk-overlay-panel[role=\"alertdialog\"]';\n\n title(): string {\n return this.q('.mk-dialog__title')?.text() ?? this.host.attr('aria-label') ?? '';\n }\n\n bodyText(): string {\n return this.q('.mk-dialog__body')?.text() ?? this.host.text();\n }\n\n /** Texts of every button in the dialog (header close excluded). */\n buttons(): string[] {\n return this.buttonElements().map((b) => b.text());\n }\n\n /** Click a button by index, exact text or RegExp. */\n async clickButton(which: number | string | RegExp): Promise<void> {\n await pickBy(this.buttonElements(), which, (b) => b.text(), 'dialog button').click();\n }\n\n /** The header × button. */\n async close(): Promise<void> {\n const btn = this.q('.mk-dialog__close');\n if (!btn) throw new Error('Dialog has no close button (hideClose).');\n await btn.click();\n }\n\n async pressEscape(): Promise<void> {\n await this.host.sendKeys('Escape');\n }\n\n /** The prompt dialog's text field, if any. */\n input(): MkTestElement | null {\n return this.q('.mk-dialog__body input, .mk-dialog__body textarea');\n }\n\n private buttonElements(): MkTestElement[] {\n return this.qAll('button').filter(\n (b) => !b.hasClass('mk-dialog__close') && !b.hasClass('mk-dialog__grip') && !b.hasClass('mk-dialog__resizer'),\n );\n }\n}\n\n/** One toast shown by `MkToastService` (lives in `document.body` — use `loader.document()`). */\nexport class MkToastHarness extends MkHarness {\n static override readonly hostSelector = 'mk-toast';\n\n title(): string | null {\n return this.q('.mk-toast__title')?.text() ?? null;\n }\n\n message(): string {\n return this.q('.mk-toast__message')?.text() ?? '';\n }\n\n tone(): string | null {\n return this.host.attr('data-tone');\n }\n\n actionLabel(): string | null {\n return this.q('.mk-toast__actions button')?.text() ?? null;\n }\n\n async clickAction(): Promise<void> {\n const btn = this.q('.mk-toast__actions button');\n if (!btn) throw new Error('Toast has no action.');\n await btn.click();\n }\n\n async dismiss(): Promise<void> {\n const btn = this.q('.mk-toast__close');\n if (!btn) throw new Error('Toast is not dismissible.');\n await btn.click();\n }\n}\n","/**\n * `@mk-kit/ui/testing` — component test harnesses.\n *\n * Harnesses drive mk-kit components the way a user does (click the trigger,\n * pick the option, read the label) so specs stay stable when a component's\n * DOM changes. Zero dependencies beyond `@angular/core/testing`; works with\n * zoneless and zone-based TestBeds. Not re-exported from the root\n * `@mk-kit/ui` entry on purpose — it never belongs in an app bundle.\n */\nexport * from './harness';\nexport * from './harnesses/form-controls.harness';\nexport * from './harnesses/navigation.harness';\nexport * from './harnesses/table.harness';\nexport * from './harnesses/overlays.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mk-kit-ui-testing.mjs","sources":["../../../projects/mk-kit/testing/harness.ts","../../../projects/mk-kit/testing/harnesses/form-controls.harness.ts","../../../projects/mk-kit/testing/harnesses/navigation.harness.ts","../../../projects/mk-kit/testing/harnesses/table.harness.ts","../../../projects/mk-kit/testing/harnesses/overlays.harness.ts","../../../projects/mk-kit/testing/index.ts","../../../projects/mk-kit/testing/mk-kit-ui-testing.ts"],"sourcesContent":["import type { ComponentFixture } from '@angular/core/testing';\n\n/**\n * Filters every harness lookup accepts. `selector` narrows the host elements\n * considered (e.g. a class or attribute your template sets); `text` matches\n * the host's trimmed text content — a string must match exactly, a RegExp\n * is tested.\n */\nexport interface MkHarnessFilters {\n selector?: string;\n text?: string | RegExp;\n}\n\n/** Constructor shape of every harness class: a static `hostSelector`. */\nexport interface MkHarnessType<T extends MkHarness> {\n new (host: MkTestElement, loader: MkHarnessLoader): T;\n readonly hostSelector: string;\n}\n\n/** Keys accepted by `MkTestElement.sendKeys` besides printable characters. */\nexport type MkTestKey =\n | 'Enter'\n | 'Escape'\n | 'Tab'\n | 'Backspace'\n | 'Delete'\n | ' '\n | 'ArrowUp'\n | 'ArrowDown'\n | 'ArrowLeft'\n | 'ArrowRight'\n | 'Home'\n | 'End'\n | 'PageUp'\n | 'PageDown';\n\nconst NO_OP = async (): Promise<void> => {};\n\n/**\n * A DOM element wrapped for tests: reads are synchronous, every interaction\n * dispatches the same events a user would and then settles change detection\n * (`fixture.detectChanges()` + `whenStable()`), so the next read sees the\n * updated view.\n */\nexport class MkTestElement {\n constructor(\n /** The underlying element — reach for it when a harness has no getter. */\n readonly native: HTMLElement,\n /** Flush change detection after an interaction. */\n readonly settle: () => Promise<void> = NO_OP,\n ) {}\n\n /** Trimmed text content with whitespace collapsed. */\n text(): string {\n return (this.native.textContent ?? '').replace(/\\s+/g, ' ').trim();\n }\n\n attr(name: string): string | null {\n return this.native.getAttribute(name);\n }\n\n hasClass(name: string): boolean {\n return this.native.classList.contains(name);\n }\n\n /** Read a DOM property (`value`, `checked`, `open`, …). */\n prop<T = unknown>(name: string): T {\n return (this.native as unknown as Record<string, T>)[name];\n }\n\n matches(selector: string): boolean {\n return this.native.matches(selector);\n }\n\n isFocused(): boolean {\n return this.native.ownerDocument.activeElement === this.native;\n }\n\n /** Native `disabled`, `aria-disabled=\"true\"` or a `--disabled` host class. */\n isDisabled(): boolean {\n const el = this.native as HTMLElement & { disabled?: boolean };\n return (\n el.disabled === true ||\n el.getAttribute('aria-disabled') === 'true' ||\n Array.from(el.classList).some((c) => c.endsWith('--disabled'))\n );\n }\n\n query(selector: string): MkTestElement | null {\n const el = this.native.querySelector<HTMLElement>(selector);\n return el ? new MkTestElement(el, this.settle) : null;\n }\n\n queryAll(selector: string): MkTestElement[] {\n return Array.from(this.native.querySelectorAll<HTMLElement>(selector)).map(\n (el) => new MkTestElement(el, this.settle),\n );\n }\n\n /** Like `query`, but throws a readable error when nothing matches. */\n child(selector: string): MkTestElement {\n const el = this.query(selector);\n if (!el) throw new Error(`Expected \"${selector}\" inside <${this.describe()}>.`);\n return el;\n }\n\n /** pointerdown → mousedown → focus → pointerup → mouseup → click, like a user. */\n async click(): Promise<void> {\n const el = this.native;\n el.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, cancelable: true }));\n el.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true }));\n el.focus();\n el.dispatchEvent(new PointerEvent('pointerup', { bubbles: true, cancelable: true }));\n el.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true }));\n el.click();\n await this.settle();\n }\n\n async hover(): Promise<void> {\n for (const type of ['pointerenter', 'mouseenter', 'pointerover', 'mouseover']) {\n this.native.dispatchEvent(new MouseEvent(type, { bubbles: type.endsWith('over') }));\n }\n this.native.dispatchEvent(new MouseEvent('mousemove', { bubbles: true }));\n await this.settle();\n }\n\n async leave(): Promise<void> {\n for (const type of ['pointerleave', 'mouseleave', 'pointerout', 'mouseout']) {\n this.native.dispatchEvent(new MouseEvent(type, { bubbles: type.endsWith('out') }));\n }\n await this.settle();\n }\n\n async focus(): Promise<void> {\n this.native.focus();\n if (!this.isFocused()) this.native.dispatchEvent(new FocusEvent('focus'));\n await this.settle();\n }\n\n async blur(): Promise<void> {\n this.native.blur();\n this.native.dispatchEvent(new FocusEvent('blur'));\n this.native.dispatchEvent(new FocusEvent('focusout', { bubbles: true }));\n await this.settle();\n }\n\n /**\n * Type into an input/textarea/contenteditable character by character —\n * keydown, `value` append, `input`, keyup — then settle. Use `setValue`\n * to replace the value in one go.\n */\n async type(text: string): Promise<void> {\n const el = this.native as HTMLInputElement;\n el.focus();\n for (const ch of text) {\n const down = new KeyboardEvent('keydown', { key: ch, bubbles: true, cancelable: true });\n el.dispatchEvent(down);\n if (!down.defaultPrevented) {\n if (el.isContentEditable) el.textContent = (el.textContent ?? '') + ch;\n else el.value = (el.value ?? '') + ch;\n el.dispatchEvent(new InputEvent('input', { bubbles: true, data: ch, inputType: 'insertText' }));\n }\n el.dispatchEvent(new KeyboardEvent('keyup', { key: ch, bubbles: true }));\n }\n await this.settle();\n }\n\n /** Set the value of an input/textarea/select and fire `input` + `change`. */\n async setValue(value: string): Promise<void> {\n const el = this.native as HTMLInputElement;\n el.focus();\n el.value = value;\n el.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertReplacementText' }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n await this.settle();\n }\n\n async clear(): Promise<void> {\n const el = this.native as HTMLInputElement;\n el.focus();\n el.value = '';\n el.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'deleteContentBackward' }));\n await this.settle();\n }\n\n /** Dispatch keydown/keyup for each key. Printable single characters are also typed. */\n async sendKeys(...keys: Array<MkTestKey | (string & {})>): Promise<void> {\n for (const key of keys) {\n const mods = parseKey(key);\n const down = new KeyboardEvent('keydown', { ...mods, bubbles: true, cancelable: true });\n this.native.dispatchEvent(down);\n if (!down.defaultPrevented && mods.key.length === 1 && !mods.ctrlKey && !mods.metaKey) {\n const el = this.native as HTMLInputElement;\n if ('value' in el && typeof el.value === 'string' && !el.isContentEditable && isTextField(el)) {\n el.value += mods.key;\n el.dispatchEvent(new InputEvent('input', { bubbles: true, data: mods.key, inputType: 'insertText' }));\n }\n }\n this.native.dispatchEvent(new KeyboardEvent('keyup', { ...mods, bubbles: true }));\n }\n await this.settle();\n }\n\n /** Dispatch any event on the element and settle. */\n async dispatch(event: Event): Promise<void> {\n this.native.dispatchEvent(event);\n await this.settle();\n }\n\n private describe(): string {\n const el = this.native;\n const id = el.id ? `#${el.id}` : '';\n const cls = el.classList.length ? `.${Array.from(el.classList).slice(0, 2).join('.')}` : '';\n return `${el.tagName.toLowerCase()}${id}${cls}`;\n }\n}\n\n/** `Control+a`, `Shift+Tab`, `Enter`, `a` → KeyboardEventInit. */\nfunction parseKey(key: string): KeyboardEventInit & { key: string } {\n const parts = key.split('+');\n const k = parts.pop() ?? key;\n const has = (m: string) => parts.some((p) => p.toLowerCase() === m);\n return {\n key: k,\n ctrlKey: has('control') || has('ctrl'),\n metaKey: has('meta') || has('cmd'),\n shiftKey: has('shift'),\n altKey: has('alt'),\n };\n}\n\nfunction isTextField(el: HTMLElement): boolean {\n if (el instanceof HTMLTextAreaElement) return true;\n if (!(el instanceof HTMLInputElement)) return false;\n return !['checkbox', 'radio', 'button', 'submit', 'reset', 'file', 'range', 'color'].includes(el.type);\n}\n\n/**\n * Finds harnesses under a root element. Create one with\n * `MkHarnessLoader.fromFixture(fixture)`; use `.document()` for content that\n * mk-kit teleports into `document.body` (dialogs, toasts, menus, select\n * panels) and `.within(el)` to scope lookups.\n */\nexport class MkHarnessLoader {\n constructor(\n readonly root: Element,\n readonly settle: () => Promise<void>,\n ) {}\n\n /**\n * Loader rooted at the fixture's host element. Every interaction runs\n * `fixture.detectChanges()` and awaits `fixture.whenStable()` afterwards,\n * so it works in zoneless and zone-based TestBeds alike.\n */\n static fromFixture(fixture: ComponentFixture<unknown>): MkHarnessLoader {\n const settle = async () => {\n fixture.detectChanges();\n await fixture.whenStable();\n fixture.detectChanges();\n };\n return new MkHarnessLoader(fixture.nativeElement as Element, settle);\n }\n\n /** Same settle function, rooted at `document.body` — for overlays. */\n document(): MkHarnessLoader {\n return new MkHarnessLoader(this.root.ownerDocument.body, this.settle);\n }\n\n within(root: Element | MkTestElement): MkHarnessLoader {\n return new MkHarnessLoader(root instanceof MkTestElement ? root.native : root, this.settle);\n }\n\n /** Wrap the root element itself. */\n rootElement(): MkTestElement {\n return new MkTestElement(this.root as HTMLElement, this.settle);\n }\n\n element(selector: string): MkTestElement {\n const el = this.root.querySelector<HTMLElement>(selector) ?? (this.root.matches(selector) ? (this.root as HTMLElement) : null);\n if (!el) throw new Error(`No element matches \"${selector}\" under <${this.root.tagName.toLowerCase()}>.`);\n return new MkTestElement(el, this.settle);\n }\n\n elements(selector: string): MkTestElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>(selector)).map((el) => new MkTestElement(el, this.settle));\n }\n\n /**\n * First matching harness; throws when there is none. Retries for a short\n * while first: overlays such as `MkDialogService.prompt()` render after a\n * lazy chunk resolves, so the host may appear a few ticks after the call.\n * `has()` / `getOrNull()` stay immediate so absence can be asserted.\n */\n async get<T extends MkHarness>(type: MkHarnessType<T>, filters: MkHarnessFilters = {}): Promise<T> {\n let first: T | undefined;\n for (let attempt = 0; attempt < 30; attempt++) {\n [first] = await this.getAll(type, filters);\n if (first) break;\n await new Promise((resolve) => setTimeout(resolve, 10));\n }\n if (!first) {\n throw new Error(\n `No ${type.name} found (host \"${type.hostSelector}\"${filters.selector ? `, selector \"${filters.selector}\"` : ''}${\n filters.text ? `, text ${String(filters.text)}` : ''\n }) under <${this.root.tagName.toLowerCase()}>.`,\n );\n }\n return first;\n }\n\n async getOrNull<T extends MkHarness>(type: MkHarnessType<T>, filters: MkHarnessFilters = {}): Promise<T | null> {\n const [first] = await this.getAll(type, filters);\n return first ?? null;\n }\n\n async has<T extends MkHarness>(type: MkHarnessType<T>, filters: MkHarnessFilters = {}): Promise<boolean> {\n return (await this.getAll(type, filters)).length > 0;\n }\n\n async getAll<T extends MkHarness>(type: MkHarnessType<T>, filters: MkHarnessFilters = {}): Promise<T[]> {\n await this.settle();\n const hosts = new Set<HTMLElement>();\n for (const part of type.hostSelector.split(',')) {\n const sel = part.trim();\n if (this.root.matches(sel)) hosts.add(this.root as HTMLElement);\n for (const el of Array.from(this.root.querySelectorAll<HTMLElement>(sel))) hosts.add(el);\n }\n const out: T[] = [];\n for (const host of hosts) {\n if (filters.selector && !host.matches(filters.selector)) continue;\n const el = new MkTestElement(host, this.settle);\n if (filters.text !== undefined && !matchText(el.text(), filters.text)) continue;\n out.push(new type(el, this));\n }\n // Document order.\n out.sort((a, b) => (a.host.native.compareDocumentPosition(b.host.native) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1));\n return out;\n }\n}\n\nexport function matchText(actual: string, expected: string | RegExp): boolean {\n return typeof expected === 'string' ? actual === expected : expected.test(actual);\n}\n\n/**\n * Base class of every mk-kit harness. Subclasses declare `hostSelector`\n * and expose user-level actions (`click()`, `selectOption()`, …) and reads\n * (`isChecked()`, `text()`), so specs never depend on the component's DOM.\n */\nexport abstract class MkHarness {\n static readonly hostSelector: string = '';\n\n constructor(\n /** The component's host element. */\n readonly host: MkTestElement,\n protected readonly loader: MkHarnessLoader,\n ) {}\n\n protected settle(): Promise<void> {\n return this.loader.settle();\n }\n\n /** Query inside the host. */\n protected q(selector: string): MkTestElement | null {\n return this.host.query(selector);\n }\n\n protected qAll(selector: string): MkTestElement[] {\n return this.host.queryAll(selector);\n }\n\n /** Query the whole document — for panels teleported to `document.body`. */\n protected qDocument(selector: string): MkTestElement | null {\n const el = this.host.native.ownerDocument.querySelector<HTMLElement>(selector);\n return el ? new MkTestElement(el, this.host.settle) : null;\n }\n\n /** Element referenced by an `aria-controls` / `aria-owns` id on `from`. */\n protected controlled(from: MkTestElement, attribute = 'aria-controls'): MkTestElement | null {\n const id = from.attr(attribute);\n if (!id) return null;\n const el = this.host.native.ownerDocument.getElementById(id);\n return el ? new MkTestElement(el, this.host.settle) : null;\n }\n}\n\n/** Resolve \"by index or by label\" arguments shared by option-style harnesses. */\nexport function pickBy<T>(items: T[], which: number | string | RegExp, label: (item: T) => string, what: string): T {\n const item =\n typeof which === 'number'\n ? items[which]\n : items.find((i) => matchText(label(i), which));\n if (!item) {\n throw new Error(\n `No ${what} ${typeof which === 'number' ? `at index ${which}` : `matching ${String(which)}`}. Available: ${items\n .map((i) => JSON.stringify(label(i)))\n .join(', ') || '(none)'}.`,\n );\n }\n return item;\n}\n","import { MkHarness, MkTestElement, pickBy } from '../harness';\n\n/** `button[mkButton]` / `a[mkButton]`. */\nexport class MkButtonHarness extends MkHarness {\n static override readonly hostSelector = 'button[mkButton], a[mkButton], .mk-button';\n\n text(): string {\n return this.host.text();\n }\n\n async click(): Promise<void> {\n await this.host.click();\n }\n\n async focus(): Promise<void> {\n await this.host.focus();\n }\n\n isDisabled(): boolean {\n return this.host.isDisabled();\n }\n\n isLoading(): boolean {\n return this.host.hasClass('mk-button--loading');\n }\n\n tone(): string | null {\n return this.host.attr('data-tone');\n }\n\n /** `solid` | `soft` | `outline` | `ghost` | `link`. */\n variant(): string | null {\n const m = Array.from(this.host.native.classList).find((c) =>\n /^mk-button--(solid|soft|outline|ghost|link)$/.test(c),\n );\n return m ? m.replace('mk-button--', '') : null;\n }\n\n size(): string | null {\n const m = Array.from(this.host.native.classList).find((c) => /^mk-button--(sm|md|lg)$/.test(c));\n return m ? m.replace('mk-button--', '') : null;\n }\n}\n\n/** Native `input[mkInput]` / `textarea[mkInput]`. */\nexport class MkInputHarness extends MkHarness {\n static override readonly hostSelector = '[mkInput], .mk-input';\n\n value(): string {\n return this.host.prop<string>('value') ?? '';\n }\n\n /** Replace the value (fires `input` + `change`). */\n async setValue(value: string): Promise<void> {\n await this.host.setValue(value);\n }\n\n /** Append text one character at a time (keydown / input / keyup). */\n async type(text: string): Promise<void> {\n await this.host.type(text);\n }\n\n async clear(): Promise<void> {\n await this.host.clear();\n }\n\n async focus(): Promise<void> {\n await this.host.focus();\n }\n\n async blur(): Promise<void> {\n await this.host.blur();\n }\n\n placeholder(): string {\n return this.host.attr('placeholder') ?? '';\n }\n\n type_(): string {\n return this.host.attr('type') ?? (this.host.native.tagName === 'TEXTAREA' ? 'textarea' : 'text');\n }\n\n isDisabled(): boolean {\n return this.host.isDisabled();\n }\n\n isInvalid(): boolean {\n return this.host.hasClass('mk-input--invalid') || this.host.attr('aria-invalid') === 'true';\n }\n\n isRequired(): boolean {\n return this.host.prop<boolean>('required') === true || this.host.attr('aria-required') === 'true';\n }\n\n isFocused(): boolean {\n return this.host.isFocused();\n }\n}\n\n/** `mk-checkbox`. */\nexport class MkCheckboxHarness extends MkHarness {\n static override readonly hostSelector = 'mk-checkbox';\n\n private get input(): MkTestElement {\n return this.host.child('input[type=\"checkbox\"]');\n }\n\n label(): string {\n return this.q('.mk-checkbox__text')?.text() ?? '';\n }\n\n isChecked(): boolean {\n return this.input.prop<boolean>('checked') === true;\n }\n\n isIndeterminate(): boolean {\n return this.input.prop<boolean>('indeterminate') === true;\n }\n\n isDisabled(): boolean {\n return this.input.isDisabled();\n }\n\n isRequired(): boolean {\n return this.input.prop<boolean>('required') === true;\n }\n\n async toggle(): Promise<void> {\n await this.input.click();\n }\n\n async check(): Promise<void> {\n if (!this.isChecked()) await this.toggle();\n }\n\n async uncheck(): Promise<void> {\n if (this.isChecked()) await this.toggle();\n }\n\n async focus(): Promise<void> {\n await this.input.focus();\n }\n\n async blur(): Promise<void> {\n await this.input.blur();\n }\n}\n\n/** `mk-switch`. */\nexport class MkSwitchHarness extends MkHarness {\n static override readonly hostSelector = 'mk-switch';\n\n private get control(): MkTestElement {\n return this.host.child('[role=\"switch\"]');\n }\n\n label(): string {\n return this.q('.mk-switch__label')?.text() ?? '';\n }\n\n isChecked(): boolean {\n return this.control.attr('aria-checked') === 'true';\n }\n\n isDisabled(): boolean {\n return this.control.isDisabled();\n }\n\n async toggle(): Promise<void> {\n await this.control.click();\n }\n\n async check(): Promise<void> {\n if (!this.isChecked()) await this.toggle();\n }\n\n async uncheck(): Promise<void> {\n if (this.isChecked()) await this.toggle();\n }\n\n async focus(): Promise<void> {\n await this.control.focus();\n }\n}\n\n/** One `mk-radio` inside a group. */\nexport class MkRadioHarness extends MkHarness {\n static override readonly hostSelector = 'mk-radio';\n\n label(): string {\n return this.q('.mk-radio__label')?.text() ?? this.host.text();\n }\n\n isChecked(): boolean {\n return this.host.attr('aria-checked') === 'true';\n }\n\n isDisabled(): boolean {\n return this.host.isDisabled();\n }\n\n async select(): Promise<void> {\n await this.host.click();\n }\n\n async focus(): Promise<void> {\n await this.host.focus();\n }\n}\n\n/** `mk-radio-group`. */\nexport class MkRadioGroupHarness extends MkHarness {\n static override readonly hostSelector = 'mk-radio-group';\n\n radios(): Promise<MkRadioHarness[]> {\n return this.loader.within(this.host).getAll(MkRadioHarness);\n }\n\n async labels(): Promise<string[]> {\n return (await this.radios()).map((r) => r.label());\n }\n\n /** Label of the checked radio, or `null`. */\n async checkedLabel(): Promise<string | null> {\n return (await this.radios()).find((r) => r.isChecked())?.label() ?? null;\n }\n\n async checkedIndex(): Promise<number> {\n return (await this.radios()).findIndex((r) => r.isChecked());\n }\n\n /** Select by index, exact label or RegExp. */\n async select(which: number | string | RegExp): Promise<void> {\n const radios = await this.radios();\n await pickBy(radios, which, (r) => r.label(), 'radio').select();\n }\n\n isDisabled(): boolean {\n return this.host.hasClass('mk-radio-group--disabled');\n }\n}\n\nexport interface MkSelectOptionState {\n label: string;\n selected: boolean;\n disabled: boolean;\n}\n\n/** `mk-select` — opens the teleported listbox and picks options like a user. */\nexport class MkSelectHarness extends MkHarness {\n static override readonly hostSelector = 'mk-select';\n\n private get trigger(): MkTestElement {\n return this.host.child('[role=\"combobox\"]');\n }\n\n /** Label of the selected option, or `''` when only the placeholder shows. */\n valueText(): string {\n const v = this.q('.mk-select__value');\n return v && !v.hasClass('mk-select__value--placeholder') ? v.text() : '';\n }\n\n placeholder(): string {\n return this.q('.mk-select__value--placeholder')?.text() ?? '';\n }\n\n isOpen(): boolean {\n return this.trigger.attr('aria-expanded') === 'true';\n }\n\n isDisabled(): boolean {\n return this.trigger.isDisabled();\n }\n\n isInvalid(): boolean {\n return this.trigger.attr('aria-invalid') === 'true';\n }\n\n async open(): Promise<void> {\n if (!this.isOpen()) await this.trigger.click();\n }\n\n async close(): Promise<void> {\n if (this.isOpen()) await this.trigger.sendKeys('Escape');\n if (this.isOpen()) await this.trigger.click();\n }\n\n async focus(): Promise<void> {\n await this.trigger.focus();\n }\n\n /** Options of the (opened) listbox. Opens it if needed. */\n async options(): Promise<MkSelectOptionState[]> {\n const els = await this.optionElements();\n return els.map((el) => ({\n label: el.text(),\n selected: el.attr('aria-selected') === 'true',\n disabled: el.attr('aria-disabled') === 'true',\n }));\n }\n\n /** Pick an option by index, exact label or RegExp (opens the list first). */\n async selectOption(which: number | string | RegExp): Promise<void> {\n const els = await this.optionElements();\n await pickBy(els, which, (el) => el.text(), 'option').click();\n }\n\n private async optionElements(): Promise<MkTestElement[]> {\n await this.open();\n const list = this.controlled(this.trigger);\n if (!list) throw new Error('mk-select listbox did not open.');\n return list.queryAll('[role=\"option\"]');\n }\n}\n\n/** `mk-form-field` — label / hint / error around any control. */\nexport class MkFormFieldHarness extends MkHarness {\n static override readonly hostSelector = 'mk-form-field';\n\n label(): string {\n return this.q('.mk-form-field__label-text')?.text() ?? '';\n }\n\n hint(): string | null {\n return this.q('.mk-form-field__hint')?.text() ?? null;\n }\n\n /** The visible validation message, or `null` when the field is valid/untouched. */\n error(): string | null {\n return this.q('.mk-form-field__error')?.text() ?? null;\n }\n\n hasError(): boolean {\n return this.error() !== null;\n }\n\n isRequired(): boolean {\n return !!this.q('.mk-form-field__required');\n }\n\n /** The control inside the field, as a harness of the given type. */\n control<T extends MkHarness>(type: Parameters<typeof this.loader.get<T>>[0]): Promise<T> {\n return this.loader.within(this.host).get(type);\n }\n}\n","import { MkHarness, MkTestElement, pickBy } from '../harness';\n\n/** `mk-tabs`. */\nexport class MkTabsHarness extends MkHarness {\n static override readonly hostSelector = 'mk-tabs';\n\n private tabButtons(): MkTestElement[] {\n return this.qAll('[role=\"tab\"]');\n }\n\n labels(): string[] {\n return this.tabButtons().map((t) => t.text());\n }\n\n selectedIndex(): number {\n return this.tabButtons().findIndex((t) => t.attr('aria-selected') === 'true');\n }\n\n selectedLabel(): string | null {\n const i = this.selectedIndex();\n return i >= 0 ? this.labels()[i] : null;\n }\n\n /** Select by index, exact label or RegExp. */\n async select(which: number | string | RegExp): Promise<void> {\n await pickBy(this.tabButtons(), which, (t) => t.text(), 'tab').click();\n }\n\n isDisabled(which: number | string | RegExp): boolean {\n return pickBy(this.tabButtons(), which, (t) => t.text(), 'tab').isDisabled();\n }\n\n /** The visible tab panel (`mk-tab` host). */\n selectedPanel(): MkTestElement | null {\n const tab = this.tabButtons()[this.selectedIndex()];\n return tab ? this.controlled(tab) : null;\n }\n\n /** Text of the visible panel. */\n selectedPanelText(): string {\n return this.selectedPanel()?.text() ?? '';\n }\n}\n\n/**\n * A `[mkMenuTriggerFor]` trigger and the `mk-menu` panel it opens. The host\n * is matched by the trigger's `aria-haspopup=\"menu\"` (the directive's\n * attribute is an input binding, so it is not in the DOM).\n */\nexport class MkMenuHarness extends MkHarness {\n static override readonly hostSelector = '[aria-haspopup=\"menu\"]';\n\n isOpen(): boolean {\n return this.host.attr('aria-expanded') === 'true';\n }\n\n async open(): Promise<void> {\n if (!this.isOpen()) await this.host.click();\n }\n\n async close(): Promise<void> {\n if (this.isOpen()) await this.panel()?.sendKeys('Escape');\n if (this.isOpen()) await this.host.click();\n }\n\n /** The teleported panel (`[role=\"menu\"]`), or `null` while closed. */\n panel(): MkTestElement | null {\n return this.controlled(this.host);\n }\n\n /** Item texts of the open menu (opens it if needed). Submenu panels excluded. */\n async items(): Promise<string[]> {\n return (await this.itemElements()).map((i) => i.text());\n }\n\n /** Click an item by index, exact text or RegExp (opens the menu first). */\n async clickItem(which: number | string | RegExp): Promise<void> {\n await pickBy(await this.itemElements(), which, (i) => i.text(), 'menu item').click();\n }\n\n async isItemDisabled(which: number | string | RegExp): Promise<boolean> {\n return pickBy(await this.itemElements(), which, (i) => i.text(), 'menu item').isDisabled();\n }\n\n private async itemElements(): Promise<MkTestElement[]> {\n await this.open();\n const panel = this.panel();\n if (!panel) throw new Error('mk-menu panel did not open.');\n return panel.queryAll('[role=\"menuitem\"]');\n }\n}\n","import { MkHarness, MkTestElement, pickBy } from '../harness';\nimport { MkCheckboxHarness } from './form-controls.harness';\n\n/** One data row of `mk-table`. */\nexport class MkTableRowHarness extends MkHarness {\n static override readonly hostSelector = 'tr.mk-table__row';\n\n /** Cell texts of the data columns (expand / select cells excluded). */\n cells(): string[] {\n return this.dataCells().map((c) => c.text());\n }\n\n cell(index: number): string {\n return this.cells()[index] ?? '';\n }\n\n isSelected(): boolean {\n return this.host.hasClass('mk-table__row--selected');\n }\n\n isExpanded(): boolean {\n return this.host.hasClass('mk-table__row--expanded') || this.host.attr('aria-expanded') === 'true';\n }\n\n async click(): Promise<void> {\n await this.host.click();\n }\n\n /** Toggle the selection checkbox (throws when the table is not `selectable`). */\n async toggleSelected(): Promise<void> {\n const cb = await this.loader.within(this.host.child('.mk-table__td--select')).get(MkCheckboxHarness);\n await cb.toggle();\n }\n\n /** Toggle the expand / tree control of the row. */\n async toggleExpanded(): Promise<void> {\n const btn = this.q('.mk-table__td--expand button') ?? this.q('.mk-table__tree-toggle') ?? this.q('button[aria-expanded]');\n if (!btn) throw new Error('Row has no expand toggle (table is not expandable / has no children).');\n await btn.click();\n }\n\n private dataCells(): MkTestElement[] {\n return this.qAll('td.mk-table__td').filter(\n (c) => !c.hasClass('mk-table__td--expand') && !c.hasClass('mk-table__td--select'),\n );\n }\n}\n\n/** `mk-table`. */\nexport class MkTableHarness extends MkHarness {\n static override readonly hostSelector = 'mk-table';\n\n /** Header labels of the data columns, in display order. */\n headers(): string[] {\n return this.headerCells().map((th) => th.child('.mk-table__th-label').text());\n }\n\n rows(): Promise<MkTableRowHarness[]> {\n return this.loader.within(this.host).getAll(MkTableRowHarness);\n }\n\n async rowCount(): Promise<number> {\n return (await this.rows()).length;\n }\n\n /** Every data cell as text: `rows()[r].cells()`. */\n async cellTexts(): Promise<string[][]> {\n return (await this.rows()).map((r) => r.cells());\n }\n\n /** Click a sortable header (by index, exact label or RegExp). */\n async sortBy(which: number | string | RegExp): Promise<void> {\n const th = pickBy(this.headerCells(), which, (h) => h.child('.mk-table__th-label').text(), 'column');\n const btn = th.query('.mk-table__th-button');\n if (!btn) throw new Error(`Column \"${th.text()}\" is not sortable.`);\n await btn.click();\n }\n\n /** `'ascending' | 'descending' | 'none' | null` (null = not sortable). */\n sortDirection(which: number | string | RegExp): string | null {\n return pickBy(this.headerCells(), which, (h) => h.child('.mk-table__th-label').text(), 'column').attr('aria-sort');\n }\n\n async selectedRowCount(): Promise<number> {\n return (await this.rows()).filter((r) => r.isSelected()).length;\n }\n\n /** Toggle the header \"select all\" checkbox. */\n async toggleAll(): Promise<void> {\n const th = this.q('.mk-table__th--select');\n if (!th) throw new Error('Table is not selectable.');\n await (await this.loader.within(th).get(MkCheckboxHarness)).toggle();\n }\n\n isEmpty(): boolean {\n return !this.q('tr.mk-table__row');\n }\n\n /**\n * Set a header-row filter (table is `filterable`). `value` is typed into\n * a text / number / date box, or picked from a select by option label or\n * value; `''` clears that filter.\n */\n async setFilter(key: string, value: string): Promise<void> {\n const control = this.filterControl(key);\n if (control.native instanceof HTMLSelectElement) {\n const options = Array.from(control.native.options);\n const match =\n value === ''\n ? options[0]\n : options.find((o) => o.value === value || o.textContent?.trim() === value);\n if (!match) throw new Error(`Filter \"${key}\" has no option \"${value}\".`);\n await control.setValue(match.value);\n return;\n }\n await control.setValue(value);\n }\n\n /** The current value of a header-row filter control (`''` when unset). */\n filterValue(key: string): string {\n return (this.filterControl(key).native as HTMLInputElement).value ?? '';\n }\n\n /** Clear every header-row filter. */\n async clearFilters(): Promise<void> {\n for (const control of this.qAll('.mk-table__filter-control')) {\n if ((control.native as HTMLInputElement).value !== '') await control.setValue('');\n }\n }\n\n /**\n * Scroll a `virtual` table so the row at display `index` is at the top of\n * the viewport (drives the scroll box, so only the rows around it render).\n */\n async scrollToRow(index: number): Promise<void> {\n const scroller = this.q('.mk-table__scroll');\n if (!scroller) throw new Error('Table has no scroll container.');\n const rowHeight = Number(scroller.attr('data-row-height')) || 44;\n const top = Math.max(0, index) * rowHeight;\n const el = scroller.native;\n el.scrollTop = top;\n if (el.scrollTop !== top) {\n // jsdom has no layout, so scrollTop does not stick — pin it.\n Object.defineProperty(el, 'scrollTop', { value: top, configurable: true, writable: true });\n }\n await scroller.dispatch(new Event('scroll', { bubbles: false }));\n }\n\n private filterControl(key: string): MkTestElement {\n const control = this.q(`.mk-table__filter-control[data-filter-key=\"${key}\"]`);\n if (!control) throw new Error(`Table has no filter control for column \"${key}\" (is it filterable?).`);\n return control;\n }\n\n private headerCells(): MkTestElement[] {\n return this.qAll('th.mk-table__th').filter(\n (th) => !th.hasClass('mk-table__th--expand') && !th.hasClass('mk-table__th--select'),\n );\n }\n}\n","import { MkHarness, MkTestElement, pickBy } from '../harness';\n\n/**\n * A dialog opened by `MkDialogService` (`open()`, `confirm()`, `alert()`,\n * `prompt()`). Dialogs live in `document.body`, so look them up through\n * `loader.document()`.\n */\nexport class MkDialogHarness extends MkHarness {\n static override readonly hostSelector = '.mk-overlay-panel[role=\"dialog\"], .mk-overlay-panel[role=\"alertdialog\"]';\n\n title(): string {\n return this.q('.mk-dialog__title')?.text() ?? this.host.attr('aria-label') ?? '';\n }\n\n bodyText(): string {\n return this.q('.mk-dialog__body')?.text() ?? this.host.text();\n }\n\n /** Texts of every button in the dialog (header close excluded). */\n buttons(): string[] {\n return this.buttonElements().map((b) => b.text());\n }\n\n /** Click a button by index, exact text or RegExp. */\n async clickButton(which: number | string | RegExp): Promise<void> {\n await pickBy(this.buttonElements(), which, (b) => b.text(), 'dialog button').click();\n }\n\n /** The header × button. */\n async close(): Promise<void> {\n const btn = this.q('.mk-dialog__close');\n if (!btn) throw new Error('Dialog has no close button (hideClose).');\n await btn.click();\n }\n\n async pressEscape(): Promise<void> {\n await this.host.sendKeys('Escape');\n }\n\n /** The prompt dialog's text field, if any. */\n input(): MkTestElement | null {\n return this.q('.mk-dialog__body input, .mk-dialog__body textarea');\n }\n\n private buttonElements(): MkTestElement[] {\n return this.qAll('button').filter(\n (b) => !b.hasClass('mk-dialog__close') && !b.hasClass('mk-dialog__grip') && !b.hasClass('mk-dialog__resizer'),\n );\n }\n}\n\n/** One toast shown by `MkToastService` (lives in `document.body` — use `loader.document()`). */\nexport class MkToastHarness extends MkHarness {\n static override readonly hostSelector = 'mk-toast';\n\n title(): string | null {\n return this.q('.mk-toast__title')?.text() ?? null;\n }\n\n message(): string {\n return this.q('.mk-toast__message')?.text() ?? '';\n }\n\n tone(): string | null {\n return this.host.attr('data-tone');\n }\n\n actionLabel(): string | null {\n return this.q('.mk-toast__actions button')?.text() ?? null;\n }\n\n async clickAction(): Promise<void> {\n const btn = this.q('.mk-toast__actions button');\n if (!btn) throw new Error('Toast has no action.');\n await btn.click();\n }\n\n async dismiss(): Promise<void> {\n const btn = this.q('.mk-toast__close');\n if (!btn) throw new Error('Toast is not dismissible.');\n await btn.click();\n }\n}\n","/**\n * `@mk-kit/ui/testing` — component test harnesses.\n *\n * Harnesses drive mk-kit components the way a user does (click the trigger,\n * pick the option, read the label) so specs stay stable when a component's\n * DOM changes. Zero dependencies beyond `@angular/core/testing`; works with\n * zoneless and zone-based TestBeds. Not re-exported from the root\n * `@mk-kit/ui` entry on purpose — it never belongs in an app bundle.\n */\nexport * from './harness';\nexport * from './harnesses/form-controls.harness';\nexport * from './harnesses/navigation.harness';\nexport * from './harnesses/table.harness';\nexport * from './harnesses/overlays.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}