@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.
- package/fesm2022/mk-kit-ui-block-editor.mjs +2 -1
- package/fesm2022/mk-kit-ui-block-editor.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-checkbox.mjs +2 -1
- package/fesm2022/mk-kit-ui-checkbox.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-core-signal-forms.mjs +56 -0
- package/fesm2022/mk-kit-ui-core-signal-forms.mjs.map +1 -0
- package/fesm2022/mk-kit-ui-core.mjs +1 -43
- package/fesm2022/mk-kit-ui-core.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-data.mjs +2 -1
- package/fesm2022/mk-kit-ui-data.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-datetime.mjs +2 -1
- package/fesm2022/mk-kit-ui-datetime.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-feedback-prompt-dialog-DnxQ7M0h.mjs +49 -0
- package/fesm2022/mk-kit-ui-feedback-prompt-dialog-DnxQ7M0h.mjs.map +1 -0
- package/fesm2022/mk-kit-ui-feedback.mjs +7 -43
- package/fesm2022/mk-kit-ui-feedback.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-forms.mjs +2 -1
- package/fesm2022/mk-kit-ui-forms.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-rich-text.mjs +2 -1
- package/fesm2022/mk-kit-ui-rich-text.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-testing.mjs +13 -2
- package/fesm2022/mk-kit-ui-testing.mjs.map +1 -1
- package/fesm2022/mk-kit-ui.mjs +1 -0
- package/fesm2022/mk-kit-ui.mjs.map +1 -1
- package/package.json +5 -1
- package/types/mk-kit-ui-core-signal-forms.d.ts +31 -0
- package/types/mk-kit-ui-core.d.ts +1 -29
- package/types/mk-kit-ui-feedback.d.ts +1 -22
- package/types/mk-kit-ui-testing.d.ts +6 -1
- package/types/mk-kit-ui.d.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mk-kit-ui-feedback.mjs","sources":["../../../projects/mk-kit/feedback/alert/alert.ts","../../../projects/mk-kit/feedback/alert/alert.html","../../../projects/mk-kit/feedback/tooltip/tooltip.ts","../../../projects/mk-kit/feedback/tooltip/tooltip.html","../../../projects/mk-kit/feedback/popover/popover.ts","../../../projects/mk-kit/feedback/popover/popover.html","../../../projects/mk-kit/feedback/popover/popover-trigger.ts","../../../projects/mk-kit/feedback/popover/popconfirm.ts","../../../projects/mk-kit/feedback/popover/popconfirm.html","../../../projects/mk-kit/feedback/popover/popconfirm-trigger.ts","../../../projects/mk-kit/feedback/result/result.ts","../../../projects/mk-kit/feedback/result/result.html","../../../projects/mk-kit/feedback/hovercard/hovercard.ts","../../../projects/mk-kit/feedback/hovercard/hovercard.html","../../../projects/mk-kit/feedback/hovercard/hovercard-trigger.ts","../../../projects/mk-kit/feedback/notification-center/notification-center.ts","../../../projects/mk-kit/feedback/notification-center/notification-center.html","../../../projects/mk-kit/feedback/dialog/dialog.ts","../../../projects/mk-kit/feedback/dialog/dialog.html","../../../projects/mk-kit/feedback/dialog/confirm-dialog.ts","../../../projects/mk-kit/feedback/dialog/confirm-dialog.html","../../../projects/mk-kit/feedback/dialog/prompt-dialog.ts","../../../projects/mk-kit/feedback/dialog/prompt-dialog.html","../../../projects/mk-kit/feedback/dialog/dialog.service.ts","../../../projects/mk-kit/feedback/toast/toast.ts","../../../projects/mk-kit/feedback/toast/toast.html","../../../projects/mk-kit/feedback/toast/toast-container.ts","../../../projects/mk-kit/feedback/toast/toast-container.html","../../../projects/mk-kit/feedback/toast/toast.service.ts","../../../projects/mk-kit/feedback/snackbar/snackbar.ts","../../../projects/mk-kit/feedback/snackbar/snackbar.html","../../../projects/mk-kit/feedback/snackbar/snackbar-container.ts","../../../projects/mk-kit/feedback/snackbar/snackbar-container.html","../../../projects/mk-kit/feedback/snackbar/snackbar.service.ts","../../../projects/mk-kit/feedback/bottom-sheet/bottom-sheet.ts","../../../projects/mk-kit/feedback/bottom-sheet/bottom-sheet.html","../../../projects/mk-kit/feedback/bottom-sheet/bottom-sheet.service.ts","../../../projects/mk-kit/feedback/banner/banner.ts","../../../projects/mk-kit/feedback/banner/banner.html","../../../projects/mk-kit/feedback/loading-bar/loading-bar.service.ts","../../../projects/mk-kit/feedback/loading-bar/loading-bar.ts","../../../projects/mk-kit/feedback/tour/tour-popup.ts","../../../projects/mk-kit/feedback/tour/tour-popup.html","../../../projects/mk-kit/feedback/tour/tour.service.ts","../../../projects/mk-kit/feedback/block-ui/block-ui.ts","../../../projects/mk-kit/feedback/index.ts","../../../projects/mk-kit/feedback/mk-kit-ui-feedback.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n output,\n inject,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** Semantic tones supported by {@link MkAlert}. */\nexport type MkAlertTone = 'info' | 'success' | 'warning' | 'danger' | 'neutral';\n\n/** Visual treatments supported by {@link MkAlert}. */\nexport type MkAlertVariant = 'soft' | 'solid' | 'outline';\n\n/**\n * Alert — an inline banner that communicates a contextual status message.\n * Fully themed via `--mk-*` tokens using the same tone/local-var pattern as\n * the Button. Danger/warning alerts use `role=\"alert\"` (assertive), all other\n * tones use `role=\"status\"` (polite).\n *\n * ```html\n * <mk-alert tone=\"success\" title=\"Saved\">Your changes were saved.</mk-alert>\n *\n * <mk-alert tone=\"danger\" variant=\"outline\" dismissible (dismissed)=\"hide()\">\n * <svg mkAlertIcon>…</svg>\n * Could not reach the server.\n * </mk-alert>\n * ```\n */\n@Component({\n selector: 'mk-alert',\n templateUrl: './alert.html',\n styleUrl: './alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-alert',\n '[attr.data-tone]': 'tone()',\n '[class.mk-alert--soft]': \"variant() === 'soft'\",\n '[class.mk-alert--solid]': \"variant() === 'solid'\",\n '[class.mk-alert--outline]': \"variant() === 'outline'\",\n '[attr.role]': 'role()',\n },\n})\nexport class MkAlert {\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n /** Semantic color tone. */\n readonly tone = input<MkAlertTone>('info');\n /** Visual treatment. */\n readonly variant = input<MkAlertVariant>('soft');\n /** Optional bold heading rendered above the message. */\n readonly title = input<string>();\n /** When set, renders a keyboard-accessible close button that emits `dismissed`. */\n readonly dismissible = input(false, { transform: booleanAttribute });\n\n /** Emitted when the user activates the close button. */\n readonly dismissed = output<void>();\n\n /** Assertive roles for urgent tones, polite `status` otherwise. */\n protected readonly role = computed(() =>\n this.tone() === 'danger' || this.tone() === 'warning' ? 'alert' : 'status',\n );\n\n protected onDismiss(): void {\n this.dismissed.emit();\n }\n}\n","<span class=\"mk-alert__icon\" aria-hidden=\"true\">\n <ng-content select=\"[mkAlertIcon]\" />\n</span>\n\n<div class=\"mk-alert__content\">\n @if (title(); as heading) {\n <p class=\"mk-alert__title\">{{ heading }}</p>\n }\n <div class=\"mk-alert__message\"><ng-content /></div>\n</div>\n\n@if (dismissible()) {\n <button\n type=\"button\"\n class=\"mk-alert__close\"\n [attr.aria-label]=\"i18n.dismiss\"\n (click)=\"onDismiss()\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n}\n","import {\n ApplicationRef,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n DOCUMENT,\n Directive,\n ElementRef,\n EnvironmentInjector,\n PLATFORM_ID,\n createComponent,\n inject,\n input,\n booleanAttribute,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MK_OVERLAY_ROOT } from '@mk-kit/ui/core';\nimport { mkComputeAnchoredPosition } from '@mk-kit/ui/core';\nimport type { MkPlacement } from '@mk-kit/ui/core';\n\n/** Delay (ms) before a pointer-triggered tooltip opens. Focus opens instantly. */\nconst OPEN_DELAY = 400;\n\n/**\n * Grace period (ms) after the pointer leaves the trigger (or the panel) before\n * the tooltip hides. Long enough to cross the 8px gap onto the panel — WCAG\n * 1.4.13 \"hoverable\" — without making the tip feel sticky.\n */\nconst CLOSE_DELAY = 150;\n\n/**\n * Body-level presentation surface for {@link MkTooltip}. Rendered imperatively\n * by the directive; not intended for direct template use.\n */\n@Component({\n selector: 'mk-tooltip',\n templateUrl: './tooltip.html',\n styleUrl: './tooltip.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-tooltip',\n role: 'tooltip',\n '[attr.id]': 'id()',\n '[attr.data-placement]': 'placement()',\n '[class.mk-tooltip--visible]': 'visible()',\n },\n})\nexport class MkTooltipPanel {\n /** Text content shown inside the tooltip. */\n readonly text = input('');\n /** DOM id used to wire `aria-describedby` on the trigger. */\n readonly id = input<string>();\n /** Resolved placement relative to the trigger. */\n readonly placement = input<MkPlacement>('top');\n /** Drives the entrance/exit transition. */\n readonly visible = input(false, { transform: booleanAttribute });\n}\n\n/**\n * Tooltip directive — shows a themed tooltip on hover AND keyboard focus, and\n * hides on blur, mouse-leave (after a short grace period — the pointer may\n * move onto the tooltip itself, which keeps it open, per WCAG 1.4.13), or\n * Escape pressed anywhere while it is visible. The tooltip is appended to\n * `document.body`, positioned relative to the host, and wired to the host via\n * `aria-describedby` for screen-reader users. Respects `prefers-reduced-motion`.\n *\n * ```html\n * <button mkButton [mkTooltip]=\"'Delete row'\" mkTooltipPlacement=\"bottom\">\n * <svg>…</svg>\n * </button>\n * ```\n */\n@Directive({\n selector: '[mkTooltip]',\n host: {\n '(mouseenter)': 'onPointerEnter()',\n '(mouseleave)': 'onPointerLeave()',\n '(focusin)': 'onFocus()',\n '(focusout)': 'hide()',\n '(keydown.escape)': 'hide()',\n // A tooltip must not outlive the interaction that spawned it. Without\n // this, tapping a tooltipped control leaves the tip on screen — and since\n // tooltips deliberately sit ABOVE dialogs (so a tip inside a modal is\n // visible), a stale one floats over whatever the tap just opened.\n // Exception: a TOUCH tap on the trigger of a hidden tooltip SHOWS it —\n // touch has no hover, so this is the only way a finger reaches the tip.\n '(pointerdown)': 'onPointerDown($event)',\n },\n})\nexport class MkTooltip {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly overlayRoot = inject(MK_OVERLAY_ROOT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n /** Set by pointerdown so the focusin it causes doesn't re-open the tip. */\n private suppressFocusShow = false;\n\n /** Tooltip text. When empty the tooltip is suppressed. */\n readonly mkTooltip = input('');\n /** Preferred placement relative to the host. */\n readonly mkTooltipPlacement = input<MkPlacement>('top');\n\n private readonly tooltipId = mkUniqueId('mk-tooltip');\n private ref?: ComponentRef<MkTooltipPanel>;\n private openTimer?: ReturnType<typeof setTimeout>;\n private hideTimer?: ReturnType<typeof setTimeout>;\n private previousDescribedBy: string | null = null;\n\n /**\n * Hovering the tooltip itself keeps it open (WCAG 1.4.13 \"hoverable\"): the\n * pointer may cross the gap between trigger and panel, so leaving either one\n * only SCHEDULES a hide, and entering either one cancels it.\n */\n private readonly onPanelEnter = (): void => {\n clearTimeout(this.hideTimer);\n };\n private readonly onPanelLeave = (): void => {\n this.scheduleHide();\n };\n\n /**\n * WCAG 1.4.13 \"dismissible\": Escape hides a visible tooltip no matter where\n * focus is. Attached to the document only while the tooltip is shown, and\n * preventDefault only fires when a tooltip was actually hidden.\n */\n private readonly onDocumentKeydown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || !this.ref) return;\n event.preventDefault();\n this.hide();\n };\n\n protected onPointerEnter(): void {\n // Re-entering the trigger during the hide grace period keeps the tip up.\n clearTimeout(this.hideTimer);\n this.scheduleShow(OPEN_DELAY);\n }\n\n protected onPointerLeave(): void {\n clearTimeout(this.openTimer);\n this.scheduleHide();\n }\n\n private scheduleHide(): void {\n if (!this.ref) return;\n clearTimeout(this.hideTimer);\n this.hideTimer = setTimeout(() => this.hide(), CLOSE_DELAY);\n }\n\n protected onFocus(): void {\n // Pointer-driven focus already dismissed the tip on pointerdown; showing\n // it again here would defeat that. Keyboard focus still gets a tooltip.\n if (this.suppressFocusShow) {\n this.suppressFocusShow = false;\n return;\n }\n this.scheduleShow(0);\n }\n\n protected onPointerDown(event: PointerEvent): void {\n this.suppressFocusShow = true;\n // Touch toggle: hover never happens on a touchscreen, so a tap on the\n // trigger is the show gesture. Tap again (ref exists → fall through to\n // hide) or tap elsewhere (document pointerdown) dismisses. Mouse and pen\n // keep the plain dismiss-on-pointerdown behaviour.\n if (event.pointerType === 'touch' && !this.ref) {\n this.scheduleShow(0);\n return;\n }\n this.hide();\n }\n\n /**\n * Outside-tap dismissal (attached to the document only while visible): a\n * pointerdown that lands on neither the trigger nor the panel hides the\n * tooltip. The trigger's own pointerdown handles show/hide/toggle itself,\n * and a press on the panel keeps it up (WCAG 1.4.13 \"hoverable\").\n */\n private readonly onDocumentPointerdown = (event: Event): void => {\n const target = event.target as Node | null;\n if (!target || this.host.nativeElement.contains(target)) return;\n const panel = this.ref?.location.nativeElement as HTMLElement | undefined;\n if (panel?.contains(target)) return;\n this.hide();\n };\n\n private scheduleShow(delay: number): void {\n if (!this.isBrowser || !this.mkTooltip().trim() || this.ref) return;\n clearTimeout(this.openTimer);\n if (delay === 0) {\n this.show();\n } else {\n this.openTimer = setTimeout(() => this.show(), delay);\n }\n }\n\n protected hide(): void {\n clearTimeout(this.openTimer);\n clearTimeout(this.hideTimer);\n if (!this.ref) return;\n\n this.document.removeEventListener('keydown', this.onDocumentKeydown, true);\n this.document.removeEventListener(\n 'pointerdown',\n this.onDocumentPointerdown,\n true,\n );\n\n // Restore the trigger's original aria-describedby.\n const el = this.host.nativeElement;\n if (this.previousDescribedBy === null) {\n el.removeAttribute('aria-describedby');\n } else {\n el.setAttribute('aria-describedby', this.previousDescribedBy);\n }\n this.previousDescribedBy = null;\n\n const panel = this.ref.location.nativeElement as HTMLElement & {\n hidePopover?: () => void;\n };\n if (panel.matches('[popover]') && typeof panel.hidePopover === 'function') {\n try {\n panel.hidePopover();\n } catch {\n // Already disconnected — nothing to do.\n }\n }\n\n this.appRef.detachView(this.ref.hostView);\n this.ref.destroy();\n this.ref = undefined;\n }\n\n private show(): void {\n if (this.ref) return;\n\n const ref = createComponent(MkTooltipPanel, {\n environmentInjector: this.envInjector,\n });\n ref.setInput('text', this.mkTooltip());\n ref.setInput('id', this.tooltipId);\n ref.setInput('placement', this.mkTooltipPlacement());\n this.appRef.attachView(ref.hostView);\n\n const panel = ref.location.nativeElement as HTMLElement;\n this.overlayRoot().appendChild(panel);\n this.ref = ref;\n\n // Hoverable (the listeners die with the panel element on hide) …\n panel.addEventListener('mouseenter', this.onPanelEnter);\n panel.addEventListener('mouseleave', this.onPanelLeave);\n // … and dismissible from anywhere while visible (removed in hide()).\n // Capture phase so the Escape that hides the tooltip is marked\n // defaultPrevented before any bubbling handler (e.g. a dialog deciding\n // whether to close) sees it — layered dismissal, tooltip first.\n this.document.addEventListener('keydown', this.onDocumentKeydown, true);\n // … and from an outside tap — the touch analogue of mouseleave. Capture\n // phase so the tooltip is gone before the tap's own target reacts.\n this.document.addEventListener(\n 'pointerdown',\n this.onDocumentPointerdown,\n true,\n );\n\n // Promote into the top layer so the tooltip is never clipped by an\n // ancestor's overflow/transform or hidden behind a stacking context.\n const withPopover = panel as HTMLElement & { showPopover?: () => void };\n if (typeof withPopover.showPopover === 'function') {\n panel.setAttribute('popover', 'manual');\n try {\n withPopover.showPopover();\n } catch {\n // Unsupported context — fall back to the plain body portal.\n }\n }\n\n // Wire aria-describedby, preserving any pre-existing value.\n const trigger = this.host.nativeElement;\n this.previousDescribedBy = trigger.getAttribute('aria-describedby');\n trigger.setAttribute(\n 'aria-describedby',\n this.previousDescribedBy\n ? `${this.previousDescribedBy} ${this.tooltipId}`\n : this.tooltipId,\n );\n\n this.position(panel);\n // Reveal on the next frame so the entrance transition runs.\n this.document.defaultView?.requestAnimationFrame(() => {\n this.ref?.setInput('visible', true);\n });\n }\n\n private position(panel: HTMLElement): void {\n const rect = this.host.nativeElement.getBoundingClientRect();\n const tip = panel.getBoundingClientRect();\n const pos = mkComputeAnchoredPosition(\n rect,\n { width: tip.width, height: tip.height },\n {\n width: this.document.documentElement.clientWidth,\n height: this.document.documentElement.clientHeight,\n },\n // Clamp back on-screen but keep the requested side (no flip) so the\n // panel's `data-placement` styling stays correct.\n {\n placement: this.mkTooltipPlacement(),\n gap: 8,\n flip: false,\n clamp: true,\n rtl:\n this.document.defaultView?.getComputedStyle(this.host.nativeElement)\n .direction === 'rtl',\n },\n );\n panel.style.position = 'fixed';\n panel.style.margin = '0';\n panel.style.inset = 'auto';\n panel.style.top = `${pos.top}px`;\n panel.style.left = `${pos.left}px`;\n }\n\n ngOnDestroy(): void {\n this.hide();\n }\n}\n","{{ text() }}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport type { MkPlacement } from '@mk-kit/ui/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { mkGetFocusable } from '@mk-kit/ui/core';\nimport { MkAnchoredPanel } from '@mk-kit/ui/core';\n\n/**\n * Popover — a non-modal floating panel for rich (non-text) content, anchored to\n * a trigger. Unlike {@link MkTooltip} (text, hover) it holds arbitrary projected\n * content and is opened by click via the `mkPopoverTriggerFor` directive (or the\n * `open`/`toggle` API).\n *\n * The panel renders in the browser top layer through {@link MkAnchoredPanel}, so\n * it is never clipped by an ancestor's `overflow`/`transform`. On open, focus\n * moves into the panel; Escape closes and restores focus to the trigger, an\n * outside click or Tabbing out closes it (non-modal — no keyboard trap).\n *\n * ```html\n * <button mkButton [mkPopoverTriggerFor]=\"info\">Details</button>\n * <mk-popover #info ariaLabel=\"Details\">\n * <h4>Shipping</h4><p>Ships in 2–3 business days.</p>\n * </mk-popover>\n * ```\n */\n@Component({\n selector: 'mk-popover',\n exportAs: 'mkPopover',\n templateUrl: './popover.html',\n styleUrl: './popover.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkAnchoredPanel],\n host: {\n class: 'mk-popover',\n },\n})\nexport class MkPopover {\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n\n /** Stable id for `aria-controls` on the trigger. */\n readonly panelId = mkUniqueId('mk-popover');\n\n /** Preferred placement relative to the trigger. */\n readonly placement = input<MkPlacement>('bottom');\n /** Accessible label for the dialog panel. */\n readonly ariaLabel = input<string>();\n /** Move focus into the panel on open. Default `true`. */\n readonly autoFocus = input(true, { transform: booleanAttribute });\n\n /** Emitted whenever the popover closes (any reason). */\n readonly closed = output<void>();\n\n private readonly _open = signal(false);\n /** Whether the popover is open. */\n readonly opened = this._open.asReadonly();\n\n protected readonly anchorEl = signal<HTMLElement | undefined>(undefined);\n private triggerEl: HTMLElement | null = null;\n\n /** Open the popover anchored to `trigger`. */\n open(trigger: HTMLElement): void {\n if (!this.isBrowser || this._open()) return;\n this.triggerEl = trigger;\n this.anchorEl.set(trigger);\n this._open.set(true);\n if (this.autoFocus()) {\n afterNextRender(() => this.focusInitial(), { injector: this.injector });\n }\n }\n\n /** Close the popover; optionally restore focus to the trigger. */\n close(restoreFocus = true): void {\n if (!this._open()) return;\n this._open.set(false);\n this.anchorEl.set(undefined);\n const trigger = this.triggerEl;\n this.triggerEl = null;\n if (restoreFocus) trigger?.focus();\n this.closed.emit();\n }\n\n /** Toggle open/closed from a trigger. */\n toggle(trigger: HTMLElement): void {\n this._open() ? this.close(true) : this.open(trigger);\n }\n\n private focusInitial(): void {\n const panel = this.panelRef()?.nativeElement;\n if (!panel) return;\n (mkGetFocusable(panel)[0] ?? panel).focus();\n }\n\n protected onEscape(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.close(true);\n }\n\n protected onPanelFocusout(event: FocusEvent): void {\n const related = event.relatedTarget as Node | null;\n // Focus moved to a non-focusable spot (stays in document.body) — keep open;\n // outside pointerdown is handled separately by the anchored panel.\n if (!related) return;\n const panel = this.panelRef()?.nativeElement;\n if (panel?.contains(related) || this.triggerEl?.contains(related)) return;\n // Tabbed out of the panel — close without yanking focus back.\n this.close(false);\n }\n}\n","@if (opened()) {\n <div\n #panel\n class=\"mk-popover__panel\"\n role=\"dialog\"\n tabindex=\"-1\"\n [id]=\"panelId\"\n [attr.aria-label]=\"ariaLabel()\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"anchorEl()\"\n [placement]=\"placement()\"\n [gap]=\"8\"\n (dismiss)=\"close(false)\"\n (keydown.escape)=\"onEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <ng-content />\n </div>\n}\n","import { Directive, ElementRef, inject, input } from '@angular/core';\nimport { MkPopover } from './popover';\n\n/**\n * Turns its host element into a click trigger for an `<mk-popover>`. Wires\n * `aria-haspopup=\"dialog\"` / `aria-expanded` / `aria-controls`, toggles on click\n * and closes on Escape.\n *\n * ```html\n * <button mkButton [mkPopoverTriggerFor]=\"info\">Details</button>\n * <mk-popover #info>…</mk-popover>\n * ```\n */\n@Directive({\n selector: '[mkPopoverTriggerFor]',\n exportAs: 'mkPopoverTrigger',\n host: {\n 'aria-haspopup': 'dialog',\n '[attr.aria-expanded]': 'popover().opened()',\n '[attr.aria-controls]': 'popover().panelId',\n '(click)': 'onClick($event)',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class MkPopoverTrigger {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The popover instance to control. */\n readonly popover = input.required<MkPopover>({ alias: 'mkPopoverTriggerFor' });\n\n protected onClick(event: Event): void {\n event.preventDefault();\n this.popover().toggle(this.host.nativeElement);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.popover().opened()) {\n event.preventDefault();\n this.popover().close(true);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkPlacement, MkTone } from '@mk-kit/ui/core';\nimport { MkButton } from '@mk-kit/ui/button';\nimport { MkPopover } from './popover';\n\n/**\n * Popconfirm — an inline confirmation popover (e.g. a row-level \"Delete?\").\n * Composes {@link MkPopover} with a message and cancel/confirm buttons, so it\n * inherits the top-layer positioning + focus behaviour. Attach it with the\n * `mkPopconfirmFor` directive.\n *\n * ```html\n * <button mkButton tone=\"danger\" [mkPopconfirmFor]=\"del\">Delete</button>\n * <mk-popconfirm #del message=\"Delete this item?\" (confirm)=\"remove()\" />\n * ```\n */\n@Component({\n selector: 'mk-popconfirm',\n exportAs: 'mkPopconfirm',\n templateUrl: './popconfirm.html',\n styleUrl: './popconfirm.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkPopover, MkButton],\n host: {\n class: 'mk-popconfirm',\n },\n})\nexport class MkPopconfirm {\n private readonly popover = viewChild(MkPopover);\n protected readonly i18n = inject(MK_I18N);\n\n /** Confirmation message. */\n readonly message = input(this.i18n.confirmMessage);\n /** Optional bold heading above the message. */\n readonly title = input<string>();\n /** Confirm button label. */\n readonly confirmText = input(this.i18n.confirm);\n /** Cancel button label. */\n readonly cancelText = input(this.i18n.cancel);\n /** Tone of the confirm button (destructive actions use `danger`). */\n readonly tone = input<MkTone>('danger');\n /** Preferred placement relative to the trigger. */\n readonly placement = input<MkPlacement>('top');\n\n /** Emitted when the user confirms. */\n readonly confirm = output<void>();\n /** Emitted when the user cancels (button, Escape or outside click). */\n readonly cancel = output<void>();\n\n /** Id of the underlying dialog panel (for the trigger's `aria-controls`). */\n get panelId(): string | null {\n return this.popover()?.panelId ?? null;\n }\n\n /** Whether the popconfirm is open. */\n opened(): boolean {\n return this.popover()?.opened() ?? false;\n }\n\n /** Open anchored to `trigger`. */\n open(trigger: HTMLElement): void {\n this.popover()?.open(trigger);\n }\n\n /** Toggle from a trigger. */\n toggle(trigger: HTMLElement): void {\n this.popover()?.toggle(trigger);\n }\n\n /** Close the popconfirm. */\n close(): void {\n this.popover()?.close(true);\n }\n\n /** Set when the user confirms, so the close handler doesn't also cancel. */\n private confirmed = false;\n\n protected onConfirm(): void {\n this.confirmed = true;\n this.confirm.emit();\n this.popover()?.close(true);\n }\n\n protected onCancel(): void {\n // Closing emits `closed`, which routes to `cancel` (see onPopoverClosed).\n this.popover()?.close(true);\n }\n\n /** Any close that wasn't a confirm counts as a cancel (Escape / outside). */\n protected onPopoverClosed(): void {\n if (this.confirmed) {\n this.confirmed = false;\n return;\n }\n this.cancel.emit();\n }\n}\n","<mk-popover\n [placement]=\"placement()\"\n [ariaLabel]=\"title() || message()\"\n (closed)=\"onPopoverClosed()\"\n>\n <div class=\"mk-popconfirm__body\">\n @if (title()) {\n <p class=\"mk-popconfirm__title\">{{ title() }}</p>\n }\n <p class=\"mk-popconfirm__message\">{{ message() }}</p>\n <div class=\"mk-popconfirm__actions\">\n <button mkButton variant=\"ghost\" tone=\"neutral\" size=\"sm\" (click)=\"onCancel()\">\n {{ cancelText() }}\n </button>\n <button mkButton [tone]=\"tone()\" size=\"sm\" (click)=\"onConfirm()\">\n {{ confirmText() }}\n </button>\n </div>\n </div>\n</mk-popover>\n","import { Directive, ElementRef, inject, input } from '@angular/core';\nimport { MkPopconfirm } from './popconfirm';\n\n/**\n * Turns its host element into a click trigger for an `<mk-popconfirm>`. Wires\n * `aria-haspopup=\"dialog\"` / `aria-expanded` / `aria-controls`, toggles on click\n * and closes on Escape.\n *\n * ```html\n * <button mkButton tone=\"danger\" [mkPopconfirmFor]=\"del\">Delete</button>\n * <mk-popconfirm #del message=\"Delete this item?\" (confirm)=\"remove()\" />\n * ```\n */\n@Directive({\n selector: '[mkPopconfirmFor]',\n exportAs: 'mkPopconfirmTrigger',\n host: {\n 'aria-haspopup': 'dialog',\n '[attr.aria-expanded]': 'popconfirm().opened()',\n '[attr.aria-controls]': 'popconfirm().panelId',\n '(click)': 'onClick($event)',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class MkPopconfirmTrigger {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The popconfirm instance to control. */\n readonly popconfirm = input.required<MkPopconfirm>({\n alias: 'mkPopconfirmFor',\n });\n\n protected onClick(event: Event): void {\n event.preventDefault();\n this.popconfirm().toggle(this.host.nativeElement);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.popconfirm().opened()) {\n event.preventDefault();\n this.popconfirm().close();\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\n/** Status presets supported by {@link MkResult}. */\nexport type MkResultStatus =\n | 'success'\n | 'error'\n | 'info'\n | 'warning'\n | '404'\n | '403'\n | '500';\n\n/** Built-in icon glyph chosen for a status. */\nexport type MkResultIconVariant = 'check' | 'x' | 'alert' | 'info' | 'search';\n\n/** Tone colour applied to the status icon. */\nexport type MkResultTone = 'success' | 'danger' | 'warning' | 'info' | 'muted';\n\n/**\n * Result — a centred, full-page status state: a success confirmation, an error,\n * an empty 404/403/500 page. Renders a large status icon (chosen from\n * `status`), a title, a muted subtitle, projected body content, and a row of\n * action buttons at the bottom.\n *\n * Slots: `[mkResultIcon]` (custom icon, overrides the built-in glyph),\n * `[mkResultTitle]` (custom heading, used when `resultTitle` is unset), default\n * content (extra body), `[mkResultActions]` (buttons).\n *\n * ```html\n * <mk-result status=\"success\" resultTitle=\"Payment complete\"\n * subtitle=\"Your order is on its way.\">\n * <button mkButton mkResultActions>Back home</button>\n * </mk-result>\n * ```\n */\n@Component({\n selector: 'mk-result',\n templateUrl: './result.html',\n styleUrl: './result.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-result',\n role: 'status',\n '[attr.data-status]': 'status()',\n '[attr.data-tone]': 'tone()',\n },\n})\nexport class MkResult {\n /** Status preset that selects the built-in icon glyph and its tone colour. */\n readonly status = input<MkResultStatus>('info');\n /** Main heading rendered as an `<h2>` (falls back to the `[mkResultTitle]` slot). */\n readonly resultTitle = input<string>('');\n /** Supporting muted sentence under the title. */\n readonly subtitle = input<string>('');\n\n /** Built-in glyph for the current status. */\n protected readonly iconName = computed<MkResultIconVariant>(() => {\n switch (this.status()) {\n case 'success':\n return 'check';\n case 'error':\n case '500':\n return 'x';\n case 'warning':\n case '403':\n return 'alert';\n case '404':\n return 'search';\n default:\n return 'info';\n }\n });\n\n /** Tone colour applied to the status icon. */\n protected readonly tone = computed<MkResultTone>(() => {\n switch (this.status()) {\n case 'success':\n return 'success';\n case 'error':\n case '500':\n return 'danger';\n case 'warning':\n case '403':\n return 'warning';\n case '404':\n return 'muted';\n default:\n return 'info';\n }\n });\n}\n","<div class=\"mk-result__icon\" aria-hidden=\"true\">\n <span class=\"mk-result__icon-custom\"><ng-content select=\"[mkResultIcon]\" /></span>\n <span class=\"mk-result__icon-default\">\n @switch (iconName()) {\n @case ('check') {\n <svg viewBox=\"0 0 24 24\" width=\"64\" height=\"64\" fill=\"none\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M8 12.5l2.5 2.5L16 9.5\" stroke=\"currentColor\" stroke-width=\"1.6\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n @case ('x') {\n <svg viewBox=\"0 0 24 24\" width=\"64\" height=\"64\" fill=\"none\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M9 9l6 6M15 9l-6 6\" stroke=\"currentColor\" stroke-width=\"1.6\"\n stroke-linecap=\"round\" />\n </svg>\n }\n @case ('alert') {\n <svg viewBox=\"0 0 24 24\" width=\"64\" height=\"64\" fill=\"none\" focusable=\"false\">\n <path d=\"M12 3.5l9 15.5H3z\" stroke=\"currentColor\" stroke-width=\"1.6\"\n stroke-linejoin=\"round\" />\n <path d=\"M12 10v4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n <circle cx=\"12\" cy=\"16.5\" r=\"1\" fill=\"currentColor\" />\n </svg>\n }\n @case ('search') {\n <svg viewBox=\"0 0 24 24\" width=\"64\" height=\"64\" fill=\"none\" focusable=\"false\">\n <circle cx=\"10.5\" cy=\"10.5\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M15.5 15.5L21 21\" stroke=\"currentColor\" stroke-width=\"1.6\"\n stroke-linecap=\"round\" />\n </svg>\n }\n @default {\n <svg viewBox=\"0 0 24 24\" width=\"64\" height=\"64\" fill=\"none\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M12 11v5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n <circle cx=\"12\" cy=\"8\" r=\"1\" fill=\"currentColor\" />\n </svg>\n }\n }\n </span>\n</div>\n\n@if (resultTitle(); as heading) {\n <h2 class=\"mk-result__title\">{{ heading }}</h2>\n} @else {\n <ng-content select=\"[mkResultTitle]\" />\n}\n\n@if (subtitle(); as text) {\n <p class=\"mk-result__subtitle\">{{ text }}</p>\n}\n\n<div class=\"mk-result__body\">\n <ng-content />\n</div>\n\n<div class=\"mk-result__actions\">\n <ng-content select=\"[mkResultActions]\" />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n OnDestroy,\n PLATFORM_ID,\n booleanAttribute,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport type { MkPlacement } from '@mk-kit/ui/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MkAnchoredPanel } from '@mk-kit/ui/core';\n\n/**\n * Hovercard — a rich hover-preview panel anchored to a trigger, in the spirit of\n * GitHub's user hovercards. Unlike {@link MkTooltip} (short text) it projects\n * arbitrary content, and unlike {@link MkPopover} (click) it opens on hover/focus\n * after a short delay and closes when the pointer leaves both the trigger and the\n * card. It is driven by the `mkHovercardFor` directive (or the `open`/`close` API).\n *\n * The panel renders in the browser top layer through {@link MkAnchoredPanel}, so\n * it is never clipped by an ancestor's `overflow`/`transform`. It is non-modal —\n * no focus trap. Moving the pointer from the trigger onto the card keeps it open;\n * Escape closes it.\n *\n * ```html\n * <a href=\"/u/ada\" [mkHovercardFor]=\"ada\">@ada</a>\n * <mk-hovercard #ada ariaLabel=\"Ada Lovelace\">\n * <img src=\"/ada.png\" alt=\"\" /><strong>Ada Lovelace</strong>\n * </mk-hovercard>\n * ```\n */\n@Component({\n selector: 'mk-hovercard',\n exportAs: 'mkHovercard',\n templateUrl: './hovercard.html',\n styleUrl: './hovercard.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkAnchoredPanel],\n host: {\n class: 'mk-hovercard',\n },\n})\nexport class MkHovercard implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Stable id for `aria-controls` on the trigger. */\n readonly panelId = mkUniqueId('mk-hovercard');\n\n /** Preferred placement relative to the trigger. */\n readonly placement = input<MkPlacement>('bottom-start');\n /** Accessible label for the panel. */\n readonly ariaLabel = input<string>();\n /** Delay in ms before the card opens on hover/focus. Default `300`. */\n readonly openDelay = input(300, { transform: numberAttribute });\n /** Delay in ms before the card closes after the pointer leaves. Default `200`. */\n readonly closeDelay = input(200, { transform: numberAttribute });\n /** Close the card when Escape is pressed while it is open. Default `true`. */\n readonly closeOnEscape = input(true, { transform: booleanAttribute });\n\n /** Emitted whenever the hovercard closes (any reason). */\n readonly closed = output<void>();\n\n private readonly _open = signal(false);\n /** Whether the hovercard is open. */\n readonly opened = this._open.asReadonly();\n\n protected readonly anchorEl = signal<HTMLElement | undefined>(undefined);\n private triggerEl: HTMLElement | null = null;\n\n private openTimer: number | null = null;\n private closeTimer: number | null = null;\n\n /** Open the card anchored to `trigger` after `openDelay` (cancels a pending close). */\n scheduleOpen(trigger: HTMLElement): void {\n if (!this.isBrowser) return;\n this.clearCloseTimer();\n if (this._open()) {\n // Already open — just make sure the anchor is current.\n this.triggerEl = trigger;\n this.anchorEl.set(trigger);\n return;\n }\n if (this.openTimer !== null) return;\n this.openTimer = this.setTimer(() => {\n this.openTimer = null;\n this.open(trigger);\n }, this.openDelay());\n }\n\n /** Close the card after `closeDelay` (cancels a pending open). */\n scheduleClose(): void {\n if (!this.isBrowser) return;\n this.clearOpenTimer();\n if (!this._open() || this.closeTimer !== null) return;\n this.closeTimer = this.setTimer(() => {\n this.closeTimer = null;\n this.close();\n }, this.closeDelay());\n }\n\n /**\n * Keep the card open: cancel any pending open/close. Called when the pointer\n * enters the card itself, so moving from the trigger to the card is seamless.\n */\n keepOpen(): void {\n this.clearCloseTimer();\n }\n\n /** Open the card immediately, anchored to `trigger`. */\n open(trigger: HTMLElement): void {\n if (!this.isBrowser || this._open()) return;\n this.clearOpenTimer();\n this.triggerEl = trigger;\n this.anchorEl.set(trigger);\n this._open.set(true);\n }\n\n /** Close the card immediately. */\n close(): void {\n this.clearOpenTimer();\n this.clearCloseTimer();\n if (!this._open()) return;\n this._open.set(false);\n this.anchorEl.set(undefined);\n this.triggerEl = null;\n this.closed.emit();\n }\n\n protected onCardEnter(): void {\n this.keepOpen();\n }\n\n protected onCardLeave(): void {\n this.scheduleClose();\n }\n\n /**\n * Keyboard mirror of `mouseleave`: when focus moves somewhere outside BOTH\n * the card and its trigger, schedule a close. Focus hopping between the\n * trigger and the card (either direction) keeps it open, so the card's\n * content stays reachable with Tab.\n */\n protected onCardFocusout(event: FocusEvent): void {\n const related = event.relatedTarget as Node | null;\n if (!related) return;\n const panel = event.currentTarget as HTMLElement | null;\n if (panel?.contains(related) || this.triggerEl?.contains(related)) return;\n this.scheduleClose();\n }\n\n protected onEscape(event: Event): void {\n if (!this.closeOnEscape()) return;\n event.preventDefault();\n event.stopPropagation();\n // Escape may be pressed while focus is INSIDE the panel; closing destroys\n // it, which would otherwise drop focus on <body>. Hand it back to the\n // trigger so the keyboard user keeps their place.\n const trigger = this.triggerEl;\n this.close();\n trigger?.focus();\n }\n\n private setTimer(fn: () => void, delay: number): number | null {\n const view = this.document.defaultView;\n return view ? view.setTimeout(fn, delay) : null;\n }\n\n private clearOpenTimer(): void {\n if (this.openTimer !== null) {\n this.document.defaultView?.clearTimeout(this.openTimer);\n this.openTimer = null;\n }\n }\n\n private clearCloseTimer(): void {\n if (this.closeTimer !== null) {\n this.document.defaultView?.clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n ngOnDestroy(): void {\n this.clearOpenTimer();\n this.clearCloseTimer();\n }\n}\n","@if (opened()) {\n <div\n #panel\n class=\"mk-hovercard__panel\"\n role=\"dialog\"\n tabindex=\"-1\"\n [id]=\"panelId\"\n [attr.aria-label]=\"ariaLabel()\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"anchorEl()\"\n [placement]=\"placement()\"\n [gap]=\"8\"\n (dismiss)=\"close()\"\n (mouseenter)=\"onCardEnter()\"\n (mouseleave)=\"onCardLeave()\"\n (focusin)=\"onCardEnter()\"\n (focusout)=\"onCardFocusout($event)\"\n (keydown.escape)=\"onEscape($event)\"\n >\n <ng-content />\n </div>\n}\n","import { Directive, ElementRef, inject, input } from '@angular/core';\nimport { MkHovercard } from './hovercard';\n\n/**\n * A touch tap fires emulated `mouseenter` + `focus` right after `pointerdown`;\n * for this long after a touch toggle those synthetic enters are ignored, so a\n * tap that just CLOSED the card is not undone by its own compatibility events.\n */\nconst TOUCH_ENTER_SUPPRESS_MS = 500;\n\n/**\n * Turns its host element into a hover/focus trigger for an `<mk-hovercard>`.\n * On `mouseenter`/`focus` it opens the card (after the card's `openDelay`),\n * anchored to the host; on `mouseleave`/`blur` it schedules a close (after the\n * card's `closeDelay`). Moving the pointer — or keyboard focus — from the host\n * onto the card cancels that close, so the card stays open and its content is\n * reachable with Tab. Escape closes it.\n *\n * On touch there is no hover, so a tap toggles instead: tap opens the card\n * immediately, tapping the trigger again closes it, and a tap anywhere else\n * closes it through the panel's outside-pointerdown dismissal.\n *\n * ```html\n * <a href=\"/u/ada\" [mkHovercardFor]=\"ada\">@ada</a>\n * <mk-hovercard #ada>…</mk-hovercard>\n * ```\n */\n@Directive({\n selector: '[mkHovercardFor]',\n exportAs: 'mkHovercardTrigger',\n host: {\n 'aria-haspopup': 'dialog',\n '[attr.aria-expanded]': 'hovercard().opened()',\n '[attr.aria-controls]': 'hovercard().panelId',\n '(mouseenter)': 'onEnter()',\n '(focus)': 'onEnter()',\n '(mouseleave)': 'onLeave()',\n '(blur)': 'onLeave()',\n '(pointerdown)': 'onPointerDown($event)',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class MkHovercardTrigger {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n /** Timestamp of the last touch toggle — guards `onEnter` (see above). */\n private lastTouchToggle = Number.NEGATIVE_INFINITY;\n\n /** The hovercard instance to control. */\n readonly hovercard = input.required<MkHovercard>({ alias: 'mkHovercardFor' });\n\n protected onEnter(): void {\n if (Date.now() - this.lastTouchToggle < TOUCH_ENTER_SUPPRESS_MS) return;\n this.hovercard().scheduleOpen(this.host.nativeElement);\n }\n\n /**\n * Touch tap-toggle. Mouse and pen are ignored here — they keep the pure\n * hover/focus behaviour. A tap while the card is open closes it (a tap\n * OUTSIDE both trigger and panel is handled by the anchored panel's own\n * outside-pointerdown dismiss, which excludes the anchor, so the two paths\n * never double-fire).\n */\n protected onPointerDown(event: PointerEvent): void {\n if (event.pointerType !== 'touch') return;\n this.lastTouchToggle = Date.now();\n const card = this.hovercard();\n if (card.opened()) {\n card.close();\n } else {\n // No openDelay on touch — the tap is deliberate, not a passing pointer.\n card.open(this.host.nativeElement);\n }\n }\n\n protected onLeave(): void {\n this.hovercard().scheduleClose();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.hovercard().opened()) {\n event.preventDefault();\n this.hovercard().close();\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n PLATFORM_ID,\n afterNextRender,\n computed,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { mkGetFocusable } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkAnchoredPanel } from '@mk-kit/ui/core';\nimport { MkBadge } from '@mk-kit/ui/data';\nimport { MkEmptyState } from '@mk-kit/ui/data';\nimport { MkIcon } from '@mk-kit/ui/icon';\n\n/** A single notification shown in the {@link MkNotificationCenter} panel. */\nexport interface MkNotification {\n /** Stable identity, used for `track` and immutable updates. */\n id: unknown;\n /** Headline line, always shown. */\n title: string;\n /** Optional supporting text under the title. */\n body?: string;\n /** Optional relative/absolute timestamp label (e.g. \"2m ago\"). */\n time?: string;\n /** Whether the user has already read this item. */\n read?: boolean;\n}\n\n/**\n * NotificationCenter — a bell trigger with an unread-count badge that opens a\n * dropdown panel listing notifications, each markable as read.\n *\n * The panel renders in the browser top layer through {@link MkAnchoredPanel},\n * so it is never clipped by an ancestor's `overflow`/`transform`. Clicking the\n * bell toggles it; an outside click, Tabbing out or Escape closes it and\n * restores focus to the bell. Clicking a row marks that one read (updating the\n * two-way `notifications` immutably); \"Mark all read\" clears every unread item.\n *\n * ```html\n * <mk-notification-center\n * [(notifications)]=\"items\"\n * (itemClick)=\"open($event)\"\n * (markedAllRead)=\"sync()\" />\n * ```\n */\n@Component({\n selector: 'mk-notification-center',\n templateUrl: './notification-center.html',\n styleUrl: './notification-center.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkAnchoredPanel, MkBadge, MkEmptyState, MkIcon],\n host: {\n class: 'mk-notification-center',\n },\n})\nexport class MkNotificationCenter {\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n private readonly triggerRef =\n viewChild<ElementRef<HTMLButtonElement>>('trigger');\n protected readonly i18n = inject(MK_I18N);\n\n /** Stable id linking the trigger to the panel via `aria-controls`. */\n readonly panelId = mkUniqueId('mk-notification-center');\n /** Stable id for the panel's labelling heading. */\n readonly titleId = mkUniqueId('mk-notification-center-title');\n\n /** Two-way list of notifications rendered in the panel. */\n readonly notifications = model<MkNotification[]>([]);\n /** Heading shown at the top of the panel. */\n readonly panelTitle = input(this.i18n.notificationsTitle);\n /** Message shown by the empty state when there are no notifications. */\n readonly emptyText = input(this.i18n.allCaughtUp);\n /** Max height of the scrollable list (any CSS length). */\n readonly maxHeight = input('24rem');\n\n /** Emitted with a notification when its row is clicked. */\n readonly itemClick = output<MkNotification>();\n /** Emitted with a notification when it transitions to read. */\n readonly read = output<MkNotification>();\n /** Emitted when every notification is marked read at once. */\n readonly markedAllRead = output<void>();\n\n private readonly _open = signal(false);\n /** Whether the panel is open. */\n readonly open = this._open.asReadonly();\n\n /** Count of notifications that are not yet read. */\n readonly unreadCount = computed(\n () => this.notifications().filter((n) => !n.read).length,\n );\n\n /** Accessible label for the bell trigger. */\n protected readonly triggerLabel = computed(() =>\n this.i18n.notificationsUnread(this.unreadCount()),\n );\n\n /** Badge text, capped at \"99+\". */\n protected readonly badgeText = computed(() => {\n const n = this.unreadCount();\n return n > 99 ? '99+' : `${n}`;\n });\n\n /** Toggle the panel open/closed. */\n toggle(): void {\n this._open() ? this.close() : this.openPanel();\n }\n\n /** Open the panel, moving focus into it on the next render. */\n openPanel(): void {\n if (!this.isBrowser || this._open()) return;\n this._open.set(true);\n afterNextRender(() => this.focusInitial(), { injector: this.injector });\n }\n\n /** Close the panel; optionally restore focus to the bell trigger. */\n close(restoreFocus = true): void {\n if (!this._open()) return;\n this._open.set(false);\n if (restoreFocus) this.triggerRef()?.nativeElement.focus();\n }\n\n /** Mark every notification read and emit {@link markedAllRead}. */\n markAllRead(): void {\n if (this.unreadCount() === 0) return;\n this.notifications.update((list) =>\n list.map((n) => (n.read ? n : { ...n, read: true })),\n );\n this.markedAllRead.emit();\n }\n\n /** Handle a row click: mark it read (if needed) and emit {@link itemClick}. */\n protected onRowClick(item: MkNotification): void {\n if (!item.read) this.markRead(item);\n this.itemClick.emit(item);\n }\n\n private markRead(item: MkNotification): void {\n let updated: MkNotification | undefined;\n this.notifications.update((list) =>\n list.map((n) => {\n if (n !== item || n.read) return n;\n updated = { ...n, read: true };\n return updated;\n }),\n );\n if (updated) this.read.emit(updated);\n }\n\n protected onEscape(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.close(true);\n }\n\n protected onPanelFocusout(event: FocusEvent): void {\n const related = event.relatedTarget as Node | null;\n if (!related) return;\n const panel = this.panelRef()?.nativeElement;\n const trigger = this.triggerRef()?.nativeElement;\n if (panel?.contains(related) || trigger?.contains(related)) return;\n this.close(false);\n }\n\n private focusInitial(): void {\n const panel = this.panelRef()?.nativeElement;\n if (!panel) return;\n (mkGetFocusable(panel)[0] ?? panel).focus();\n }\n}\n","<button\n #trigger\n type=\"button\"\n class=\"mk-notification-center__trigger\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-label]=\"triggerLabel()\"\n (click)=\"toggle()\"\n>\n <mk-icon name=\"bell\" />\n @if (unreadCount() > 0) {\n <mk-badge\n class=\"mk-notification-center__count\"\n tone=\"danger\"\n variant=\"solid\"\n size=\"sm\"\n aria-hidden=\"true\"\n >\n {{ badgeText() }}\n </mk-badge>\n }\n</button>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-notification-center__panel\"\n role=\"dialog\"\n tabindex=\"-1\"\n [id]=\"panelId\"\n [attr.aria-labelledby]=\"titleId\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"trigger\"\n placement=\"bottom-end\"\n [gap]=\"8\"\n (dismiss)=\"close(false)\"\n (keydown.escape)=\"onEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <header class=\"mk-notification-center__header\">\n <h2 [id]=\"titleId\" class=\"mk-notification-center__title\">\n {{ panelTitle() }}\n </h2>\n <!--\n aria-disabled (not [disabled]) so the button stays focusable when it\n disables itself after activation; markAllRead() guards the no-op case.\n -->\n <button\n type=\"button\"\n class=\"mk-notification-center__mark-all\"\n [attr.aria-disabled]=\"unreadCount() === 0\"\n (click)=\"markAllRead()\"\n >\n {{ i18n.markAllRead }}\n </button>\n </header>\n\n @if (notifications().length > 0) {\n <ul\n class=\"mk-notification-center__list\"\n [style.max-height]=\"maxHeight()\"\n >\n @for (item of notifications(); track item.id) {\n <li>\n <button\n type=\"button\"\n class=\"mk-notification-center__item\"\n [class.mk-notification-center__item--unread]=\"!item.read\"\n (click)=\"onRowClick(item)\"\n >\n <span\n class=\"mk-notification-center__dot\"\n aria-hidden=\"true\"\n ></span>\n @if (!item.read) {\n <span class=\"mk-visually-hidden\">{{ i18n.unread }}</span>\n }\n <span class=\"mk-notification-center__body\">\n <span class=\"mk-notification-center__item-title\">\n {{ item.title }}\n </span>\n @if (item.body) {\n <span class=\"mk-notification-center__item-text\">\n {{ item.body }}\n </span>\n }\n @if (item.time) {\n <span class=\"mk-notification-center__item-time\">\n {{ item.time }}\n </span>\n }\n </span>\n </button>\n </li>\n }\n </ul>\n } @else {\n <mk-empty-state\n class=\"mk-notification-center__empty\"\n icon=\"bell\"\n size=\"sm\"\n [title]=\"emptyText()\"\n />\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkOverlayRef } from '@mk-kit/ui/core';\n\n/**\n * Accessible heading for a dialog. Renders as a level-2 heading and exposes a\n * stable id that {@link MkDialog} wires to the panel's `aria-labelledby`.\n *\n * ```html\n * <mk-dialog>\n * <mk-dialog-title>Delete workspace</mk-dialog-title>\n * …\n * </mk-dialog>\n * ```\n */\n@Component({\n selector: 'mk-dialog-title',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-dialog__title',\n role: 'heading',\n 'aria-level': '2',\n '[attr.id]': 'id()',\n },\n})\nexport class MkDialogTitle {\n /** Stable id used for `aria-labelledby` wiring. */\n readonly id = input(mkUniqueId('mk-dialog-title'));\n}\n\n/**\n * Dialog layout — a surface with a sticky header, scrollable body, and sticky\n * footer, designed to be rendered inside an {@link MkOverlayService} panel. The\n * header exposes a close button wired to the injected {@link MkOverlayRef} and\n * the dialog's title is linked to the panel via `aria-labelledby`.\n *\n * Slots: `[mkDialogHeader]` / `<mk-dialog-title>` (header), default content\n * (body), `[mkDialogFooter]` (footer).\n *\n * ```html\n * <mk-dialog>\n * <mk-dialog-title>Rename</mk-dialog-title>\n * <p>Choose a new name.</p>\n * <div mkDialogFooter>\n * <button mkButton variant=\"ghost\">Cancel</button>\n * <button mkButton>Save</button>\n * </div>\n * </mk-dialog>\n * ```\n */\n@Component({\n selector: 'mk-dialog',\n templateUrl: './dialog.html',\n styleUrl: './dialog.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // Unencapsulated so `.mk-dialog-panel` (applied to the body-level overlay\n // panel outside this component's view) can be styled from here.\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mk-dialog' },\n})\nexport class MkDialog {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n private readonly overlayRef = inject(MkOverlayRef, { optional: true });\n\n /** Optional plain-text title. Ignored when a `<mk-dialog-title>` is projected. */\n readonly dialogTitle = input<string>();\n /** Stable id for the built-in title element. */\n readonly titleId = input(mkUniqueId('mk-dialog-title'));\n /** Hide the header close button. */\n readonly hideClose = input(false, { transform: booleanAttribute });\n /**\n * Let the user move the dialog by dragging its header (pointer / touch) or\n * with the arrow keys on the grip that appears in the header. Double-click\n * the header or press Home on the grip to snap back to the centre.\n */\n readonly draggable = input(false, { transform: booleanAttribute });\n /**\n * Let the user resize the dialog from the corner grip (pointer / touch, or\n * arrow keys on the grip; Home resets). The panel never grows past the\n * viewport or shrinks below a usable minimum.\n */\n readonly resizable = input(false, { transform: booleanAttribute });\n\n private readonly destroyRef = inject(DestroyRef);\n /** The body-level overlay panel this dialog lives in (`null` when inline). */\n private panelEl: HTMLElement | null | undefined;\n /** Current drag offset from the centred position, px. */\n private offset = { x: 0, y: 0 };\n\n constructor() {\n afterNextRender(() => this.wireLabelledBy());\n afterRenderEffect(() => {\n const draggable = this.draggable();\n const resizable = this.resizable();\n const panel = this.panel();\n if (!panel) return;\n panel.classList.toggle('mk-dialog-panel--draggable', draggable);\n panel.classList.toggle('mk-dialog-panel--resizable', resizable);\n });\n const view = this.host.nativeElement.ownerDocument.defaultView;\n if (view) {\n const onResize = () => this.clampIntoView();\n view.addEventListener('resize', onResize);\n this.destroyRef.onDestroy(() => view.removeEventListener('resize', onResize));\n }\n }\n\n /** Close the surrounding overlay, if any. */\n protected close(): void {\n this.overlayRef?.close();\n }\n\n /** Snap back to the centred, preset-sized panel. */\n reset(): void {\n const panel = this.panel();\n if (!panel) return;\n this.offset = { x: 0, y: 0 };\n panel.style.translate = '';\n panel.style.width = '';\n panel.style.height = '';\n }\n\n // --- Drag / resize -----------------------------------------------------------\n\n protected onHeaderPointerDown(event: PointerEvent): void {\n if (!this.draggable()) return;\n const target = event.target as HTMLElement;\n // Controls in the header keep their own pointer behaviour.\n if (target.closest('button, a, input, textarea, select, [contenteditable=\"true\"]') && !target.closest('.mk-dialog__grip')) return;\n this.startPointer(event, 'move');\n }\n\n protected onGripPointerDown(event: PointerEvent): void {\n this.startPointer(event, 'move');\n }\n\n protected onResizerPointerDown(event: PointerEvent): void {\n this.startPointer(event, 'resize');\n }\n\n protected onHeaderDoubleClick(event: MouseEvent): void {\n if (!this.draggable()) return;\n if ((event.target as HTMLElement).closest('button, a, input, textarea, select')) return;\n this.reset();\n }\n\n protected onGripKeydown(event: KeyboardEvent): void {\n const step = event.shiftKey ? 32 : 8;\n const delta = MkDialog.arrowDelta(event.key, step);\n if (delta) {\n event.preventDefault();\n this.moveTo(this.offset.x + delta.x, this.offset.y + delta.y);\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.reset();\n }\n }\n\n protected onResizerKeydown(event: KeyboardEvent): void {\n const step = event.shiftKey ? 64 : 16;\n const delta = MkDialog.arrowDelta(event.key, step);\n const panel = this.panel();\n if (delta && panel) {\n event.preventDefault();\n const rect = panel.getBoundingClientRect();\n const rtl = this.isRtl(panel);\n this.resizeTo(rect.width + (rtl ? -delta.x : delta.x), rect.height + delta.y);\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.reset();\n }\n }\n\n private static arrowDelta(key: string, step: number): { x: number; y: number } | null {\n switch (key) {\n case 'ArrowLeft':\n return { x: -step, y: 0 };\n case 'ArrowRight':\n return { x: step, y: 0 };\n case 'ArrowUp':\n return { x: 0, y: -step };\n case 'ArrowDown':\n return { x: 0, y: step };\n default:\n return null;\n }\n }\n\n private startPointer(event: PointerEvent, mode: 'move' | 'resize'): void {\n const panel = this.panel();\n if (!panel || event.button !== 0) return;\n event.preventDefault();\n const handle = event.currentTarget as HTMLElement;\n const startX = event.clientX;\n const startY = event.clientY;\n const startOffset = { ...this.offset };\n const rect = panel.getBoundingClientRect();\n const rtl = this.isRtl(panel);\n handle.setPointerCapture?.(event.pointerId);\n this.markMoved(panel);\n panel.classList.add('mk-dialog-panel--dragging');\n\n const onMove = (e: PointerEvent) => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n if (mode === 'move') this.moveTo(startOffset.x + dx, startOffset.y + dy);\n else this.resizeTo(rect.width + (rtl ? -dx : dx), rect.height + dy);\n };\n const onEnd = () => {\n handle.removeEventListener('pointermove', onMove);\n handle.removeEventListener('pointerup', onEnd);\n handle.removeEventListener('pointercancel', onEnd);\n handle.releasePointerCapture?.(event.pointerId);\n panel.classList.remove('mk-dialog-panel--dragging');\n };\n handle.addEventListener('pointermove', onMove);\n handle.addEventListener('pointerup', onEnd);\n handle.addEventListener('pointercancel', onEnd);\n }\n\n /** Move the panel to `(x, y)` px from its centred spot, kept inside the viewport. */\n private moveTo(x: number, y: number): void {\n const panel = this.panel();\n const view = panel?.ownerDocument.defaultView;\n if (!panel || !view) return;\n const rect = panel.getBoundingClientRect();\n // Where the panel sits with no offset at all.\n const baseLeft = rect.left - this.offset.x;\n const baseTop = rect.top - this.offset.y;\n const maxX = Math.max(-baseLeft, view.innerWidth - rect.width - baseLeft);\n const maxY = Math.max(-baseTop, view.innerHeight - rect.height - baseTop);\n this.offset = {\n x: Math.min(Math.max(x, -baseLeft), maxX),\n y: Math.min(Math.max(y, -baseTop), maxY),\n };\n this.markMoved(panel);\n panel.style.translate = `${Math.round(this.offset.x)}px ${Math.round(this.offset.y)}px`;\n }\n\n /** Resize the panel to `w × h` px within [minimum, viewport]. */\n private resizeTo(w: number, h: number): void {\n const panel = this.panel();\n const view = panel?.ownerDocument.defaultView;\n if (!panel || !view) return;\n const width = Math.min(Math.max(w, 240), view.innerWidth);\n const height = Math.min(Math.max(h, 160), view.innerHeight);\n this.markMoved(panel);\n panel.style.width = `${Math.round(width)}px`;\n panel.style.height = `${Math.round(height)}px`;\n panel.style.maxWidth = '100vw';\n panel.style.maxHeight = '100vh';\n this.clampIntoView();\n }\n\n /**\n * Once the user takes hold, the entrance animation must never run again —\n * toggling `animation` back on (as a transient class would) restarts it,\n * so the panel would blink after every drag. The class is never removed.\n */\n private markMoved(panel: HTMLElement): void {\n panel.classList.add('mk-dialog-panel--moved');\n }\n\n private clampIntoView(): void {\n if (this.offset.x === 0 && this.offset.y === 0) return;\n this.moveTo(this.offset.x, this.offset.y);\n }\n\n private isRtl(panel: HTMLElement): boolean {\n const view = panel.ownerDocument.defaultView;\n return (view?.getComputedStyle(panel).direction ?? 'ltr') === 'rtl';\n }\n\n private panel(): HTMLElement | null {\n if (this.panelEl === undefined) {\n this.panelEl = this.host.nativeElement.closest<HTMLElement>('.mk-overlay-panel');\n }\n return this.panelEl;\n }\n\n /** Point the owning dialog panel's `aria-labelledby` at the title element. */\n private wireLabelledBy(): void {\n const el = this.host.nativeElement;\n const panel = el.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]');\n if (!panel) return;\n\n const titleEl = el.querySelector<HTMLElement>(\n 'mk-dialog-title, .mk-dialog__title',\n );\n if (!titleEl) return;\n if (!titleEl.id) titleEl.id = this.titleId();\n panel.setAttribute('aria-labelledby', titleEl.id);\n }\n}\n","<header\n class=\"mk-dialog__header\"\n [class.mk-dialog__header--draggable]=\"draggable()\"\n (pointerdown)=\"onHeaderPointerDown($event)\"\n (dblclick)=\"onHeaderDoubleClick($event)\"\n>\n @if (draggable()) {\n <button\n type=\"button\"\n class=\"mk-dialog__grip\"\n [attr.aria-label]=\"i18n.dialogMove\"\n [title]=\"i18n.dialogMove\"\n (pointerdown)=\"onGripPointerDown($event)\"\n (keydown)=\"onGripKeydown($event)\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"5.5\" cy=\"3.5\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"10.5\" cy=\"3.5\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"5.5\" cy=\"8\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"10.5\" cy=\"8\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"5.5\" cy=\"12.5\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"10.5\" cy=\"12.5\" r=\"1.3\" fill=\"currentColor\" />\n </svg>\n </button>\n }\n <div class=\"mk-dialog__heading\">\n <ng-content select=\"[mkDialogHeader], mk-dialog-title\" />\n @if (dialogTitle(); as heading) {\n <h2 class=\"mk-dialog__title\" [id]=\"titleId()\">{{ heading }}</h2>\n }\n </div>\n @if (!hideClose()) {\n <button\n type=\"button\"\n class=\"mk-dialog__close\"\n [attr.aria-label]=\"i18n.close\"\n (click)=\"close()\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n }\n</header>\n\n<div class=\"mk-dialog__body\">\n <ng-content />\n</div>\n\n<footer class=\"mk-dialog__footer\">\n <ng-content select=\"[mkDialogFooter]\" />\n</footer>\n\n@if (resizable()) {\n <button\n type=\"button\"\n class=\"mk-dialog__resizer\"\n [attr.aria-label]=\"i18n.dialogResize\"\n [title]=\"i18n.dialogResize\"\n (pointerdown)=\"onResizerPointerDown($event)\"\n (keydown)=\"onResizerKeydown($event)\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M14 8L8 14M14 12l-2 2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MK_OVERLAY_DATA, MkOverlayRef } from '@mk-kit/ui/core';\nimport { MkButton } from '@mk-kit/ui/button';\nimport { MkIcon } from '@mk-kit/ui/icon';\nimport { MkDialog } from './dialog';\n\n/** Data contract for {@link MkConfirmDialog} / `MkDialogService.confirm`. */\nexport interface MkConfirmDialogData {\n /** Heading text. */\n title: string;\n /** Body message. */\n message: string;\n /** Confirm button label. Default `Confirm`. */\n confirmText?: string;\n /** Cancel button label. Default `Cancel`. */\n cancelText?: string;\n /** Tone of the confirm button (and `alertdialog` semantics when `danger`). */\n tone?: 'primary' | 'danger' | 'warning' | 'success';\n /**\n * Optional registered icon name shown beside the message. Useful when the\n * action is destructive and the wording alone carries no visual weight\n * (`trash`, `alert-triangle`, `user-x`).\n */\n icon?: string;\n /** Hide the cancel button — a single-button acknowledgement (`alert`). */\n hideCancel?: boolean;\n}\n\n/**\n * Internal component backing `MkDialogService.confirm`. Renders a title,\n * message, and cancel/confirm buttons. Resolves the overlay ref with `true`\n * on confirm and `false` on cancel. Uses `alertdialog` semantics for the\n * `danger` tone (set on the panel by the service).\n */\n@Component({\n selector: 'mk-confirm-dialog',\n imports: [MkDialog, MkButton, MkIcon],\n templateUrl: './confirm-dialog.html',\n styleUrl: './confirm-dialog.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MkConfirmDialog {\n private readonly ref =\n inject<MkOverlayRef<boolean>>(MkOverlayRef);\n protected readonly data = inject<MkConfirmDialogData>(MK_OVERLAY_DATA);\n protected readonly i18n = inject(MK_I18N);\n\n protected readonly confirmTone = computed(() => this.data.tone ?? 'primary');\n protected readonly confirmText = computed(\n () => this.data.confirmText ?? this.i18n.confirm,\n );\n protected readonly cancelText = computed(\n () => this.data.cancelText ?? this.i18n.cancel,\n );\n\n protected confirm(): void {\n this.ref.close(true);\n }\n\n protected cancel(): void {\n this.ref.close(false);\n }\n}\n","<mk-dialog [dialogTitle]=\"data.title\" hideClose>\n <div class=\"mk-confirm-dialog__body\">\n @if (data.icon; as icon) {\n <mk-icon\n class=\"mk-confirm-dialog__icon\"\n [class.mk-confirm-dialog__icon--danger]=\"data.tone === 'danger'\"\n [name]=\"icon\"\n [size]=\"22\"\n />\n }\n <p class=\"mk-confirm-dialog__message\">{{ data.message }}</p>\n </div>\n\n <div mkDialogFooter>\n @if (!data.hideCancel) {\n <button mkButton variant=\"ghost\" tone=\"neutral\" (click)=\"cancel()\">\n {{ cancelText() }}\n </button>\n }\n <button mkButton [tone]=\"confirmTone()\" (click)=\"confirm()\">\n {{ confirmText() }}\n </button>\n </div>\n</mk-dialog>\n","import {\n ChangeDetectionStrategy,\n Component,\n afterNextRender,\n computed,\n inject,\n signal,\n viewChild,\n ElementRef,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MK_OVERLAY_DATA, MkOverlayRef } from '@mk-kit/ui/core';\nimport { MkButton } from '@mk-kit/ui/button';\nimport { MkInput } from '@mk-kit/ui/forms';\nimport { MkFormField } from '@mk-kit/ui/forms';\nimport { MkDialog } from './dialog';\n\n/** Data contract for {@link MkPromptDialog} / `MkDialogService.prompt`. */\nexport interface MkPromptDialogData {\n /** Heading text. */\n title: string;\n /** Optional body message shown above the input. */\n message?: string;\n /** Field label. */\n label?: string;\n /** Pre-filled value. */\n value?: string;\n /** Input placeholder. */\n placeholder?: string;\n /** Confirm button label. Default `OK`. */\n confirmText?: string;\n /** Cancel button label. Default `Cancel`. */\n cancelText?: string;\n /** Require a non-empty value before the confirm button enables. */\n required?: boolean;\n /** Native input type (e.g. `text`, `email`, `number`, `password`). */\n inputType?: string;\n}\n\n/**\n * Internal component backing `MkDialogService.prompt`. Renders a single text\n * field and resolves the overlay ref with the entered string on confirm, or\n * `null` on cancel / Escape / backdrop. Submitting the form (Enter) confirms.\n */\n@Component({\n selector: 'mk-prompt-dialog',\n imports: [MkDialog, MkButton, MkInput, MkFormField],\n templateUrl: './prompt-dialog.html',\n styleUrl: './confirm-dialog.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MkPromptDialog {\n private readonly ref = inject<MkOverlayRef<string | null>>(MkOverlayRef);\n protected readonly data = inject<MkPromptDialogData>(MK_OVERLAY_DATA);\n protected readonly i18n = inject(MK_I18N);\n // `read: ElementRef` — the template ref also carries the MkInput directive, which would otherwise win.\n private readonly inputRef = viewChild('input', { read: ElementRef });\n\n protected readonly value = signal(this.data.value ?? '');\n protected readonly confirmText = computed(\n () => this.data.confirmText ?? this.i18n.ok,\n );\n protected readonly cancelText = computed(\n () => this.data.cancelText ?? this.i18n.cancel,\n );\n protected readonly canConfirm = computed(\n () => !this.data.required || this.value().trim().length > 0,\n );\n\n constructor() {\n afterNextRender(() => (this.inputRef()?.nativeElement as HTMLInputElement | undefined)?.focus());\n }\n\n protected onInput(event: Event): void {\n this.value.set((event.target as HTMLInputElement).value);\n }\n\n protected submit(): void {\n if (this.canConfirm()) this.ref.close(this.value());\n }\n\n protected cancel(): void {\n this.ref.close(null);\n }\n}\n","<mk-dialog [dialogTitle]=\"data.title\" hideClose>\n @if (data.message) {\n <p class=\"mk-confirm-dialog__message\">{{ data.message }}</p>\n }\n\n <mk-form-field [label]=\"data.label ?? ''\">\n <input\n #input\n mkInput\n [attr.type]=\"data.inputType ?? 'text'\"\n [value]=\"value()\"\n [attr.placeholder]=\"data.placeholder ?? null\"\n [attr.required]=\"data.required ? '' : null\"\n (input)=\"onInput($event)\"\n (keydown.enter)=\"submit()\"\n />\n </mk-form-field>\n\n <div mkDialogFooter>\n <button mkButton variant=\"ghost\" tone=\"neutral\" (click)=\"cancel()\">\n {{ cancelText() }}\n </button>\n <button mkButton (click)=\"submit()\" [disabled]=\"!canConfirm()\">\n {{ confirmText() }}\n </button>\n </div>\n</mk-dialog>\n","import { Injectable, Type, inject } from '@angular/core';\nimport {\n MkOverlayConfig,\n MkOverlayService,\n} from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkOverlayRef } from '@mk-kit/ui/core';\nimport { MkConfirmDialog, MkConfirmDialogData } from './confirm-dialog';\nimport { MkPromptDialog, MkPromptDialogData } from './prompt-dialog';\n\n/**\n * Panel width preset. The panel is always `min(target, 92vw)`, so it shrinks to\n * fit a phone and grows to its target on a desktop.\n *\n * - `sm` (32rem) — the default; confirmations, single-field prompts\n * - `md` (45rem) — two-column forms\n * - `lg` (56rem) — forms with nested sections\n * - `xl` (75rem) — tables or side-by-side content inside a modal\n */\nexport type MkDialogSize = 'sm' | 'md' | 'lg' | 'xl';\n\n/** Configuration for `MkDialogService.open`. Extends the raw overlay config. */\nexport interface MkDialogConfig<TData = unknown>\n extends MkOverlayConfig<TData> {\n /** Panel width preset. Defaults to `sm`, matching pre-0.9 behaviour. */\n size?: MkDialogSize;\n}\n\nconst DIALOG_PANEL_CLASS = 'mk-dialog-panel';\n\n/**\n * Dialog service — a thin, opinionated layer over {@link MkOverlayService} that\n * renders content on a themed `--mk-surface` panel (shadow, radius, entrance\n * animation) and adds a `confirm()` convenience.\n *\n * ```ts\n * const ref = dialog.open(EditUserDialog, { data: user });\n * const saved = await ref.afterClosed;\n *\n * if (await dialog.confirm({ title: 'Delete?', message: 'This cannot be undone.', tone: 'danger' })) {\n * remove();\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkDialogService {\n private readonly overlay = inject(MkOverlayService);\n private readonly i18n = inject(MK_I18N);\n\n /** Open `component` inside a themed dialog panel. */\n open<TComponent, TResult = unknown, TData = unknown>(\n component: Type<TComponent>,\n config: MkDialogConfig<TData> = {},\n ): MkOverlayRef<TResult, TComponent> {\n const sizeClass = `mk-dialog-panel--${config.size ?? 'sm'}`;\n return this.overlay.open<TComponent, TResult, TData>(component, {\n ...config,\n role: config.role ?? 'dialog',\n panelClass: this.mergePanelClass(config.panelClass, sizeClass),\n });\n }\n\n /**\n * Open a confirmation dialog. Resolves `true` if confirmed, `false` if the\n * user cancels, presses Escape, or clicks the backdrop.\n */\n confirm(data: MkConfirmDialogData): Promise<boolean> {\n const ref = this.open<MkConfirmDialog, boolean, MkConfirmDialogData>(\n MkConfirmDialog,\n {\n data,\n role: data.tone === 'danger' ? 'alertdialog' : 'dialog',\n ariaLabel: data.title,\n },\n );\n return ref.afterClosed.then((result) => result === true);\n }\n\n /**\n * Open a single-button acknowledgement dialog. Resolves when the user\n * dismisses it (button, Escape, or backdrop).\n */\n alert(data: Omit<MkConfirmDialogData, 'hideCancel' | 'cancelText'>): Promise<void> {\n const ref = this.open<MkConfirmDialog, boolean, MkConfirmDialogData>(\n MkConfirmDialog,\n {\n data: {\n ...data,\n hideCancel: true,\n confirmText: data.confirmText ?? this.i18n.ok,\n },\n role: data.tone === 'danger' ? 'alertdialog' : 'dialog',\n ariaLabel: data.title,\n },\n );\n return ref.afterClosed.then(() => undefined);\n }\n\n /**\n * Open a single-field prompt dialog. Resolves with the entered string, or\n * `null` if the user cancels, presses Escape, or clicks the backdrop.\n */\n prompt(data: MkPromptDialogData): Promise<string | null> {\n const ref = this.open<MkPromptDialog, string | null, MkPromptDialogData>(\n MkPromptDialog,\n { data, ariaLabel: data.title },\n );\n return ref.afterClosed.then((result) => result ?? null);\n }\n\n private mergePanelClass(\n panelClass: string | string[] | undefined,\n sizeClass: string,\n ): string[] {\n const base = [DIALOG_PANEL_CLASS, sizeClass];\n if (!panelClass) return base;\n const extra = Array.isArray(panelClass) ? panelClass : [panelClass];\n return [...base, ...extra];\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { MkButton } from '@mk-kit/ui/button';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkToastItem, MkToastService } from './toast.service';\n\n/**\n * A single toast card. Internal to the toast system — rendered by\n * {@link MkToastContainer}. Displays a tone accent, optional title, message,\n * optional action button, and (when dismissible) a close button. Auto-dismiss\n * pauses while the toast is hovered or focused.\n */\n@Component({\n selector: 'mk-toast',\n imports: [MkButton],\n templateUrl: './toast.html',\n styleUrl: './toast.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-toast',\n '[attr.data-tone]': 'item().tone',\n '[attr.role]': 'role()',\n '(mouseenter)': 'pause()',\n '(mouseleave)': 'resume()',\n '(focusin)': 'pause()',\n '(focusout)': 'resume()',\n },\n})\nexport class MkToast {\n private readonly service = inject(MkToastService);\n protected readonly i18n = inject(MK_I18N);\n\n /** The toast model to render. */\n readonly item = input.required<MkToastItem>();\n\n /** Assertive alert for danger, polite status otherwise. */\n protected readonly role = computed(() =>\n this.item().tone === 'danger' ? 'alert' : 'status',\n );\n\n protected dismiss(): void {\n this.service.dismiss(this.item().id);\n }\n\n protected runAction(): void {\n this.service.runAction(this.item());\n }\n\n protected pause(): void {\n this.service.pause(this.item().id);\n }\n\n protected resume(): void {\n this.service.resume(this.item().id);\n }\n}\n","<div class=\"mk-toast__body\">\n @if (item().title; as title) {\n <p class=\"mk-toast__title\">{{ title }}</p>\n }\n <p class=\"mk-toast__message\">{{ item().message }}</p>\n\n @if (item().action; as action) {\n <div class=\"mk-toast__actions\">\n <button mkButton variant=\"link\" size=\"sm\" (click)=\"runAction()\">\n {{ action.label }}\n </button>\n </div>\n }\n</div>\n\n@if (item().dismissible) {\n <button\n type=\"button\"\n class=\"mk-toast__close\"\n [attr.aria-label]=\"i18n.dismiss\"\n (click)=\"dismiss()\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { MkToast } from './toast';\nimport { MkToastService } from './toast.service';\n\n/**\n * Fixed, bottom-right stack that renders the active toasts from\n * {@link MkToastService}. Mounted once, lazily, into `document.body` by the\n * service — not intended for direct template use.\n */\n@Component({\n selector: 'mk-toast-container',\n imports: [MkToast],\n templateUrl: './toast-container.html',\n styleUrl: './toast-container.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-toast-container',\n 'aria-label': 'Notifications',\n },\n})\nexport class MkToastContainer {\n private readonly service = inject(MkToastService);\n /** Live list of toasts to render. */\n protected readonly toasts = this.service.toasts;\n}\n","@for (toast of toasts(); track toast.id) {\n <mk-toast [item]=\"toast\" />\n}\n","import {\n ApplicationRef,\n ComponentRef,\n DOCUMENT,\n EnvironmentInjector,\n Injectable,\n PLATFORM_ID,\n createComponent,\n inject,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_OVERLAY_ROOT } from '@mk-kit/ui/core';\nimport { MkToastContainer } from './toast-container';\n\n/** Semantic tones supported by toasts. */\nexport type MkToastTone = 'info' | 'success' | 'warning' | 'danger' | 'neutral';\n\n/** An optional action button rendered inside a toast. */\nexport interface MkToastAction {\n /** Button label. */\n label: string;\n /** Invoked when the action is activated. The toast is dismissed afterwards. */\n handler?: () => void;\n}\n\n/** Options accepted by {@link MkToastService.show}. */\nexport interface MkToastConfig {\n /** Optional bold heading. */\n title?: string;\n /** Body message (required). */\n message: string;\n /** Semantic tone. Default `info`. */\n tone?: MkToastTone;\n /** Auto-dismiss delay in ms. `0` keeps the toast until dismissed. Default `5000`. */\n duration?: number;\n /** Show a close button. Default `true`. */\n dismissible?: boolean;\n /** Optional action button. */\n action?: MkToastAction;\n}\n\n/** A live toast rendered by the container. */\nexport interface MkToastItem {\n readonly id: number;\n readonly title?: string;\n readonly message: string;\n readonly tone: MkToastTone;\n readonly duration: number;\n readonly dismissible: boolean;\n readonly action?: MkToastAction;\n}\n\nconst DEFAULT_DURATION = 5000;\nlet nextId = 0;\n\ninterface ToastTimer {\n handle: ReturnType<typeof setTimeout>;\n remaining: number;\n startedAt: number;\n}\n\n/**\n * Toast service — enqueues transient notifications rendered by a single,\n * lazily-mounted {@link MkToastContainer} at the bottom-right of the viewport.\n * Each rendered toast is itself a live region (`role=\"alert\"` for `danger`,\n * else `role=\"status\"`), so assistive tech announces it exactly once. Toasts\n * auto-dismiss after `duration` ms unless it is `0`.\n *\n * ```ts\n * toasts.success('Saved');\n * toasts.show({ title: 'Upload failed', message: 'Retry?', tone: 'danger',\n * duration: 0, action: { label: 'Retry', handler: () => retry() } });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkToastService {\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly overlayRoot = inject(MK_OVERLAY_ROOT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly _toasts = signal<readonly MkToastItem[]>([]);\n /** Reactive list of currently visible toasts. */\n readonly toasts = this._toasts.asReadonly();\n\n private readonly timers = new Map<number, ToastTimer>();\n private containerRef?: ComponentRef<MkToastContainer>;\n\n /** Show a toast, returning its id (usable with {@link dismiss}). */\n show(config: MkToastConfig): number {\n const item: MkToastItem = {\n id: nextId++,\n title: config.title,\n message: config.message,\n tone: config.tone ?? 'info',\n duration: config.duration ?? DEFAULT_DURATION,\n dismissible: config.dismissible ?? true,\n action: config.action,\n };\n\n if (!this.isBrowser) return item.id;\n\n this.ensureContainer();\n // The toast element itself carries role=\"alert\"/\"status\" — no separate\n // live-announcer call, or screen readers would read everything twice.\n this._toasts.update((list) => [...list, item]);\n\n if (item.duration > 0) this.startTimer(item.id, item.duration);\n return item.id;\n }\n\n /** Show an `info` toast. */\n info(message: string, config: Partial<MkToastConfig> = {}): number {\n return this.show({ ...config, message, tone: 'info' });\n }\n /** Show a `success` toast. */\n success(message: string, config: Partial<MkToastConfig> = {}): number {\n return this.show({ ...config, message, tone: 'success' });\n }\n /** Show a `warning` toast. */\n warning(message: string, config: Partial<MkToastConfig> = {}): number {\n return this.show({ ...config, message, tone: 'warning' });\n }\n /** Show a `danger` toast. */\n danger(message: string, config: Partial<MkToastConfig> = {}): number {\n return this.show({ ...config, message, tone: 'danger' });\n }\n /** Show a `neutral` toast. */\n neutral(message: string, config: Partial<MkToastConfig> = {}): number {\n return this.show({ ...config, message, tone: 'neutral' });\n }\n\n /** Dismiss a toast by id. */\n dismiss(id: number): void {\n this.clearTimer(id);\n this._toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n /** Dismiss every visible toast. */\n clear(): void {\n this.timers.forEach((t) => clearTimeout(t.handle));\n this.timers.clear();\n this._toasts.set([]);\n }\n\n /** Run a toast action, then dismiss it. */\n runAction(item: MkToastItem): void {\n item.action?.handler?.();\n this.dismiss(item.id);\n }\n\n /** Pause a toast's auto-dismiss countdown (e.g. on hover/focus). */\n pause(id: number): void {\n const timer = this.timers.get(id);\n if (!timer) return;\n clearTimeout(timer.handle);\n timer.remaining -= Date.now() - timer.startedAt;\n }\n\n /** Resume a paused countdown. */\n resume(id: number): void {\n const timer = this.timers.get(id);\n if (!timer) return;\n this.startTimer(id, Math.max(timer.remaining, 0));\n }\n\n private startTimer(id: number, duration: number): void {\n this.timers.set(id, {\n handle: setTimeout(() => this.dismiss(id), duration),\n remaining: duration,\n startedAt: Date.now(),\n });\n }\n\n private clearTimer(id: number): void {\n const timer = this.timers.get(id);\n if (timer) clearTimeout(timer.handle);\n this.timers.delete(id);\n }\n\n private ensureContainer(): void {\n if (this.containerRef) return;\n const ref = createComponent(MkToastContainer, {\n environmentInjector: this.envInjector,\n });\n this.appRef.attachView(ref.hostView);\n this.overlayRoot().appendChild(ref.location.nativeElement);\n this.containerRef = ref;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkSnackbarItem, MkSnackbarService } from './snackbar.service';\n\n/**\n * The visual snackbar bar. Internal to the snackbar system — rendered by\n * {@link MkSnackbarContainer}. Shows a message, an optional action button and\n * (when `dismissible`) a close button. Auto-dismiss pauses on hover/focus.\n */\n@Component({\n selector: 'mk-snackbar',\n templateUrl: './snackbar.html',\n styleUrl: './snackbar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-snackbar',\n '[attr.data-tone]': 'item().tone',\n '[attr.role]': 'role()',\n '(mouseenter)': 'pause()',\n '(mouseleave)': 'resume()',\n '(focusin)': 'pause()',\n '(focusout)': 'resume()',\n },\n})\nexport class MkSnackbar {\n private readonly service = inject(MkSnackbarService);\n protected readonly i18n = inject(MK_I18N);\n\n /** The snackbar model to render. */\n readonly item = input.required<MkSnackbarItem>();\n\n /** Assertive alert for danger/warning, polite status otherwise. */\n protected readonly role = computed(() =>\n this.item().tone === 'danger' || this.item().tone === 'warning'\n ? 'alert'\n : 'status',\n );\n\n protected runAction(): void {\n this.service.runAction(this.item().id);\n }\n\n protected dismiss(): void {\n this.service.dismiss(this.item().id);\n }\n\n protected pause(): void {\n this.service.pause();\n }\n\n protected resume(): void {\n this.service.resume();\n }\n}\n","<span class=\"mk-snackbar__message\">{{ item().message }}</span>\n\n@if (item().actionLabel) {\n <button type=\"button\" class=\"mk-snackbar__action\" (click)=\"runAction()\">\n {{ item().actionLabel }}\n </button>\n}\n\n@if (item().dismissible) {\n <button\n type=\"button\"\n class=\"mk-snackbar__close\"\n [attr.aria-label]=\"i18n.dismiss\"\n (click)=\"dismiss()\"\n ></button>\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { MkSnackbar } from './snackbar';\nimport { MkSnackbarService } from './snackbar.service';\n\n/**\n * Fixed, bottom-centre host that renders the single active snackbar from\n * {@link MkSnackbarService}. Mounted once, lazily, into `document.body` by the\n * service — not intended for direct template use.\n */\n@Component({\n selector: 'mk-snackbar-container',\n imports: [MkSnackbar],\n templateUrl: './snackbar-container.html',\n styleUrl: './snackbar-container.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-snackbar-container',\n },\n})\nexport class MkSnackbarContainer {\n private readonly service = inject(MkSnackbarService);\n /** The active snackbar to render, or `null`. */\n protected readonly active = this.service.active;\n}\n","@if (active(); as item) {\n <mk-snackbar [item]=\"item\" />\n}\n","import {\n ApplicationRef,\n ComponentRef,\n DOCUMENT,\n EnvironmentInjector,\n Injectable,\n PLATFORM_ID,\n createComponent,\n inject,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_OVERLAY_ROOT } from '@mk-kit/ui/core';\nimport { MkSnackbarContainer } from './snackbar-container';\n\n/** Semantic tone of a snackbar. `neutral` is the default dark bar. */\nexport type MkSnackbarTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger';\n\n/** Why a snackbar closed. */\nexport type MkSnackbarDismissReason = 'action' | 'timeout' | 'dismiss';\n\n/** Options for {@link MkSnackbarService.open}. */\nexport interface MkSnackbarConfig {\n /** Semantic tone. Default `neutral`. */\n tone?: MkSnackbarTone;\n /** Auto-dismiss delay in ms. `0` keeps it open until dismissed. Default `5000`. */\n duration?: number;\n /** Show a close (×) button. Default `false` (dismiss via action/timeout). */\n dismissible?: boolean;\n /**\n * @deprecated The snackbar element is itself the live region — its\n * politeness is derived from `tone` (`alert` for danger/warning, else\n * `status`). This option is ignored.\n */\n politeness?: 'polite' | 'assertive';\n}\n\n/** The live snackbar model rendered by the container. */\nexport interface MkSnackbarItem {\n readonly id: number;\n readonly message: string;\n readonly actionLabel?: string;\n readonly tone: MkSnackbarTone;\n readonly dismissible: boolean;\n}\n\nconst DEFAULT_DURATION = 5000;\nlet nextId = 0;\n\n/**\n * Handle to an opened snackbar. Await {@link onAction} to react to the action\n * button, or {@link afterDismissed} to run code once it closes.\n */\nexport class MkSnackbarRef {\n private actionResolve!: () => void;\n private dismissResolve!: (reason: MkSnackbarDismissReason) => void;\n private readonly actionPromise = new Promise<void>((r) => {\n this.actionResolve = r;\n });\n private readonly dismissPromise = new Promise<MkSnackbarDismissReason>((r) => {\n this.dismissResolve = r;\n });\n\n constructor(\n /** Unique id of the snackbar this ref controls. */\n readonly id: number,\n private readonly service: MkSnackbarService,\n ) {}\n\n /** Dismiss the snackbar programmatically. */\n dismiss(): void {\n this.service.dismiss(this.id);\n }\n\n /** Resolves when the action button is activated. */\n onAction(): Promise<void> {\n return this.actionPromise;\n }\n\n /** Resolves when the snackbar has closed, with the reason it closed. */\n afterDismissed(): Promise<MkSnackbarDismissReason> {\n return this.dismissPromise;\n }\n\n /** @internal */\n _notifyAction(): void {\n this.actionResolve();\n }\n /** @internal */\n _notifyDismissed(reason: MkSnackbarDismissReason): void {\n this.dismissResolve(reason);\n }\n}\n\n/**\n * Snackbar service — shows a single, brief message at the bottom-centre of the\n * viewport with an optional action button, following the Material snackbar\n * model: only one is visible at a time, and opening a new one replaces the\n * current. For stacked, persistent notifications use `MkToastService` instead.\n *\n * ```ts\n * const ref = snackbar.open('Message archived', 'Undo');\n * ref.onAction().then(() => restore());\n *\n * snackbar.open('Changes saved', undefined, { tone: 'success' });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkSnackbarService {\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly overlayRoot = inject(MK_OVERLAY_ROOT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly _active = signal<MkSnackbarItem | null>(null);\n /** The currently visible snackbar, or `null`. */\n readonly active = this._active.asReadonly();\n\n private readonly refs = new Map<number, MkSnackbarRef>();\n private timer?: ReturnType<typeof setTimeout>;\n private remaining = 0;\n private startedAt = 0;\n private containerRef?: ComponentRef<MkSnackbarContainer>;\n\n /**\n * Open a snackbar. `action` is the (optional) button label — react to it via\n * the returned ref's {@link MkSnackbarRef.onAction}.\n */\n open(\n message: string,\n action?: string,\n config: MkSnackbarConfig = {},\n ): MkSnackbarRef {\n const id = nextId++;\n const ref = new MkSnackbarRef(id, this);\n if (!this.isBrowser) return ref;\n\n // Replace any currently-open snackbar (Material single-slot behaviour).\n const current = this._active();\n if (current) this.dismiss(current.id);\n\n const item: MkSnackbarItem = {\n id,\n message,\n actionLabel: action,\n tone: config.tone ?? 'neutral',\n dismissible: config.dismissible ?? false,\n };\n\n this.ensureContainer();\n this.refs.set(id, ref);\n // The snackbar element itself carries role=\"alert\"/\"status\" — no separate\n // live-announcer call, or screen readers would read everything twice.\n this._active.set(item);\n\n const duration = config.duration ?? DEFAULT_DURATION;\n if (duration > 0) this.startTimer(id, duration);\n return ref;\n }\n\n /** Dismiss the snackbar with the given id (if it is the active one). */\n dismiss(id: number): void {\n this.close(id, 'dismiss');\n }\n\n /** Run the action for the active snackbar, then close it. */\n runAction(id: number): void {\n this.refs.get(id)?._notifyAction();\n this.close(id, 'action');\n }\n\n /** Pause the auto-dismiss countdown (e.g. on hover/focus). */\n pause(): void {\n if (!this.timer) return;\n clearTimeout(this.timer);\n this.timer = undefined;\n this.remaining -= Date.now() - this.startedAt;\n }\n\n /** Resume a paused countdown. */\n resume(): void {\n const active = this._active();\n if (!active || this.timer || this.remaining <= 0) return;\n this.startTimer(active.id, this.remaining);\n }\n\n private close(id: number, reason: MkSnackbarDismissReason): void {\n if (this._active()?.id !== id) return;\n this.clearTimer();\n this._active.set(null);\n const ref = this.refs.get(id);\n this.refs.delete(id);\n ref?._notifyDismissed(reason);\n }\n\n private startTimer(id: number, duration: number): void {\n this.remaining = duration;\n this.startedAt = Date.now();\n this.timer = setTimeout(() => this.close(id, 'timeout'), duration);\n }\n\n private clearTimer(): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = undefined;\n this.remaining = 0;\n }\n\n private ensureContainer(): void {\n if (this.containerRef) return;\n const ref = createComponent(MkSnackbarContainer, {\n environmentInjector: this.envInjector,\n });\n this.appRef.attachView(ref.hostView);\n this.overlayRoot().appendChild(ref.location.nativeElement);\n this.containerRef = ref;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkOverlayRef } from '@mk-kit/ui/core';\n\n/** Distance in px the sheet must be dragged down before it dismisses. */\nconst DISMISS_THRESHOLD = 120;\n\n/**\n * BottomSheet layout — the surface rendered inside an {@link MkOverlayService}\n * panel by {@link MkBottomSheetService}. Provides a drag handle (swipe down to\n * dismiss), an optional titled header with a close button, and a scrollable\n * body for projected content.\n *\n * Slots: `[mkBottomSheetHeader]` (extra header content), default content\n * (body), `[mkBottomSheetFooter]` (sticky footer).\n *\n * ```html\n * <mk-bottom-sheet sheetTitle=\"Share\">\n * <button mkButton fullWidth variant=\"ghost\">Copy link</button>\n * <button mkButton fullWidth variant=\"ghost\">Email</button>\n * </mk-bottom-sheet>\n * ```\n */\n@Component({\n selector: 'mk-bottom-sheet',\n templateUrl: './bottom-sheet.html',\n styleUrl: './bottom-sheet.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // Unencapsulated so `.mk-bottom-sheet-panel` (the body-level overlay panel\n // outside this component's view) can be styled from here.\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mk-bottom-sheet' },\n})\nexport class MkBottomSheet {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n private readonly overlayRef = inject(MkOverlayRef, { optional: true });\n\n /** Optional plain-text title rendered in the header. */\n readonly sheetTitle = input<string>();\n /** Stable id for the built-in title element. */\n readonly titleId = input(mkUniqueId('mk-bottom-sheet-title'));\n /** Hide the drag handle (also disables swipe-to-dismiss). */\n readonly hideHandle = input(false, { transform: booleanAttribute });\n /** Hide the header close button. */\n readonly hideClose = input(false, { transform: booleanAttribute });\n\n private panel: HTMLElement | null = null;\n private dragging = false;\n private startY = 0;\n\n constructor() {\n afterNextRender(() => this.wireLabelledBy());\n }\n\n /** Close the surrounding overlay, if any. */\n protected close(): void {\n this.overlayRef?.close();\n }\n\n protected onHandlePointerDown(event: PointerEvent): void {\n this.panel ??= this.host.nativeElement.closest<HTMLElement>(\n '.mk-bottom-sheet-panel',\n );\n if (!this.panel) return;\n this.dragging = true;\n this.startY = event.clientY;\n (event.target as HTMLElement).setPointerCapture?.(event.pointerId);\n this.panel.style.transition = 'none';\n }\n\n protected onHandlePointerMove(event: PointerEvent): void {\n if (!this.dragging || !this.panel) return;\n const dy = Math.max(0, event.clientY - this.startY);\n this.panel.style.transform = `translateY(${dy}px)`;\n }\n\n protected onHandlePointerUp(event: PointerEvent): void {\n if (!this.dragging || !this.panel) return;\n this.dragging = false;\n const dy = Math.max(0, event.clientY - this.startY);\n this.panel.style.transition = '';\n if (dy > DISMISS_THRESHOLD) {\n this.overlayRef?.close();\n } else {\n this.panel.style.transform = '';\n }\n }\n\n /** Point the owning panel's `aria-labelledby` at the title element. */\n private wireLabelledBy(): void {\n const el = this.host.nativeElement;\n const panel = el.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]');\n const titleEl = el.querySelector<HTMLElement>('.mk-bottom-sheet__title');\n if (!panel || !titleEl) return;\n if (!titleEl.id) titleEl.id = this.titleId();\n panel.setAttribute('aria-labelledby', titleEl.id);\n }\n}\n","@if (!hideHandle()) {\n <div\n class=\"mk-bottom-sheet__handle-area\"\n (pointerdown)=\"onHandlePointerDown($event)\"\n (pointermove)=\"onHandlePointerMove($event)\"\n (pointerup)=\"onHandlePointerUp($event)\"\n (pointercancel)=\"onHandlePointerUp($event)\"\n >\n <span class=\"mk-bottom-sheet__handle\" aria-hidden=\"true\"></span>\n </div>\n}\n\n@if (sheetTitle() || !hideClose()) {\n <header class=\"mk-bottom-sheet__header\">\n @if (sheetTitle(); as heading) {\n <h2 class=\"mk-bottom-sheet__title\" [id]=\"titleId()\">{{ heading }}</h2>\n }\n <ng-content select=\"[mkBottomSheetHeader]\" />\n @if (!hideClose()) {\n <button\n type=\"button\"\n class=\"mk-bottom-sheet__close\"\n [attr.aria-label]=\"i18n.close\"\n (click)=\"close()\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n }\n </header>\n}\n\n<div class=\"mk-bottom-sheet__body\">\n <ng-content />\n</div>\n\n<footer class=\"mk-bottom-sheet__footer\">\n <ng-content select=\"[mkBottomSheetFooter]\" />\n</footer>\n","import { Injectable, Type, inject } from '@angular/core';\nimport {\n MkOverlayConfig,\n MkOverlayService,\n} from '@mk-kit/ui/core';\nimport { MkOverlayRef } from '@mk-kit/ui/core';\n\n/** Configuration for `MkBottomSheetService.open`. Extends the overlay config. */\nexport interface MkBottomSheetConfig<TData = unknown>\n extends MkOverlayConfig<TData> {}\n\nconst BOTTOM_SHEET_PANEL_CLASS = 'mk-bottom-sheet-panel';\n\n/**\n * BottomSheet service — a thin layer over {@link MkOverlayService} that renders\n * a component in a panel anchored to the bottom edge of the viewport: full\n * width on small screens, a centred card capped at ~42rem on large ones. It\n * slides up on open and can be swiped down to dismiss (via {@link MkBottomSheet}).\n *\n * Use it for contextual actions, pickers and mobile-style menus. For a centred\n * modal use `MkDialogService` instead.\n *\n * ```ts\n * const ref = bottomSheet.open(ShareSheet, { data: { url } });\n * const choice = await ref.afterClosed;\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkBottomSheetService {\n private readonly overlay = inject(MkOverlayService);\n\n /** Open `component` inside a bottom-anchored sheet panel. */\n open<TComponent, TResult = unknown, TData = unknown>(\n component: Type<TComponent>,\n config: MkBottomSheetConfig<TData> = {},\n ): MkOverlayRef<TResult, TComponent> {\n return this.overlay.open<TComponent, TResult, TData>(component, {\n ...config,\n role: config.role ?? 'dialog',\n panelClass: this.mergePanelClass(config.panelClass),\n });\n }\n\n private mergePanelClass(\n panelClass: string | string[] | undefined,\n ): string[] {\n if (!panelClass) return [BOTTOM_SHEET_PANEL_CLASS];\n const extra = Array.isArray(panelClass) ? panelClass : [panelClass];\n return [BOTTOM_SHEET_PANEL_CLASS, ...extra];\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n inject,\n} from '@angular/core';\nimport type { MkTone } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/**\n * Banner — a persistent, full-width page/section message with a tone, optional\n * title, an actions slot and optional dismiss. Heavier than an inline\n * {@link MkAlert} toast; use it for standing notices (\"Trial ends in 3 days\").\n *\n * Project an icon with `[mkBannerIcon]` and buttons with `[mkBannerActions]`.\n * Danger/warning banners announce assertively (`role=\"alert\"`).\n *\n * ```html\n * <mk-banner tone=\"warning\" title=\"Storage almost full\" dismissible>\n * You've used 90% of your quota.\n * <button mkButton size=\"sm\" mkBannerActions>Upgrade</button>\n * </mk-banner>\n * ```\n */\n@Component({\n selector: 'mk-banner',\n templateUrl: './banner.html',\n styleUrl: './banner.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-banner',\n '[attr.data-tone]': 'tone()',\n },\n})\nexport class MkBanner {\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n /** Semantic color tone. */\n readonly tone = input<MkTone>('info');\n /** Optional bold title above the message. */\n readonly title = input<string>('');\n /** Show a dismiss (×) button. */\n readonly dismissible = input(false, { transform: booleanAttribute });\n /** Two-way open state; set false to hide. */\n readonly open = model(true);\n\n /** Emitted when the banner is dismissed. */\n readonly dismissed = output<void>();\n\n protected readonly role = computed(() => {\n const t = this.tone();\n return t === 'danger' || t === 'warning' ? 'alert' : 'status';\n });\n\n protected dismiss(): void {\n this.open.set(false);\n this.dismissed.emit();\n }\n}\n","@if (open()) {\n <div class=\"mk-banner__box\">\n <span class=\"mk-banner__icon\" aria-hidden=\"true\"\n ><ng-content select=\"[mkBannerIcon]\"\n /></span>\n <!-- The live region wraps only the title + message, keeping the actions\n and the dismiss button out of what gets announced. -->\n <div class=\"mk-banner__body\" [attr.role]=\"role()\">\n @if (title()) {\n <p class=\"mk-banner__title\">{{ title() }}</p>\n }\n <div class=\"mk-banner__message\"><ng-content /></div>\n </div>\n <div class=\"mk-banner__actions\"><ng-content select=\"[mkBannerActions]\" /></div>\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"mk-banner__close\"\n [attr.aria-label]=\"i18n.dismiss\"\n (click)=\"dismiss()\"\n >\n <span aria-hidden=\"true\">×</span>\n </button>\n }\n </div>\n}\n","import { Injectable, PLATFORM_ID, computed, inject, signal } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Drives a global {@link MkLoadingBar} — the thin top-of-page progress bar for\n * route changes and background work. `start()` shows it and trickles toward 90%;\n * `complete()` finishes and hides it. Also supports a determinate `set(value)`.\n *\n * ```ts\n * const bar = inject(MkLoadingBarService);\n * router.events.subscribe(e => {\n * if (e instanceof NavigationStart) bar.start();\n * if (e instanceof NavigationEnd) bar.complete();\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkLoadingBarService {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly _progress = signal(0);\n private readonly _active = signal(false);\n /** Current progress, 0–100. */\n readonly progress = this._progress.asReadonly();\n /** Whether the bar is visible. */\n readonly active = this._active.asReadonly();\n\n private timer?: ReturnType<typeof setInterval>;\n private doneTimer?: ReturnType<typeof setTimeout>;\n\n /** Show the bar and start trickling toward 90%. */\n start(): void {\n if (!this.isBrowser) return;\n this.clearTimers();\n this._active.set(true);\n this._progress.set(8);\n this.armTrickle();\n }\n\n /** Set an explicit determinate value (0–100). */\n set(value: number): void {\n this.clearTimers();\n this._active.set(true);\n this._progress.set(Math.max(0, Math.min(100, value)));\n }\n\n /** Nudge progress up by `amount` (default 5), capped at 90%. */\n inc(amount = 5): void {\n if (!this._active()) this.start();\n this._progress.set(Math.min(90, this._progress() + amount));\n // Re-arm the trickle if it stopped at the ceiling (or after a `set()`)\n // and there is still room to move.\n if (this._progress() < 90) this.armTrickle();\n }\n\n /** Finish (jump to 100%) then fade out. */\n complete(): void {\n if (!this.isBrowser) {\n this._active.set(false);\n return;\n }\n this.clearTimers();\n this._progress.set(100);\n this.doneTimer = setTimeout(() => {\n this._active.set(false);\n this._progress.set(0);\n }, 350);\n }\n\n /** Hide immediately without finishing. */\n stop(): void {\n this.clearTimers();\n this._active.set(false);\n this._progress.set(0);\n }\n\n /**\n * Auto-slowing trickle so the bar keeps moving without ever completing.\n * Stops its own interval at the 90% ceiling — otherwise a navigation that\n * never `complete()`s would leave a timer firing (and, in a zoneless app,\n * scheduling change detection) forever. `start()`/`inc()` re-arm it.\n */\n private trickle(): void {\n const p = this._progress();\n if (p >= 90) {\n this.stopTrickle();\n return;\n }\n const step = p < 20 ? 10 : p < 50 ? 4 : p < 80 ? 2 : 0.5;\n const next = Math.min(90, p + step);\n this._progress.set(next);\n if (next >= 90) this.stopTrickle();\n }\n\n /** Start the 350ms trickle interval unless it is already running. */\n private armTrickle(): void {\n if (!this.isBrowser || this.timer) return;\n this.timer = setInterval(() => this.trickle(), 350);\n }\n\n private stopTrickle(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n private clearTimers(): void {\n if (this.timer) clearInterval(this.timer);\n if (this.doneTimer) clearTimeout(this.doneTimer);\n this.timer = undefined;\n this.doneTimer = undefined;\n }\n\n /** True while finishing (progress full but not yet hidden). */\n readonly finishing = computed(() => this._active() && this._progress() >= 100);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkLoadingBarService } from './loading-bar.service';\n\n/**\n * LoadingBar — a thin progress bar fixed to the top of the viewport, driven by\n * {@link MkLoadingBarService}. Place it once (e.g. in the app shell) and call\n * `start()` / `complete()` on navigation or async work.\n *\n * ```html\n * <mk-loading-bar />\n * ```\n */\n@Component({\n selector: 'mk-loading-bar',\n template: `<div\n class=\"mk-loading-bar__fill\"\n [style.transform]=\"fillTransform()\"\n [style.background]=\"color()\"\n ></div>`,\n styleUrl: './loading-bar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-loading-bar',\n role: 'progressbar',\n 'aria-valuemin': '0',\n 'aria-valuemax': '100',\n '[attr.aria-valuenow]': 'active() ? progress() : null',\n '[attr.aria-hidden]': \"active() ? null : 'true'\",\n '[attr.aria-label]': 'i18n.loading',\n '[class.mk-loading-bar--active]': 'active()',\n '[style.height.px]': 'height()',\n },\n})\nexport class MkLoadingBar {\n private readonly service = inject(MkLoadingBarService);\n protected readonly i18n = inject(MK_I18N);\n\n /** Bar colour. */\n readonly color = input('var(--mk-primary)');\n /** Bar thickness in px. */\n readonly height = input(3, { transform: numberAttribute });\n\n protected readonly progress = this.service.progress;\n protected readonly active = computed(() => this.service.active());\n\n /**\n * The fill is a full-width bar scaled from the inline start — `transform`\n * animates on the compositor, so each trickle tick avoids the layout+paint\n * cost that animating `width` incurred. Origin flips for RTL in the styles.\n */\n protected readonly fillTransform = computed(\n () => `scaleX(${this.progress() / 100})`,\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InjectionToken,\n Injector,\n afterNextRender,\n computed,\n inject,\n viewChild,\n} from '@angular/core';\nimport type { MkPlacement } from '@mk-kit/ui/core';\nimport { mkGetFocusable } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkAnchoredPanel } from '@mk-kit/ui/core';\n\n/**\n * A single coach-mark step in a product tour. The `target` is the element the\n * step points at — either a live `HTMLElement` or a CSS selector resolved\n * against the document when the step is shown.\n */\nexport interface MkTourStep {\n /** Element (or selector) the popover anchors to and highlights. */\n target: string | HTMLElement;\n /** Optional heading shown above the body. */\n title?: string;\n /** The explanatory copy for this step. */\n body: string;\n /** Preferred placement of the popover relative to the target. */\n placement?: MkPlacement;\n}\n\n/** Navigation callbacks the popup invokes on the owning {@link MkTourService}. */\nexport interface MkTourController {\n next(): void;\n prev(): void;\n end(): void;\n}\n\n/** Per-step data injected into {@link MkTourPopup} via {@link MK_TOUR_DATA}. */\nexport interface MkTourData {\n /** The step being shown. */\n step: MkTourStep;\n /** Zero-based index of this step. */\n index: number;\n /** Total number of steps in the tour. */\n total: number;\n /** The resolved target element to anchor against. */\n anchor: HTMLElement;\n /** Navigation handle back to the service. */\n controller: MkTourController;\n}\n\n/** DI token carrying the current {@link MkTourData} to the popup. */\nexport const MK_TOUR_DATA = new InjectionToken<MkTourData>('MK_TOUR_DATA');\n\n/**\n * The floating coach-mark popover for one tour step. Rendered dynamically by\n * {@link MkTourService} (one instance per step) and anchored to the step's\n * target through {@link MkAnchoredPanel}, so it lives in the browser top layer\n * and is never clipped by an ancestor's `overflow`/`transform`.\n */\n@Component({\n selector: 'mk-tour-popup',\n templateUrl: './tour-popup.html',\n styleUrl: './tour-popup.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkAnchoredPanel],\n host: {\n class: 'mk-tour',\n },\n})\nexport class MkTourPopup {\n private readonly injector = inject(Injector);\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n protected readonly i18n = inject(MK_I18N);\n\n /** The step + navigation data for this popup. */\n protected readonly data = inject(MK_TOUR_DATA);\n\n /** Whether this is the final step (Next becomes \"Done\"). */\n protected readonly isLast = computed(\n () => this.data.index >= this.data.total - 1,\n );\n\n constructor() {\n afterNextRender(() => this.focusInitial(), { injector: this.injector });\n }\n\n protected next(): void {\n this.data.controller.next();\n }\n\n protected prev(): void {\n this.data.controller.prev();\n }\n\n protected skip(): void {\n this.data.controller.end();\n }\n\n protected onEscape(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.data.controller.end();\n }\n\n /**\n * Ignore anchored-panel dismisses (outside pointerdown / window blur): a tour\n * should stay put while the user reads it — it ends only via the buttons or\n * Escape.\n */\n protected onDismiss(): void {\n /* intentionally inert */\n }\n\n /**\n * Trap Tab inside the popup (the dialog is `aria-modal` over a scrim): wrap\n * from the last tabbable back to the first and vice versa, and pull focus in\n * if it somehow ended up outside.\n */\n protected onTab(event: Event): void {\n const e = event as KeyboardEvent;\n const panel = this.panelRef()?.nativeElement;\n if (!panel) return;\n\n const focusable = mkGetFocusable(panel);\n if (focusable.length === 0) {\n e.preventDefault();\n panel.focus();\n return;\n }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = panel.ownerDocument.activeElement;\n\n if (!panel.contains(active)) {\n e.preventDefault();\n first.focus();\n } else if (e.shiftKey && active === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n private focusInitial(): void {\n const panel = this.panelRef()?.nativeElement;\n if (!panel) return;\n (mkGetFocusable(panel)[0] ?? panel).focus();\n }\n}\n","<div\n #panel\n class=\"mk-tour__popup\"\n role=\"dialog\"\n aria-modal=\"true\"\n tabindex=\"-1\"\n [attr.aria-label]=\"data.step.title ?? data.step.body\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"data.anchor\"\n [placement]=\"data.step.placement ?? 'bottom'\"\n [gap]=\"12\"\n (dismiss)=\"onDismiss()\"\n (keydown.escape)=\"onEscape($event)\"\n (keydown.tab)=\"onTab($event)\"\n (keydown.shift.tab)=\"onTab($event)\"\n>\n @if (data.step.title; as title) {\n <h3 class=\"mk-tour__title\">{{ title }}</h3>\n }\n <p class=\"mk-tour__body\">{{ data.step.body }}</p>\n\n <div class=\"mk-tour__footer\">\n <span class=\"mk-tour__indicator\">\n {{ i18n.tourStepOf(data.index + 1, data.total) }}\n </span>\n <div class=\"mk-tour__actions\">\n <button type=\"button\" class=\"mk-tour__btn mk-tour__btn--ghost\" (click)=\"skip()\">\n {{ i18n.tourSkip }}\n </button>\n @if (data.index > 0) {\n <button type=\"button\" class=\"mk-tour__btn\" (click)=\"prev()\">\n {{ i18n.tourPrevious }}\n </button>\n }\n <button\n type=\"button\"\n class=\"mk-tour__btn mk-tour__btn--primary\"\n (click)=\"next()\"\n >\n {{ isLast() ? i18n.tourDone : i18n.tourNext }}\n </button>\n </div>\n </div>\n</div>\n","import {\n ApplicationRef,\n ComponentRef,\n DOCUMENT,\n DestroyRef,\n EnvironmentInjector,\n Injectable,\n Injector,\n PLATFORM_ID,\n computed,\n createComponent,\n inject,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_OVERLAY_ROOT } from '@mk-kit/ui/core';\nimport {\n MK_TOUR_DATA,\n MkTourPopup,\n type MkTourData,\n type MkTourStep,\n} from './tour-popup';\n\n/** Inline styles overwritten on the highlighted target; restored on teardown. */\ninterface MkTargetSnapshot {\n el: HTMLElement;\n position: string;\n zIndex: string;\n boxShadow: string;\n borderRadius: string;\n transition: string;\n}\n\n/**\n * Product-onboarding tour service — walks the user through a sequence of\n * {@link MkTourStep}s. For each step it scrolls the target into view, dims the\n * page behind a scrim, highlights the target with a bright ring, and anchors a\n * coach-mark popover ({@link MkTourPopup}) to it in the browser top layer via\n * `MkAnchoredPanel`.\n *\n * ```ts\n * const tour = inject(MkTourService);\n * await tour.start([\n * { target: '#new-btn', title: 'Create', body: 'Start a project here.' },\n * { target: '#inbox', body: 'Your notifications land here.', placement: 'left' },\n * ]);\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkTourService {\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly overlayRoot = inject(MK_OVERLAY_ROOT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly _steps = signal<readonly MkTourStep[]>([]);\n private readonly _index = signal(-1);\n private readonly _running = signal(false);\n\n /** Zero-based index of the current step, or `-1` when no tour is running. */\n readonly index = this._index.asReadonly();\n /** Whether a tour is currently active. */\n readonly running = this._running.asReadonly();\n /** Total number of steps in the active tour. */\n readonly total = computed(() => this._steps().length);\n /** The current step, or `null`. */\n readonly currentStep = computed<MkTourStep | null>(() => {\n const i = this._index();\n return i >= 0 ? (this._steps()[i] ?? null) : null;\n });\n\n private popupRef?: ComponentRef<MkTourPopup>;\n private scrim?: HTMLElement;\n private snapshot?: MkTargetSnapshot;\n private endResolve?: () => void;\n private endPromise = Promise.resolve();\n /** Element focused before start(); focus is restored to it on end(). */\n private previouslyFocused: HTMLElement | null = null;\n\n constructor() {\n // If a tour is still active when the app (root injector) is torn down,\n // end it — otherwise the capture-phase document keydown listener, scrim\n // and popup DOM would outlive the application.\n inject(DestroyRef).onDestroy(() => this.end());\n }\n\n /**\n * Begin a tour at step 0. Returns a promise that resolves when the tour ends\n * (finished, skipped, or Escaped).\n */\n start(steps: MkTourStep[]): Promise<void> {\n if (!this.isBrowser || steps.length === 0) return Promise.resolve();\n // Restart cleanly if one is already running.\n if (this._running()) this.end();\n\n this.endPromise = new Promise<void>((resolve) => {\n this.endResolve = resolve;\n });\n this.previouslyFocused = this.document\n .activeElement as HTMLElement | null;\n this._steps.set([...steps]);\n this._running.set(true);\n this.document.addEventListener('keydown', this.onKeydown, true);\n this.ensureScrim();\n this.showStep(0, 1);\n return this.endPromise;\n }\n\n /** Resolves when the active (or next) tour ends. */\n afterEnd(): Promise<void> {\n return this.endPromise;\n }\n\n /** Advance to the next step, or finish on the last step. */\n next(): void {\n if (!this._running()) return;\n this.showStep(this._index() + 1, 1);\n }\n\n /** Return to the previous step (no-op at the first step). */\n prev(): void {\n if (!this._running() || this._index() <= 0) return;\n this.showStep(this._index() - 1, -1);\n }\n\n /** End the tour and clean up all DOM, highlight, and listeners. */\n end(): void {\n if (!this._running()) return;\n this._running.set(false);\n this.teardownStep();\n this.removeScrim();\n this.document.removeEventListener('keydown', this.onKeydown, true);\n this._index.set(-1);\n this._steps.set([]);\n // Return focus to wherever the user was before the tour started\n // (Done/Skip/Escape all funnel through here).\n this.previouslyFocused?.focus?.();\n this.previouslyFocused = null;\n const resolve = this.endResolve;\n this.endResolve = undefined;\n resolve?.();\n }\n\n private readonly onKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n this.end();\n }\n };\n\n /**\n * Render the step at `index`. Missing targets are skipped by continuing in\n * `dir` (+1 forward, -1 back); if none remain the tour ends.\n */\n private showStep(index: number, dir: 1 | -1): void {\n this.teardownStep();\n const steps = this._steps();\n\n let i = index;\n let target: HTMLElement | null = null;\n while (i >= 0 && i < steps.length) {\n target = this.resolveTarget(steps[i].target);\n if (target) break;\n i += dir;\n }\n if (!target || i < 0 || i >= steps.length) {\n this.end();\n return;\n }\n\n this._index.set(i);\n this.highlight(target);\n target.scrollIntoView?.({ block: 'center', inline: 'center', behavior: 'smooth' });\n\n const data: MkTourData = {\n step: steps[i],\n index: i,\n total: steps.length,\n anchor: target,\n controller: {\n next: () => this.next(),\n prev: () => this.prev(),\n end: () => this.end(),\n },\n };\n\n const ref = createComponent(MkTourPopup, {\n environmentInjector: this.envInjector,\n elementInjector: Injector.create({\n parent: this.envInjector,\n providers: [{ provide: MK_TOUR_DATA, useValue: data }],\n }),\n });\n this.appRef.attachView(ref.hostView);\n this.overlayRoot().appendChild(ref.location.nativeElement);\n this.popupRef = ref;\n }\n\n /** Destroy the current popup and restore the current target's styles. */\n private teardownStep(): void {\n if (this.popupRef) {\n // At app teardown the ApplicationRef destroys (and detaches) its views\n // before injector destroy hooks run — don't touch it then.\n if (!this.appRef.destroyed) this.appRef.detachView(this.popupRef.hostView);\n this.popupRef.destroy();\n this.popupRef.location.nativeElement.remove();\n this.popupRef = undefined;\n }\n this.unhighlight();\n }\n\n private resolveTarget(target: string | HTMLElement): HTMLElement | null {\n if (typeof target !== 'string') {\n return target.isConnected ? target : null;\n }\n return this.document.querySelector<HTMLElement>(target);\n }\n\n /** Raise the target above the scrim and draw a bright ring around it. */\n private highlight(el: HTMLElement): void {\n const style = el.style;\n this.snapshot = {\n el,\n position: style.position,\n zIndex: style.zIndex,\n boxShadow: style.boxShadow,\n borderRadius: style.borderRadius,\n transition: style.transition,\n };\n el.classList.add('mk-tour-target');\n if (getComputedStyle(el).position === 'static') {\n style.position = 'relative';\n }\n style.setProperty('z-index', 'calc(var(--mk-z-overlay, 1000) + 1)');\n style.boxShadow =\n '0 0 0 3px var(--mk-primary), 0 0 0 6px var(--mk-primary-contrast)';\n if (!style.borderRadius) style.borderRadius = 'var(--mk-radius-md)';\n style.transition = 'box-shadow var(--mk-duration-fast, 140ms) ease';\n }\n\n private unhighlight(): void {\n const snap = this.snapshot;\n if (!snap) return;\n const { el } = snap;\n el.classList.remove('mk-tour-target');\n el.style.position = snap.position;\n el.style.zIndex = snap.zIndex;\n el.style.boxShadow = snap.boxShadow;\n el.style.borderRadius = snap.borderRadius;\n el.style.transition = snap.transition;\n this.snapshot = undefined;\n }\n\n private ensureScrim(): void {\n if (this.scrim) return;\n const scrim = this.document.createElement('div');\n scrim.className = 'mk-tour-scrim';\n scrim.style.cssText =\n 'position:fixed;inset:0;background:var(--mk-overlay-scrim,rgba(0,0,0,0.45));animation:mk-overlay-fade var(--mk-duration-fast,140ms) var(--mk-ease-out,ease);';\n scrim.style.setProperty('z-index', 'var(--mk-z-overlay, 1000)');\n this.overlayRoot().appendChild(scrim);\n this.scrim = scrim;\n }\n\n private removeScrim(): void {\n this.scrim?.remove();\n this.scrim = undefined;\n }\n}\n","import {\n ApplicationRef,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Directive,\n DOCUMENT,\n ElementRef,\n EnvironmentInjector,\n Injectable,\n booleanAttribute,\n createComponent,\n effect,\n inject,\n input,\n numberAttribute,\n signal,\n type ComponentRef,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkSpinner } from '@mk-kit/ui/data';\n\n/**\n * The translucent panel with a spinner that `mkBlockUi` and\n * `MkBlockUiService` drop over a region or the page.\n */\n@Component({\n selector: 'mk-block-ui-overlay',\n template: `\n <div class=\"mk-block-ui__panel\">\n <mk-spinner [label]=\"message() || i18n.loading\" />\n @if (message()) {\n <span class=\"mk-block-ui__message\">{{ message() }}</span>\n }\n </div>\n `,\n styles: `\n :host {\n position: absolute;\n inset: 0;\n z-index: var(--mk-z-sticky, 10);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mk-block-ui-scrim, color-mix(in srgb, var(--mk-surface) 70%, transparent));\n backdrop-filter: blur(1px);\n border-radius: inherit;\n cursor: progress;\n animation: mk-block-ui-in var(--mk-duration-fast) var(--mk-ease-standard);\n }\n :host(.mk-block-ui--page) {\n position: fixed;\n z-index: var(--mk-z-overlay, 1000);\n border-radius: 0;\n }\n .mk-block-ui__panel {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--mk-space-3);\n padding: var(--mk-space-4) var(--mk-space-5);\n border-radius: var(--mk-radius-lg);\n background: var(--mk-surface);\n box-shadow: var(--mk-shadow-md);\n color: var(--mk-text);\n font-size: var(--mk-font-size-sm);\n }\n @keyframes mk-block-ui-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @media (prefers-reduced-motion: reduce) {\n :host { animation: none; backdrop-filter: none; }\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkSpinner],\n host: { class: 'mk-block-ui', role: 'status', 'aria-live': 'polite' },\n})\nexport class MkBlockUiOverlay {\n protected readonly i18n = inject(MK_I18N);\n readonly message = signal('');\n}\n\n/** Mount an overlay into `host`, making the host a positioning context if it has none. */\nfunction mountOverlay(\n document: Document,\n injector: EnvironmentInjector,\n appRef: ApplicationRef,\n host: HTMLElement,\n message: string,\n page: boolean,\n): { ref: ComponentRef<MkBlockUiOverlay>; dispose: () => void } {\n const ref = createComponent(MkBlockUiOverlay, { environmentInjector: injector });\n const el = ref.location.nativeElement as HTMLElement;\n if (page) el.classList.add('mk-block-ui--page');\n ref.instance.message.set(message);\n const view = document.defaultView;\n const current = view?.getComputedStyle(host).position ?? '';\n const positioned = !page && current !== '' && current !== 'static';\n const addedPosition = !page && !positioned;\n if (addedPosition) host.style.position = 'relative';\n // Everything already inside becomes inert: no clicks, no Tab stops, no\n // screen-reader traversal — only the status overlay is reachable.\n const inerted: Element[] = [];\n for (const child of Array.from(host.children)) {\n if (!child.hasAttribute('inert')) {\n child.setAttribute('inert', '');\n inerted.push(child);\n }\n }\n host.appendChild(el);\n host.setAttribute('aria-busy', 'true');\n // Attach so later `message` updates render with the app's change detection.\n appRef.attachView(ref.hostView);\n ref.changeDetectorRef.detectChanges();\n return {\n ref,\n dispose: () => {\n appRef.detachView(ref.hostView);\n ref.destroy();\n el.remove();\n for (const child of inerted) child.removeAttribute('inert');\n host.removeAttribute('aria-busy');\n if (addedPosition) host.style.position = '';\n },\n };\n}\n\n/**\n * Block UI — cover the host element with a translucent panel and spinner\n * while something loads, so its contents can neither be read nor operated:\n * a card refreshing, a form submitting, a table re-fetching.\n *\n * Children get `inert` (no clicks, no Tab stops) and the host `aria-busy`.\n * `mkBlockUiDelay` (ms) holds the overlay back for quick operations so the\n * screen does not flash.\n *\n * ```html\n * <mk-card [mkBlockUi]=\"saving()\" mkBlockUiMessage=\"Saving…\">…</mk-card>\n * <form [mkBlockUi]=\"submitting()\" [mkBlockUiDelay]=\"300\">…</form>\n * ```\n */\n@Directive({\n selector: '[mkBlockUi]',\n host: { '[class.mk-block-ui-host]': 'mkBlockUi()' },\n})\nexport class MkBlockUi {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly injector = inject(EnvironmentInjector);\n private readonly appRef = inject(ApplicationRef);\n\n /** Block while `true`. */\n readonly mkBlockUi = input(false, { transform: booleanAttribute });\n /** Text under the spinner (also its accessible label). */\n readonly mkBlockUiMessage = input('');\n /** Wait this many ms before showing, to avoid a flash on fast operations. */\n readonly mkBlockUiDelay = input(0, { transform: numberAttribute });\n\n private mounted: ReturnType<typeof mountOverlay> | null = null;\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n effect(() => {\n const on = this.mkBlockUi();\n const message = this.mkBlockUiMessage();\n const delay = this.mkBlockUiDelay();\n this.cancelTimer();\n if (!on) {\n this.unmount();\n return;\n }\n if (this.mounted) {\n this.mounted.ref.instance.message.set(message);\n return;\n }\n if (delay > 0) this.timer = setTimeout(() => this.mount(message), delay);\n else this.mount(message);\n });\n inject(DestroyRef).onDestroy(() => {\n this.cancelTimer();\n this.unmount();\n });\n }\n\n private mount(message: string): void {\n this.timer = null;\n this.mounted = mountOverlay(this.document, this.injector, this.appRef, this.host.nativeElement, message, false);\n }\n\n private unmount(): void {\n this.mounted?.dispose();\n this.mounted = null;\n }\n\n private cancelTimer(): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n }\n}\n\n/**\n * Block the whole page. Reference-counted: every `block()` returns a release\n * function, and the overlay disappears once all of them have been called.\n *\n * ```ts\n * const release = this.blockUi.block('Exporting…');\n * try { await this.api.export(); } finally { release(); }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkBlockUiService {\n private readonly document = inject(DOCUMENT);\n private readonly injector = inject(EnvironmentInjector);\n private readonly appRef = inject(ApplicationRef);\n private mounted: ReturnType<typeof mountOverlay> | null = null;\n private readonly _count = signal(0);\n\n /** Number of active blocks. */\n readonly count = this._count.asReadonly();\n\n /** Show the page overlay (or update its message); call the returned function to release. */\n block(message = ''): () => void {\n if (typeof this.document.body === 'undefined') return () => {};\n this._count.update((n) => n + 1);\n if (this.mounted) this.mounted.ref.instance.message.set(message);\n else this.mounted = mountOverlay(this.document, this.injector, this.appRef, this.document.body, message, true);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this._count.update((n) => Math.max(0, n - 1));\n if (this._count() === 0) {\n this.mounted?.dispose();\n this.mounted = null;\n }\n };\n }\n\n /** True while the page is blocked. */\n isBlocked(): boolean {\n return this._count() > 0;\n }\n}\n","/**\n * Feedback & Overlay component group barrel.\n * Re-exports every public symbol (components, directives, services, types).\n */\nexport * from './alert';\nexport * from './tooltip';\nexport * from './popover';\nexport * from './result';\nexport * from './hovercard';\nexport * from './notification-center';\nexport * from './dialog';\nexport * from './toast';\nexport * from './snackbar';\nexport * from './bottom-sheet';\nexport * from './banner';\nexport * from './loading-bar';\nexport * from './tour';\nexport * from './block-ui';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["DEFAULT_DURATION","nextId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mk-kit-ui-feedback.mjs","sources":["../../../projects/mk-kit/feedback/alert/alert.ts","../../../projects/mk-kit/feedback/alert/alert.html","../../../projects/mk-kit/feedback/tooltip/tooltip.ts","../../../projects/mk-kit/feedback/tooltip/tooltip.html","../../../projects/mk-kit/feedback/popover/popover.ts","../../../projects/mk-kit/feedback/popover/popover.html","../../../projects/mk-kit/feedback/popover/popover-trigger.ts","../../../projects/mk-kit/feedback/popover/popconfirm.ts","../../../projects/mk-kit/feedback/popover/popconfirm.html","../../../projects/mk-kit/feedback/popover/popconfirm-trigger.ts","../../../projects/mk-kit/feedback/result/result.ts","../../../projects/mk-kit/feedback/result/result.html","../../../projects/mk-kit/feedback/hovercard/hovercard.ts","../../../projects/mk-kit/feedback/hovercard/hovercard.html","../../../projects/mk-kit/feedback/hovercard/hovercard-trigger.ts","../../../projects/mk-kit/feedback/notification-center/notification-center.ts","../../../projects/mk-kit/feedback/notification-center/notification-center.html","../../../projects/mk-kit/feedback/dialog/dialog.ts","../../../projects/mk-kit/feedback/dialog/dialog.html","../../../projects/mk-kit/feedback/dialog/confirm-dialog.ts","../../../projects/mk-kit/feedback/dialog/confirm-dialog.html","../../../projects/mk-kit/feedback/dialog/dialog.service.ts","../../../projects/mk-kit/feedback/toast/toast.ts","../../../projects/mk-kit/feedback/toast/toast.html","../../../projects/mk-kit/feedback/toast/toast-container.ts","../../../projects/mk-kit/feedback/toast/toast-container.html","../../../projects/mk-kit/feedback/toast/toast.service.ts","../../../projects/mk-kit/feedback/snackbar/snackbar.ts","../../../projects/mk-kit/feedback/snackbar/snackbar.html","../../../projects/mk-kit/feedback/snackbar/snackbar-container.ts","../../../projects/mk-kit/feedback/snackbar/snackbar-container.html","../../../projects/mk-kit/feedback/snackbar/snackbar.service.ts","../../../projects/mk-kit/feedback/bottom-sheet/bottom-sheet.ts","../../../projects/mk-kit/feedback/bottom-sheet/bottom-sheet.html","../../../projects/mk-kit/feedback/bottom-sheet/bottom-sheet.service.ts","../../../projects/mk-kit/feedback/banner/banner.ts","../../../projects/mk-kit/feedback/banner/banner.html","../../../projects/mk-kit/feedback/loading-bar/loading-bar.service.ts","../../../projects/mk-kit/feedback/loading-bar/loading-bar.ts","../../../projects/mk-kit/feedback/tour/tour-popup.ts","../../../projects/mk-kit/feedback/tour/tour-popup.html","../../../projects/mk-kit/feedback/tour/tour.service.ts","../../../projects/mk-kit/feedback/block-ui/block-ui.ts","../../../projects/mk-kit/feedback/index.ts","../../../projects/mk-kit/feedback/mk-kit-ui-feedback.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n output,\n inject,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** Semantic tones supported by {@link MkAlert}. */\nexport type MkAlertTone = 'info' | 'success' | 'warning' | 'danger' | 'neutral';\n\n/** Visual treatments supported by {@link MkAlert}. */\nexport type MkAlertVariant = 'soft' | 'solid' | 'outline';\n\n/**\n * Alert — an inline banner that communicates a contextual status message.\n * Fully themed via `--mk-*` tokens using the same tone/local-var pattern as\n * the Button. Danger/warning alerts use `role=\"alert\"` (assertive), all other\n * tones use `role=\"status\"` (polite).\n *\n * ```html\n * <mk-alert tone=\"success\" title=\"Saved\">Your changes were saved.</mk-alert>\n *\n * <mk-alert tone=\"danger\" variant=\"outline\" dismissible (dismissed)=\"hide()\">\n * <svg mkAlertIcon>…</svg>\n * Could not reach the server.\n * </mk-alert>\n * ```\n */\n@Component({\n selector: 'mk-alert',\n templateUrl: './alert.html',\n styleUrl: './alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-alert',\n '[attr.data-tone]': 'tone()',\n '[class.mk-alert--soft]': \"variant() === 'soft'\",\n '[class.mk-alert--solid]': \"variant() === 'solid'\",\n '[class.mk-alert--outline]': \"variant() === 'outline'\",\n '[attr.role]': 'role()',\n },\n})\nexport class MkAlert {\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n /** Semantic color tone. */\n readonly tone = input<MkAlertTone>('info');\n /** Visual treatment. */\n readonly variant = input<MkAlertVariant>('soft');\n /** Optional bold heading rendered above the message. */\n readonly title = input<string>();\n /** When set, renders a keyboard-accessible close button that emits `dismissed`. */\n readonly dismissible = input(false, { transform: booleanAttribute });\n\n /** Emitted when the user activates the close button. */\n readonly dismissed = output<void>();\n\n /** Assertive roles for urgent tones, polite `status` otherwise. */\n protected readonly role = computed(() =>\n this.tone() === 'danger' || this.tone() === 'warning' ? 'alert' : 'status',\n );\n\n protected onDismiss(): void {\n this.dismissed.emit();\n }\n}\n","<span class=\"mk-alert__icon\" aria-hidden=\"true\">\n <ng-content select=\"[mkAlertIcon]\" />\n</span>\n\n<div class=\"mk-alert__content\">\n @if (title(); as heading) {\n <p class=\"mk-alert__title\">{{ heading }}</p>\n }\n <div class=\"mk-alert__message\"><ng-content /></div>\n</div>\n\n@if (dismissible()) {\n <button\n type=\"button\"\n class=\"mk-alert__close\"\n [attr.aria-label]=\"i18n.dismiss\"\n (click)=\"onDismiss()\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n}\n","import {\n ApplicationRef,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n DOCUMENT,\n Directive,\n ElementRef,\n EnvironmentInjector,\n PLATFORM_ID,\n createComponent,\n inject,\n input,\n booleanAttribute,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MK_OVERLAY_ROOT } from '@mk-kit/ui/core';\nimport { mkComputeAnchoredPosition } from '@mk-kit/ui/core';\nimport type { MkPlacement } from '@mk-kit/ui/core';\n\n/** Delay (ms) before a pointer-triggered tooltip opens. Focus opens instantly. */\nconst OPEN_DELAY = 400;\n\n/**\n * Grace period (ms) after the pointer leaves the trigger (or the panel) before\n * the tooltip hides. Long enough to cross the 8px gap onto the panel — WCAG\n * 1.4.13 \"hoverable\" — without making the tip feel sticky.\n */\nconst CLOSE_DELAY = 150;\n\n/**\n * Body-level presentation surface for {@link MkTooltip}. Rendered imperatively\n * by the directive; not intended for direct template use.\n */\n@Component({\n selector: 'mk-tooltip',\n templateUrl: './tooltip.html',\n styleUrl: './tooltip.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-tooltip',\n role: 'tooltip',\n '[attr.id]': 'id()',\n '[attr.data-placement]': 'placement()',\n '[class.mk-tooltip--visible]': 'visible()',\n },\n})\nexport class MkTooltipPanel {\n /** Text content shown inside the tooltip. */\n readonly text = input('');\n /** DOM id used to wire `aria-describedby` on the trigger. */\n readonly id = input<string>();\n /** Resolved placement relative to the trigger. */\n readonly placement = input<MkPlacement>('top');\n /** Drives the entrance/exit transition. */\n readonly visible = input(false, { transform: booleanAttribute });\n}\n\n/**\n * Tooltip directive — shows a themed tooltip on hover AND keyboard focus, and\n * hides on blur, mouse-leave (after a short grace period — the pointer may\n * move onto the tooltip itself, which keeps it open, per WCAG 1.4.13), or\n * Escape pressed anywhere while it is visible. The tooltip is appended to\n * `document.body`, positioned relative to the host, and wired to the host via\n * `aria-describedby` for screen-reader users. Respects `prefers-reduced-motion`.\n *\n * ```html\n * <button mkButton [mkTooltip]=\"'Delete row'\" mkTooltipPlacement=\"bottom\">\n * <svg>…</svg>\n * </button>\n * ```\n */\n@Directive({\n selector: '[mkTooltip]',\n host: {\n '(mouseenter)': 'onPointerEnter()',\n '(mouseleave)': 'onPointerLeave()',\n '(focusin)': 'onFocus()',\n '(focusout)': 'hide()',\n '(keydown.escape)': 'hide()',\n // A tooltip must not outlive the interaction that spawned it. Without\n // this, tapping a tooltipped control leaves the tip on screen — and since\n // tooltips deliberately sit ABOVE dialogs (so a tip inside a modal is\n // visible), a stale one floats over whatever the tap just opened.\n // Exception: a TOUCH tap on the trigger of a hidden tooltip SHOWS it —\n // touch has no hover, so this is the only way a finger reaches the tip.\n '(pointerdown)': 'onPointerDown($event)',\n },\n})\nexport class MkTooltip {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly overlayRoot = inject(MK_OVERLAY_ROOT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n /** Set by pointerdown so the focusin it causes doesn't re-open the tip. */\n private suppressFocusShow = false;\n\n /** Tooltip text. When empty the tooltip is suppressed. */\n readonly mkTooltip = input('');\n /** Preferred placement relative to the host. */\n readonly mkTooltipPlacement = input<MkPlacement>('top');\n\n private readonly tooltipId = mkUniqueId('mk-tooltip');\n private ref?: ComponentRef<MkTooltipPanel>;\n private openTimer?: ReturnType<typeof setTimeout>;\n private hideTimer?: ReturnType<typeof setTimeout>;\n private previousDescribedBy: string | null = null;\n\n /**\n * Hovering the tooltip itself keeps it open (WCAG 1.4.13 \"hoverable\"): the\n * pointer may cross the gap between trigger and panel, so leaving either one\n * only SCHEDULES a hide, and entering either one cancels it.\n */\n private readonly onPanelEnter = (): void => {\n clearTimeout(this.hideTimer);\n };\n private readonly onPanelLeave = (): void => {\n this.scheduleHide();\n };\n\n /**\n * WCAG 1.4.13 \"dismissible\": Escape hides a visible tooltip no matter where\n * focus is. Attached to the document only while the tooltip is shown, and\n * preventDefault only fires when a tooltip was actually hidden.\n */\n private readonly onDocumentKeydown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || !this.ref) return;\n event.preventDefault();\n this.hide();\n };\n\n protected onPointerEnter(): void {\n // Re-entering the trigger during the hide grace period keeps the tip up.\n clearTimeout(this.hideTimer);\n this.scheduleShow(OPEN_DELAY);\n }\n\n protected onPointerLeave(): void {\n clearTimeout(this.openTimer);\n this.scheduleHide();\n }\n\n private scheduleHide(): void {\n if (!this.ref) return;\n clearTimeout(this.hideTimer);\n this.hideTimer = setTimeout(() => this.hide(), CLOSE_DELAY);\n }\n\n protected onFocus(): void {\n // Pointer-driven focus already dismissed the tip on pointerdown; showing\n // it again here would defeat that. Keyboard focus still gets a tooltip.\n if (this.suppressFocusShow) {\n this.suppressFocusShow = false;\n return;\n }\n this.scheduleShow(0);\n }\n\n protected onPointerDown(event: PointerEvent): void {\n this.suppressFocusShow = true;\n // Touch toggle: hover never happens on a touchscreen, so a tap on the\n // trigger is the show gesture. Tap again (ref exists → fall through to\n // hide) or tap elsewhere (document pointerdown) dismisses. Mouse and pen\n // keep the plain dismiss-on-pointerdown behaviour.\n if (event.pointerType === 'touch' && !this.ref) {\n this.scheduleShow(0);\n return;\n }\n this.hide();\n }\n\n /**\n * Outside-tap dismissal (attached to the document only while visible): a\n * pointerdown that lands on neither the trigger nor the panel hides the\n * tooltip. The trigger's own pointerdown handles show/hide/toggle itself,\n * and a press on the panel keeps it up (WCAG 1.4.13 \"hoverable\").\n */\n private readonly onDocumentPointerdown = (event: Event): void => {\n const target = event.target as Node | null;\n if (!target || this.host.nativeElement.contains(target)) return;\n const panel = this.ref?.location.nativeElement as HTMLElement | undefined;\n if (panel?.contains(target)) return;\n this.hide();\n };\n\n private scheduleShow(delay: number): void {\n if (!this.isBrowser || !this.mkTooltip().trim() || this.ref) return;\n clearTimeout(this.openTimer);\n if (delay === 0) {\n this.show();\n } else {\n this.openTimer = setTimeout(() => this.show(), delay);\n }\n }\n\n protected hide(): void {\n clearTimeout(this.openTimer);\n clearTimeout(this.hideTimer);\n if (!this.ref) return;\n\n this.document.removeEventListener('keydown', this.onDocumentKeydown, true);\n this.document.removeEventListener(\n 'pointerdown',\n this.onDocumentPointerdown,\n true,\n );\n\n // Restore the trigger's original aria-describedby.\n const el = this.host.nativeElement;\n if (this.previousDescribedBy === null) {\n el.removeAttribute('aria-describedby');\n } else {\n el.setAttribute('aria-describedby', this.previousDescribedBy);\n }\n this.previousDescribedBy = null;\n\n const panel = this.ref.location.nativeElement as HTMLElement & {\n hidePopover?: () => void;\n };\n if (panel.matches('[popover]') && typeof panel.hidePopover === 'function') {\n try {\n panel.hidePopover();\n } catch {\n // Already disconnected — nothing to do.\n }\n }\n\n this.appRef.detachView(this.ref.hostView);\n this.ref.destroy();\n this.ref = undefined;\n }\n\n private show(): void {\n if (this.ref) return;\n\n const ref = createComponent(MkTooltipPanel, {\n environmentInjector: this.envInjector,\n });\n ref.setInput('text', this.mkTooltip());\n ref.setInput('id', this.tooltipId);\n ref.setInput('placement', this.mkTooltipPlacement());\n this.appRef.attachView(ref.hostView);\n\n const panel = ref.location.nativeElement as HTMLElement;\n this.overlayRoot().appendChild(panel);\n this.ref = ref;\n\n // Hoverable (the listeners die with the panel element on hide) …\n panel.addEventListener('mouseenter', this.onPanelEnter);\n panel.addEventListener('mouseleave', this.onPanelLeave);\n // … and dismissible from anywhere while visible (removed in hide()).\n // Capture phase so the Escape that hides the tooltip is marked\n // defaultPrevented before any bubbling handler (e.g. a dialog deciding\n // whether to close) sees it — layered dismissal, tooltip first.\n this.document.addEventListener('keydown', this.onDocumentKeydown, true);\n // … and from an outside tap — the touch analogue of mouseleave. Capture\n // phase so the tooltip is gone before the tap's own target reacts.\n this.document.addEventListener(\n 'pointerdown',\n this.onDocumentPointerdown,\n true,\n );\n\n // Promote into the top layer so the tooltip is never clipped by an\n // ancestor's overflow/transform or hidden behind a stacking context.\n const withPopover = panel as HTMLElement & { showPopover?: () => void };\n if (typeof withPopover.showPopover === 'function') {\n panel.setAttribute('popover', 'manual');\n try {\n withPopover.showPopover();\n } catch {\n // Unsupported context — fall back to the plain body portal.\n }\n }\n\n // Wire aria-describedby, preserving any pre-existing value.\n const trigger = this.host.nativeElement;\n this.previousDescribedBy = trigger.getAttribute('aria-describedby');\n trigger.setAttribute(\n 'aria-describedby',\n this.previousDescribedBy\n ? `${this.previousDescribedBy} ${this.tooltipId}`\n : this.tooltipId,\n );\n\n this.position(panel);\n // Reveal on the next frame so the entrance transition runs.\n this.document.defaultView?.requestAnimationFrame(() => {\n this.ref?.setInput('visible', true);\n });\n }\n\n private position(panel: HTMLElement): void {\n const rect = this.host.nativeElement.getBoundingClientRect();\n const tip = panel.getBoundingClientRect();\n const pos = mkComputeAnchoredPosition(\n rect,\n { width: tip.width, height: tip.height },\n {\n width: this.document.documentElement.clientWidth,\n height: this.document.documentElement.clientHeight,\n },\n // Clamp back on-screen but keep the requested side (no flip) so the\n // panel's `data-placement` styling stays correct.\n {\n placement: this.mkTooltipPlacement(),\n gap: 8,\n flip: false,\n clamp: true,\n rtl:\n this.document.defaultView?.getComputedStyle(this.host.nativeElement)\n .direction === 'rtl',\n },\n );\n panel.style.position = 'fixed';\n panel.style.margin = '0';\n panel.style.inset = 'auto';\n panel.style.top = `${pos.top}px`;\n panel.style.left = `${pos.left}px`;\n }\n\n ngOnDestroy(): void {\n this.hide();\n }\n}\n","{{ text() }}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport type { MkPlacement } from '@mk-kit/ui/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { mkGetFocusable } from '@mk-kit/ui/core';\nimport { MkAnchoredPanel } from '@mk-kit/ui/core';\n\n/**\n * Popover — a non-modal floating panel for rich (non-text) content, anchored to\n * a trigger. Unlike {@link MkTooltip} (text, hover) it holds arbitrary projected\n * content and is opened by click via the `mkPopoverTriggerFor` directive (or the\n * `open`/`toggle` API).\n *\n * The panel renders in the browser top layer through {@link MkAnchoredPanel}, so\n * it is never clipped by an ancestor's `overflow`/`transform`. On open, focus\n * moves into the panel; Escape closes and restores focus to the trigger, an\n * outside click or Tabbing out closes it (non-modal — no keyboard trap).\n *\n * ```html\n * <button mkButton [mkPopoverTriggerFor]=\"info\">Details</button>\n * <mk-popover #info ariaLabel=\"Details\">\n * <h4>Shipping</h4><p>Ships in 2–3 business days.</p>\n * </mk-popover>\n * ```\n */\n@Component({\n selector: 'mk-popover',\n exportAs: 'mkPopover',\n templateUrl: './popover.html',\n styleUrl: './popover.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkAnchoredPanel],\n host: {\n class: 'mk-popover',\n },\n})\nexport class MkPopover {\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n\n /** Stable id for `aria-controls` on the trigger. */\n readonly panelId = mkUniqueId('mk-popover');\n\n /** Preferred placement relative to the trigger. */\n readonly placement = input<MkPlacement>('bottom');\n /** Accessible label for the dialog panel. */\n readonly ariaLabel = input<string>();\n /** Move focus into the panel on open. Default `true`. */\n readonly autoFocus = input(true, { transform: booleanAttribute });\n\n /** Emitted whenever the popover closes (any reason). */\n readonly closed = output<void>();\n\n private readonly _open = signal(false);\n /** Whether the popover is open. */\n readonly opened = this._open.asReadonly();\n\n protected readonly anchorEl = signal<HTMLElement | undefined>(undefined);\n private triggerEl: HTMLElement | null = null;\n\n /** Open the popover anchored to `trigger`. */\n open(trigger: HTMLElement): void {\n if (!this.isBrowser || this._open()) return;\n this.triggerEl = trigger;\n this.anchorEl.set(trigger);\n this._open.set(true);\n if (this.autoFocus()) {\n afterNextRender(() => this.focusInitial(), { injector: this.injector });\n }\n }\n\n /** Close the popover; optionally restore focus to the trigger. */\n close(restoreFocus = true): void {\n if (!this._open()) return;\n this._open.set(false);\n this.anchorEl.set(undefined);\n const trigger = this.triggerEl;\n this.triggerEl = null;\n if (restoreFocus) trigger?.focus();\n this.closed.emit();\n }\n\n /** Toggle open/closed from a trigger. */\n toggle(trigger: HTMLElement): void {\n this._open() ? this.close(true) : this.open(trigger);\n }\n\n private focusInitial(): void {\n const panel = this.panelRef()?.nativeElement;\n if (!panel) return;\n (mkGetFocusable(panel)[0] ?? panel).focus();\n }\n\n protected onEscape(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.close(true);\n }\n\n protected onPanelFocusout(event: FocusEvent): void {\n const related = event.relatedTarget as Node | null;\n // Focus moved to a non-focusable spot (stays in document.body) — keep open;\n // outside pointerdown is handled separately by the anchored panel.\n if (!related) return;\n const panel = this.panelRef()?.nativeElement;\n if (panel?.contains(related) || this.triggerEl?.contains(related)) return;\n // Tabbed out of the panel — close without yanking focus back.\n this.close(false);\n }\n}\n","@if (opened()) {\n <div\n #panel\n class=\"mk-popover__panel\"\n role=\"dialog\"\n tabindex=\"-1\"\n [id]=\"panelId\"\n [attr.aria-label]=\"ariaLabel()\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"anchorEl()\"\n [placement]=\"placement()\"\n [gap]=\"8\"\n (dismiss)=\"close(false)\"\n (keydown.escape)=\"onEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <ng-content />\n </div>\n}\n","import { Directive, ElementRef, inject, input } from '@angular/core';\nimport { MkPopover } from './popover';\n\n/**\n * Turns its host element into a click trigger for an `<mk-popover>`. Wires\n * `aria-haspopup=\"dialog\"` / `aria-expanded` / `aria-controls`, toggles on click\n * and closes on Escape.\n *\n * ```html\n * <button mkButton [mkPopoverTriggerFor]=\"info\">Details</button>\n * <mk-popover #info>…</mk-popover>\n * ```\n */\n@Directive({\n selector: '[mkPopoverTriggerFor]',\n exportAs: 'mkPopoverTrigger',\n host: {\n 'aria-haspopup': 'dialog',\n '[attr.aria-expanded]': 'popover().opened()',\n '[attr.aria-controls]': 'popover().panelId',\n '(click)': 'onClick($event)',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class MkPopoverTrigger {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The popover instance to control. */\n readonly popover = input.required<MkPopover>({ alias: 'mkPopoverTriggerFor' });\n\n protected onClick(event: Event): void {\n event.preventDefault();\n this.popover().toggle(this.host.nativeElement);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.popover().opened()) {\n event.preventDefault();\n this.popover().close(true);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport type { MkPlacement, MkTone } from '@mk-kit/ui/core';\nimport { MkButton } from '@mk-kit/ui/button';\nimport { MkPopover } from './popover';\n\n/**\n * Popconfirm — an inline confirmation popover (e.g. a row-level \"Delete?\").\n * Composes {@link MkPopover} with a message and cancel/confirm buttons, so it\n * inherits the top-layer positioning + focus behaviour. Attach it with the\n * `mkPopconfirmFor` directive.\n *\n * ```html\n * <button mkButton tone=\"danger\" [mkPopconfirmFor]=\"del\">Delete</button>\n * <mk-popconfirm #del message=\"Delete this item?\" (confirm)=\"remove()\" />\n * ```\n */\n@Component({\n selector: 'mk-popconfirm',\n exportAs: 'mkPopconfirm',\n templateUrl: './popconfirm.html',\n styleUrl: './popconfirm.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkPopover, MkButton],\n host: {\n class: 'mk-popconfirm',\n },\n})\nexport class MkPopconfirm {\n private readonly popover = viewChild(MkPopover);\n protected readonly i18n = inject(MK_I18N);\n\n /** Confirmation message. */\n readonly message = input(this.i18n.confirmMessage);\n /** Optional bold heading above the message. */\n readonly title = input<string>();\n /** Confirm button label. */\n readonly confirmText = input(this.i18n.confirm);\n /** Cancel button label. */\n readonly cancelText = input(this.i18n.cancel);\n /** Tone of the confirm button (destructive actions use `danger`). */\n readonly tone = input<MkTone>('danger');\n /** Preferred placement relative to the trigger. */\n readonly placement = input<MkPlacement>('top');\n\n /** Emitted when the user confirms. */\n readonly confirm = output<void>();\n /** Emitted when the user cancels (button, Escape or outside click). */\n readonly cancel = output<void>();\n\n /** Id of the underlying dialog panel (for the trigger's `aria-controls`). */\n get panelId(): string | null {\n return this.popover()?.panelId ?? null;\n }\n\n /** Whether the popconfirm is open. */\n opened(): boolean {\n return this.popover()?.opened() ?? false;\n }\n\n /** Open anchored to `trigger`. */\n open(trigger: HTMLElement): void {\n this.popover()?.open(trigger);\n }\n\n /** Toggle from a trigger. */\n toggle(trigger: HTMLElement): void {\n this.popover()?.toggle(trigger);\n }\n\n /** Close the popconfirm. */\n close(): void {\n this.popover()?.close(true);\n }\n\n /** Set when the user confirms, so the close handler doesn't also cancel. */\n private confirmed = false;\n\n protected onConfirm(): void {\n this.confirmed = true;\n this.confirm.emit();\n this.popover()?.close(true);\n }\n\n protected onCancel(): void {\n // Closing emits `closed`, which routes to `cancel` (see onPopoverClosed).\n this.popover()?.close(true);\n }\n\n /** Any close that wasn't a confirm counts as a cancel (Escape / outside). */\n protected onPopoverClosed(): void {\n if (this.confirmed) {\n this.confirmed = false;\n return;\n }\n this.cancel.emit();\n }\n}\n","<mk-popover\n [placement]=\"placement()\"\n [ariaLabel]=\"title() || message()\"\n (closed)=\"onPopoverClosed()\"\n>\n <div class=\"mk-popconfirm__body\">\n @if (title()) {\n <p class=\"mk-popconfirm__title\">{{ title() }}</p>\n }\n <p class=\"mk-popconfirm__message\">{{ message() }}</p>\n <div class=\"mk-popconfirm__actions\">\n <button mkButton variant=\"ghost\" tone=\"neutral\" size=\"sm\" (click)=\"onCancel()\">\n {{ cancelText() }}\n </button>\n <button mkButton [tone]=\"tone()\" size=\"sm\" (click)=\"onConfirm()\">\n {{ confirmText() }}\n </button>\n </div>\n </div>\n</mk-popover>\n","import { Directive, ElementRef, inject, input } from '@angular/core';\nimport { MkPopconfirm } from './popconfirm';\n\n/**\n * Turns its host element into a click trigger for an `<mk-popconfirm>`. Wires\n * `aria-haspopup=\"dialog\"` / `aria-expanded` / `aria-controls`, toggles on click\n * and closes on Escape.\n *\n * ```html\n * <button mkButton tone=\"danger\" [mkPopconfirmFor]=\"del\">Delete</button>\n * <mk-popconfirm #del message=\"Delete this item?\" (confirm)=\"remove()\" />\n * ```\n */\n@Directive({\n selector: '[mkPopconfirmFor]',\n exportAs: 'mkPopconfirmTrigger',\n host: {\n 'aria-haspopup': 'dialog',\n '[attr.aria-expanded]': 'popconfirm().opened()',\n '[attr.aria-controls]': 'popconfirm().panelId',\n '(click)': 'onClick($event)',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class MkPopconfirmTrigger {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The popconfirm instance to control. */\n readonly popconfirm = input.required<MkPopconfirm>({\n alias: 'mkPopconfirmFor',\n });\n\n protected onClick(event: Event): void {\n event.preventDefault();\n this.popconfirm().toggle(this.host.nativeElement);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.popconfirm().opened()) {\n event.preventDefault();\n this.popconfirm().close();\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\n/** Status presets supported by {@link MkResult}. */\nexport type MkResultStatus =\n | 'success'\n | 'error'\n | 'info'\n | 'warning'\n | '404'\n | '403'\n | '500';\n\n/** Built-in icon glyph chosen for a status. */\nexport type MkResultIconVariant = 'check' | 'x' | 'alert' | 'info' | 'search';\n\n/** Tone colour applied to the status icon. */\nexport type MkResultTone = 'success' | 'danger' | 'warning' | 'info' | 'muted';\n\n/**\n * Result — a centred, full-page status state: a success confirmation, an error,\n * an empty 404/403/500 page. Renders a large status icon (chosen from\n * `status`), a title, a muted subtitle, projected body content, and a row of\n * action buttons at the bottom.\n *\n * Slots: `[mkResultIcon]` (custom icon, overrides the built-in glyph),\n * `[mkResultTitle]` (custom heading, used when `resultTitle` is unset), default\n * content (extra body), `[mkResultActions]` (buttons).\n *\n * ```html\n * <mk-result status=\"success\" resultTitle=\"Payment complete\"\n * subtitle=\"Your order is on its way.\">\n * <button mkButton mkResultActions>Back home</button>\n * </mk-result>\n * ```\n */\n@Component({\n selector: 'mk-result',\n templateUrl: './result.html',\n styleUrl: './result.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-result',\n role: 'status',\n '[attr.data-status]': 'status()',\n '[attr.data-tone]': 'tone()',\n },\n})\nexport class MkResult {\n /** Status preset that selects the built-in icon glyph and its tone colour. */\n readonly status = input<MkResultStatus>('info');\n /** Main heading rendered as an `<h2>` (falls back to the `[mkResultTitle]` slot). */\n readonly resultTitle = input<string>('');\n /** Supporting muted sentence under the title. */\n readonly subtitle = input<string>('');\n\n /** Built-in glyph for the current status. */\n protected readonly iconName = computed<MkResultIconVariant>(() => {\n switch (this.status()) {\n case 'success':\n return 'check';\n case 'error':\n case '500':\n return 'x';\n case 'warning':\n case '403':\n return 'alert';\n case '404':\n return 'search';\n default:\n return 'info';\n }\n });\n\n /** Tone colour applied to the status icon. */\n protected readonly tone = computed<MkResultTone>(() => {\n switch (this.status()) {\n case 'success':\n return 'success';\n case 'error':\n case '500':\n return 'danger';\n case 'warning':\n case '403':\n return 'warning';\n case '404':\n return 'muted';\n default:\n return 'info';\n }\n });\n}\n","<div class=\"mk-result__icon\" aria-hidden=\"true\">\n <span class=\"mk-result__icon-custom\"><ng-content select=\"[mkResultIcon]\" /></span>\n <span class=\"mk-result__icon-default\">\n @switch (iconName()) {\n @case ('check') {\n <svg viewBox=\"0 0 24 24\" width=\"64\" height=\"64\" fill=\"none\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M8 12.5l2.5 2.5L16 9.5\" stroke=\"currentColor\" stroke-width=\"1.6\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n }\n @case ('x') {\n <svg viewBox=\"0 0 24 24\" width=\"64\" height=\"64\" fill=\"none\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M9 9l6 6M15 9l-6 6\" stroke=\"currentColor\" stroke-width=\"1.6\"\n stroke-linecap=\"round\" />\n </svg>\n }\n @case ('alert') {\n <svg viewBox=\"0 0 24 24\" width=\"64\" height=\"64\" fill=\"none\" focusable=\"false\">\n <path d=\"M12 3.5l9 15.5H3z\" stroke=\"currentColor\" stroke-width=\"1.6\"\n stroke-linejoin=\"round\" />\n <path d=\"M12 10v4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n <circle cx=\"12\" cy=\"16.5\" r=\"1\" fill=\"currentColor\" />\n </svg>\n }\n @case ('search') {\n <svg viewBox=\"0 0 24 24\" width=\"64\" height=\"64\" fill=\"none\" focusable=\"false\">\n <circle cx=\"10.5\" cy=\"10.5\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M15.5 15.5L21 21\" stroke=\"currentColor\" stroke-width=\"1.6\"\n stroke-linecap=\"round\" />\n </svg>\n }\n @default {\n <svg viewBox=\"0 0 24 24\" width=\"64\" height=\"64\" fill=\"none\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M12 11v5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n <circle cx=\"12\" cy=\"8\" r=\"1\" fill=\"currentColor\" />\n </svg>\n }\n }\n </span>\n</div>\n\n@if (resultTitle(); as heading) {\n <h2 class=\"mk-result__title\">{{ heading }}</h2>\n} @else {\n <ng-content select=\"[mkResultTitle]\" />\n}\n\n@if (subtitle(); as text) {\n <p class=\"mk-result__subtitle\">{{ text }}</p>\n}\n\n<div class=\"mk-result__body\">\n <ng-content />\n</div>\n\n<div class=\"mk-result__actions\">\n <ng-content select=\"[mkResultActions]\" />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n OnDestroy,\n PLATFORM_ID,\n booleanAttribute,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport type { MkPlacement } from '@mk-kit/ui/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MkAnchoredPanel } from '@mk-kit/ui/core';\n\n/**\n * Hovercard — a rich hover-preview panel anchored to a trigger, in the spirit of\n * GitHub's user hovercards. Unlike {@link MkTooltip} (short text) it projects\n * arbitrary content, and unlike {@link MkPopover} (click) it opens on hover/focus\n * after a short delay and closes when the pointer leaves both the trigger and the\n * card. It is driven by the `mkHovercardFor` directive (or the `open`/`close` API).\n *\n * The panel renders in the browser top layer through {@link MkAnchoredPanel}, so\n * it is never clipped by an ancestor's `overflow`/`transform`. It is non-modal —\n * no focus trap. Moving the pointer from the trigger onto the card keeps it open;\n * Escape closes it.\n *\n * ```html\n * <a href=\"/u/ada\" [mkHovercardFor]=\"ada\">@ada</a>\n * <mk-hovercard #ada ariaLabel=\"Ada Lovelace\">\n * <img src=\"/ada.png\" alt=\"\" /><strong>Ada Lovelace</strong>\n * </mk-hovercard>\n * ```\n */\n@Component({\n selector: 'mk-hovercard',\n exportAs: 'mkHovercard',\n templateUrl: './hovercard.html',\n styleUrl: './hovercard.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkAnchoredPanel],\n host: {\n class: 'mk-hovercard',\n },\n})\nexport class MkHovercard implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Stable id for `aria-controls` on the trigger. */\n readonly panelId = mkUniqueId('mk-hovercard');\n\n /** Preferred placement relative to the trigger. */\n readonly placement = input<MkPlacement>('bottom-start');\n /** Accessible label for the panel. */\n readonly ariaLabel = input<string>();\n /** Delay in ms before the card opens on hover/focus. Default `300`. */\n readonly openDelay = input(300, { transform: numberAttribute });\n /** Delay in ms before the card closes after the pointer leaves. Default `200`. */\n readonly closeDelay = input(200, { transform: numberAttribute });\n /** Close the card when Escape is pressed while it is open. Default `true`. */\n readonly closeOnEscape = input(true, { transform: booleanAttribute });\n\n /** Emitted whenever the hovercard closes (any reason). */\n readonly closed = output<void>();\n\n private readonly _open = signal(false);\n /** Whether the hovercard is open. */\n readonly opened = this._open.asReadonly();\n\n protected readonly anchorEl = signal<HTMLElement | undefined>(undefined);\n private triggerEl: HTMLElement | null = null;\n\n private openTimer: number | null = null;\n private closeTimer: number | null = null;\n\n /** Open the card anchored to `trigger` after `openDelay` (cancels a pending close). */\n scheduleOpen(trigger: HTMLElement): void {\n if (!this.isBrowser) return;\n this.clearCloseTimer();\n if (this._open()) {\n // Already open — just make sure the anchor is current.\n this.triggerEl = trigger;\n this.anchorEl.set(trigger);\n return;\n }\n if (this.openTimer !== null) return;\n this.openTimer = this.setTimer(() => {\n this.openTimer = null;\n this.open(trigger);\n }, this.openDelay());\n }\n\n /** Close the card after `closeDelay` (cancels a pending open). */\n scheduleClose(): void {\n if (!this.isBrowser) return;\n this.clearOpenTimer();\n if (!this._open() || this.closeTimer !== null) return;\n this.closeTimer = this.setTimer(() => {\n this.closeTimer = null;\n this.close();\n }, this.closeDelay());\n }\n\n /**\n * Keep the card open: cancel any pending open/close. Called when the pointer\n * enters the card itself, so moving from the trigger to the card is seamless.\n */\n keepOpen(): void {\n this.clearCloseTimer();\n }\n\n /** Open the card immediately, anchored to `trigger`. */\n open(trigger: HTMLElement): void {\n if (!this.isBrowser || this._open()) return;\n this.clearOpenTimer();\n this.triggerEl = trigger;\n this.anchorEl.set(trigger);\n this._open.set(true);\n }\n\n /** Close the card immediately. */\n close(): void {\n this.clearOpenTimer();\n this.clearCloseTimer();\n if (!this._open()) return;\n this._open.set(false);\n this.anchorEl.set(undefined);\n this.triggerEl = null;\n this.closed.emit();\n }\n\n protected onCardEnter(): void {\n this.keepOpen();\n }\n\n protected onCardLeave(): void {\n this.scheduleClose();\n }\n\n /**\n * Keyboard mirror of `mouseleave`: when focus moves somewhere outside BOTH\n * the card and its trigger, schedule a close. Focus hopping between the\n * trigger and the card (either direction) keeps it open, so the card's\n * content stays reachable with Tab.\n */\n protected onCardFocusout(event: FocusEvent): void {\n const related = event.relatedTarget as Node | null;\n if (!related) return;\n const panel = event.currentTarget as HTMLElement | null;\n if (panel?.contains(related) || this.triggerEl?.contains(related)) return;\n this.scheduleClose();\n }\n\n protected onEscape(event: Event): void {\n if (!this.closeOnEscape()) return;\n event.preventDefault();\n event.stopPropagation();\n // Escape may be pressed while focus is INSIDE the panel; closing destroys\n // it, which would otherwise drop focus on <body>. Hand it back to the\n // trigger so the keyboard user keeps their place.\n const trigger = this.triggerEl;\n this.close();\n trigger?.focus();\n }\n\n private setTimer(fn: () => void, delay: number): number | null {\n const view = this.document.defaultView;\n return view ? view.setTimeout(fn, delay) : null;\n }\n\n private clearOpenTimer(): void {\n if (this.openTimer !== null) {\n this.document.defaultView?.clearTimeout(this.openTimer);\n this.openTimer = null;\n }\n }\n\n private clearCloseTimer(): void {\n if (this.closeTimer !== null) {\n this.document.defaultView?.clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n ngOnDestroy(): void {\n this.clearOpenTimer();\n this.clearCloseTimer();\n }\n}\n","@if (opened()) {\n <div\n #panel\n class=\"mk-hovercard__panel\"\n role=\"dialog\"\n tabindex=\"-1\"\n [id]=\"panelId\"\n [attr.aria-label]=\"ariaLabel()\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"anchorEl()\"\n [placement]=\"placement()\"\n [gap]=\"8\"\n (dismiss)=\"close()\"\n (mouseenter)=\"onCardEnter()\"\n (mouseleave)=\"onCardLeave()\"\n (focusin)=\"onCardEnter()\"\n (focusout)=\"onCardFocusout($event)\"\n (keydown.escape)=\"onEscape($event)\"\n >\n <ng-content />\n </div>\n}\n","import { Directive, ElementRef, inject, input } from '@angular/core';\nimport { MkHovercard } from './hovercard';\n\n/**\n * A touch tap fires emulated `mouseenter` + `focus` right after `pointerdown`;\n * for this long after a touch toggle those synthetic enters are ignored, so a\n * tap that just CLOSED the card is not undone by its own compatibility events.\n */\nconst TOUCH_ENTER_SUPPRESS_MS = 500;\n\n/**\n * Turns its host element into a hover/focus trigger for an `<mk-hovercard>`.\n * On `mouseenter`/`focus` it opens the card (after the card's `openDelay`),\n * anchored to the host; on `mouseleave`/`blur` it schedules a close (after the\n * card's `closeDelay`). Moving the pointer — or keyboard focus — from the host\n * onto the card cancels that close, so the card stays open and its content is\n * reachable with Tab. Escape closes it.\n *\n * On touch there is no hover, so a tap toggles instead: tap opens the card\n * immediately, tapping the trigger again closes it, and a tap anywhere else\n * closes it through the panel's outside-pointerdown dismissal.\n *\n * ```html\n * <a href=\"/u/ada\" [mkHovercardFor]=\"ada\">@ada</a>\n * <mk-hovercard #ada>…</mk-hovercard>\n * ```\n */\n@Directive({\n selector: '[mkHovercardFor]',\n exportAs: 'mkHovercardTrigger',\n host: {\n 'aria-haspopup': 'dialog',\n '[attr.aria-expanded]': 'hovercard().opened()',\n '[attr.aria-controls]': 'hovercard().panelId',\n '(mouseenter)': 'onEnter()',\n '(focus)': 'onEnter()',\n '(mouseleave)': 'onLeave()',\n '(blur)': 'onLeave()',\n '(pointerdown)': 'onPointerDown($event)',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class MkHovercardTrigger {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n /** Timestamp of the last touch toggle — guards `onEnter` (see above). */\n private lastTouchToggle = Number.NEGATIVE_INFINITY;\n\n /** The hovercard instance to control. */\n readonly hovercard = input.required<MkHovercard>({ alias: 'mkHovercardFor' });\n\n protected onEnter(): void {\n if (Date.now() - this.lastTouchToggle < TOUCH_ENTER_SUPPRESS_MS) return;\n this.hovercard().scheduleOpen(this.host.nativeElement);\n }\n\n /**\n * Touch tap-toggle. Mouse and pen are ignored here — they keep the pure\n * hover/focus behaviour. A tap while the card is open closes it (a tap\n * OUTSIDE both trigger and panel is handled by the anchored panel's own\n * outside-pointerdown dismiss, which excludes the anchor, so the two paths\n * never double-fire).\n */\n protected onPointerDown(event: PointerEvent): void {\n if (event.pointerType !== 'touch') return;\n this.lastTouchToggle = Date.now();\n const card = this.hovercard();\n if (card.opened()) {\n card.close();\n } else {\n // No openDelay on touch — the tap is deliberate, not a passing pointer.\n card.open(this.host.nativeElement);\n }\n }\n\n protected onLeave(): void {\n this.hovercard().scheduleClose();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.hovercard().opened()) {\n event.preventDefault();\n this.hovercard().close();\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n PLATFORM_ID,\n afterNextRender,\n computed,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { mkGetFocusable } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkAnchoredPanel } from '@mk-kit/ui/core';\nimport { MkBadge } from '@mk-kit/ui/data';\nimport { MkEmptyState } from '@mk-kit/ui/data';\nimport { MkIcon } from '@mk-kit/ui/icon';\n\n/** A single notification shown in the {@link MkNotificationCenter} panel. */\nexport interface MkNotification {\n /** Stable identity, used for `track` and immutable updates. */\n id: unknown;\n /** Headline line, always shown. */\n title: string;\n /** Optional supporting text under the title. */\n body?: string;\n /** Optional relative/absolute timestamp label (e.g. \"2m ago\"). */\n time?: string;\n /** Whether the user has already read this item. */\n read?: boolean;\n}\n\n/**\n * NotificationCenter — a bell trigger with an unread-count badge that opens a\n * dropdown panel listing notifications, each markable as read.\n *\n * The panel renders in the browser top layer through {@link MkAnchoredPanel},\n * so it is never clipped by an ancestor's `overflow`/`transform`. Clicking the\n * bell toggles it; an outside click, Tabbing out or Escape closes it and\n * restores focus to the bell. Clicking a row marks that one read (updating the\n * two-way `notifications` immutably); \"Mark all read\" clears every unread item.\n *\n * ```html\n * <mk-notification-center\n * [(notifications)]=\"items\"\n * (itemClick)=\"open($event)\"\n * (markedAllRead)=\"sync()\" />\n * ```\n */\n@Component({\n selector: 'mk-notification-center',\n templateUrl: './notification-center.html',\n styleUrl: './notification-center.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkAnchoredPanel, MkBadge, MkEmptyState, MkIcon],\n host: {\n class: 'mk-notification-center',\n },\n})\nexport class MkNotificationCenter {\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n private readonly triggerRef =\n viewChild<ElementRef<HTMLButtonElement>>('trigger');\n protected readonly i18n = inject(MK_I18N);\n\n /** Stable id linking the trigger to the panel via `aria-controls`. */\n readonly panelId = mkUniqueId('mk-notification-center');\n /** Stable id for the panel's labelling heading. */\n readonly titleId = mkUniqueId('mk-notification-center-title');\n\n /** Two-way list of notifications rendered in the panel. */\n readonly notifications = model<MkNotification[]>([]);\n /** Heading shown at the top of the panel. */\n readonly panelTitle = input(this.i18n.notificationsTitle);\n /** Message shown by the empty state when there are no notifications. */\n readonly emptyText = input(this.i18n.allCaughtUp);\n /** Max height of the scrollable list (any CSS length). */\n readonly maxHeight = input('24rem');\n\n /** Emitted with a notification when its row is clicked. */\n readonly itemClick = output<MkNotification>();\n /** Emitted with a notification when it transitions to read. */\n readonly read = output<MkNotification>();\n /** Emitted when every notification is marked read at once. */\n readonly markedAllRead = output<void>();\n\n private readonly _open = signal(false);\n /** Whether the panel is open. */\n readonly open = this._open.asReadonly();\n\n /** Count of notifications that are not yet read. */\n readonly unreadCount = computed(\n () => this.notifications().filter((n) => !n.read).length,\n );\n\n /** Accessible label for the bell trigger. */\n protected readonly triggerLabel = computed(() =>\n this.i18n.notificationsUnread(this.unreadCount()),\n );\n\n /** Badge text, capped at \"99+\". */\n protected readonly badgeText = computed(() => {\n const n = this.unreadCount();\n return n > 99 ? '99+' : `${n}`;\n });\n\n /** Toggle the panel open/closed. */\n toggle(): void {\n this._open() ? this.close() : this.openPanel();\n }\n\n /** Open the panel, moving focus into it on the next render. */\n openPanel(): void {\n if (!this.isBrowser || this._open()) return;\n this._open.set(true);\n afterNextRender(() => this.focusInitial(), { injector: this.injector });\n }\n\n /** Close the panel; optionally restore focus to the bell trigger. */\n close(restoreFocus = true): void {\n if (!this._open()) return;\n this._open.set(false);\n if (restoreFocus) this.triggerRef()?.nativeElement.focus();\n }\n\n /** Mark every notification read and emit {@link markedAllRead}. */\n markAllRead(): void {\n if (this.unreadCount() === 0) return;\n this.notifications.update((list) =>\n list.map((n) => (n.read ? n : { ...n, read: true })),\n );\n this.markedAllRead.emit();\n }\n\n /** Handle a row click: mark it read (if needed) and emit {@link itemClick}. */\n protected onRowClick(item: MkNotification): void {\n if (!item.read) this.markRead(item);\n this.itemClick.emit(item);\n }\n\n private markRead(item: MkNotification): void {\n let updated: MkNotification | undefined;\n this.notifications.update((list) =>\n list.map((n) => {\n if (n !== item || n.read) return n;\n updated = { ...n, read: true };\n return updated;\n }),\n );\n if (updated) this.read.emit(updated);\n }\n\n protected onEscape(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.close(true);\n }\n\n protected onPanelFocusout(event: FocusEvent): void {\n const related = event.relatedTarget as Node | null;\n if (!related) return;\n const panel = this.panelRef()?.nativeElement;\n const trigger = this.triggerRef()?.nativeElement;\n if (panel?.contains(related) || trigger?.contains(related)) return;\n this.close(false);\n }\n\n private focusInitial(): void {\n const panel = this.panelRef()?.nativeElement;\n if (!panel) return;\n (mkGetFocusable(panel)[0] ?? panel).focus();\n }\n}\n","<button\n #trigger\n type=\"button\"\n class=\"mk-notification-center__trigger\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-label]=\"triggerLabel()\"\n (click)=\"toggle()\"\n>\n <mk-icon name=\"bell\" />\n @if (unreadCount() > 0) {\n <mk-badge\n class=\"mk-notification-center__count\"\n tone=\"danger\"\n variant=\"solid\"\n size=\"sm\"\n aria-hidden=\"true\"\n >\n {{ badgeText() }}\n </mk-badge>\n }\n</button>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-notification-center__panel\"\n role=\"dialog\"\n tabindex=\"-1\"\n [id]=\"panelId\"\n [attr.aria-labelledby]=\"titleId\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"trigger\"\n placement=\"bottom-end\"\n [gap]=\"8\"\n (dismiss)=\"close(false)\"\n (keydown.escape)=\"onEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <header class=\"mk-notification-center__header\">\n <h2 [id]=\"titleId\" class=\"mk-notification-center__title\">\n {{ panelTitle() }}\n </h2>\n <!--\n aria-disabled (not [disabled]) so the button stays focusable when it\n disables itself after activation; markAllRead() guards the no-op case.\n -->\n <button\n type=\"button\"\n class=\"mk-notification-center__mark-all\"\n [attr.aria-disabled]=\"unreadCount() === 0\"\n (click)=\"markAllRead()\"\n >\n {{ i18n.markAllRead }}\n </button>\n </header>\n\n @if (notifications().length > 0) {\n <ul\n class=\"mk-notification-center__list\"\n [style.max-height]=\"maxHeight()\"\n >\n @for (item of notifications(); track item.id) {\n <li>\n <button\n type=\"button\"\n class=\"mk-notification-center__item\"\n [class.mk-notification-center__item--unread]=\"!item.read\"\n (click)=\"onRowClick(item)\"\n >\n <span\n class=\"mk-notification-center__dot\"\n aria-hidden=\"true\"\n ></span>\n @if (!item.read) {\n <span class=\"mk-visually-hidden\">{{ i18n.unread }}</span>\n }\n <span class=\"mk-notification-center__body\">\n <span class=\"mk-notification-center__item-title\">\n {{ item.title }}\n </span>\n @if (item.body) {\n <span class=\"mk-notification-center__item-text\">\n {{ item.body }}\n </span>\n }\n @if (item.time) {\n <span class=\"mk-notification-center__item-time\">\n {{ item.time }}\n </span>\n }\n </span>\n </button>\n </li>\n }\n </ul>\n } @else {\n <mk-empty-state\n class=\"mk-notification-center__empty\"\n icon=\"bell\"\n size=\"sm\"\n [title]=\"emptyText()\"\n />\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkOverlayRef } from '@mk-kit/ui/core';\n\n/**\n * Accessible heading for a dialog. Renders as a level-2 heading and exposes a\n * stable id that {@link MkDialog} wires to the panel's `aria-labelledby`.\n *\n * ```html\n * <mk-dialog>\n * <mk-dialog-title>Delete workspace</mk-dialog-title>\n * …\n * </mk-dialog>\n * ```\n */\n@Component({\n selector: 'mk-dialog-title',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-dialog__title',\n role: 'heading',\n 'aria-level': '2',\n '[attr.id]': 'id()',\n },\n})\nexport class MkDialogTitle {\n /** Stable id used for `aria-labelledby` wiring. */\n readonly id = input(mkUniqueId('mk-dialog-title'));\n}\n\n/**\n * Dialog layout — a surface with a sticky header, scrollable body, and sticky\n * footer, designed to be rendered inside an {@link MkOverlayService} panel. The\n * header exposes a close button wired to the injected {@link MkOverlayRef} and\n * the dialog's title is linked to the panel via `aria-labelledby`.\n *\n * Slots: `[mkDialogHeader]` / `<mk-dialog-title>` (header), default content\n * (body), `[mkDialogFooter]` (footer).\n *\n * ```html\n * <mk-dialog>\n * <mk-dialog-title>Rename</mk-dialog-title>\n * <p>Choose a new name.</p>\n * <div mkDialogFooter>\n * <button mkButton variant=\"ghost\">Cancel</button>\n * <button mkButton>Save</button>\n * </div>\n * </mk-dialog>\n * ```\n */\n@Component({\n selector: 'mk-dialog',\n templateUrl: './dialog.html',\n styleUrl: './dialog.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // Unencapsulated so `.mk-dialog-panel` (applied to the body-level overlay\n // panel outside this component's view) can be styled from here.\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mk-dialog' },\n})\nexport class MkDialog {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n private readonly overlayRef = inject(MkOverlayRef, { optional: true });\n\n /** Optional plain-text title. Ignored when a `<mk-dialog-title>` is projected. */\n readonly dialogTitle = input<string>();\n /** Stable id for the built-in title element. */\n readonly titleId = input(mkUniqueId('mk-dialog-title'));\n /** Hide the header close button. */\n readonly hideClose = input(false, { transform: booleanAttribute });\n /**\n * Let the user move the dialog by dragging its header (pointer / touch) or\n * with the arrow keys on the grip that appears in the header. Double-click\n * the header or press Home on the grip to snap back to the centre.\n */\n readonly draggable = input(false, { transform: booleanAttribute });\n /**\n * Let the user resize the dialog from the corner grip (pointer / touch, or\n * arrow keys on the grip; Home resets). The panel never grows past the\n * viewport or shrinks below a usable minimum.\n */\n readonly resizable = input(false, { transform: booleanAttribute });\n\n private readonly destroyRef = inject(DestroyRef);\n /** The body-level overlay panel this dialog lives in (`null` when inline). */\n private panelEl: HTMLElement | null | undefined;\n /** Current drag offset from the centred position, px. */\n private offset = { x: 0, y: 0 };\n\n constructor() {\n afterNextRender(() => this.wireLabelledBy());\n afterRenderEffect(() => {\n const draggable = this.draggable();\n const resizable = this.resizable();\n const panel = this.panel();\n if (!panel) return;\n panel.classList.toggle('mk-dialog-panel--draggable', draggable);\n panel.classList.toggle('mk-dialog-panel--resizable', resizable);\n });\n const view = this.host.nativeElement.ownerDocument.defaultView;\n if (view) {\n const onResize = () => this.clampIntoView();\n view.addEventListener('resize', onResize);\n this.destroyRef.onDestroy(() => view.removeEventListener('resize', onResize));\n }\n }\n\n /** Close the surrounding overlay, if any. */\n protected close(): void {\n this.overlayRef?.close();\n }\n\n /** Snap back to the centred, preset-sized panel. */\n reset(): void {\n const panel = this.panel();\n if (!panel) return;\n this.offset = { x: 0, y: 0 };\n panel.style.translate = '';\n panel.style.width = '';\n panel.style.height = '';\n }\n\n // --- Drag / resize -----------------------------------------------------------\n\n protected onHeaderPointerDown(event: PointerEvent): void {\n if (!this.draggable()) return;\n const target = event.target as HTMLElement;\n // Controls in the header keep their own pointer behaviour.\n if (target.closest('button, a, input, textarea, select, [contenteditable=\"true\"]') && !target.closest('.mk-dialog__grip')) return;\n this.startPointer(event, 'move');\n }\n\n protected onGripPointerDown(event: PointerEvent): void {\n this.startPointer(event, 'move');\n }\n\n protected onResizerPointerDown(event: PointerEvent): void {\n this.startPointer(event, 'resize');\n }\n\n protected onHeaderDoubleClick(event: MouseEvent): void {\n if (!this.draggable()) return;\n if ((event.target as HTMLElement).closest('button, a, input, textarea, select')) return;\n this.reset();\n }\n\n protected onGripKeydown(event: KeyboardEvent): void {\n const step = event.shiftKey ? 32 : 8;\n const delta = MkDialog.arrowDelta(event.key, step);\n if (delta) {\n event.preventDefault();\n this.moveTo(this.offset.x + delta.x, this.offset.y + delta.y);\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.reset();\n }\n }\n\n protected onResizerKeydown(event: KeyboardEvent): void {\n const step = event.shiftKey ? 64 : 16;\n const delta = MkDialog.arrowDelta(event.key, step);\n const panel = this.panel();\n if (delta && panel) {\n event.preventDefault();\n const rect = panel.getBoundingClientRect();\n const rtl = this.isRtl(panel);\n this.resizeTo(rect.width + (rtl ? -delta.x : delta.x), rect.height + delta.y);\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.reset();\n }\n }\n\n private static arrowDelta(key: string, step: number): { x: number; y: number } | null {\n switch (key) {\n case 'ArrowLeft':\n return { x: -step, y: 0 };\n case 'ArrowRight':\n return { x: step, y: 0 };\n case 'ArrowUp':\n return { x: 0, y: -step };\n case 'ArrowDown':\n return { x: 0, y: step };\n default:\n return null;\n }\n }\n\n private startPointer(event: PointerEvent, mode: 'move' | 'resize'): void {\n const panel = this.panel();\n if (!panel || event.button !== 0) return;\n event.preventDefault();\n const handle = event.currentTarget as HTMLElement;\n const startX = event.clientX;\n const startY = event.clientY;\n const startOffset = { ...this.offset };\n const rect = panel.getBoundingClientRect();\n const rtl = this.isRtl(panel);\n handle.setPointerCapture?.(event.pointerId);\n this.markMoved(panel);\n panel.classList.add('mk-dialog-panel--dragging');\n\n const onMove = (e: PointerEvent) => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n if (mode === 'move') this.moveTo(startOffset.x + dx, startOffset.y + dy);\n else this.resizeTo(rect.width + (rtl ? -dx : dx), rect.height + dy);\n };\n const onEnd = () => {\n handle.removeEventListener('pointermove', onMove);\n handle.removeEventListener('pointerup', onEnd);\n handle.removeEventListener('pointercancel', onEnd);\n handle.releasePointerCapture?.(event.pointerId);\n panel.classList.remove('mk-dialog-panel--dragging');\n };\n handle.addEventListener('pointermove', onMove);\n handle.addEventListener('pointerup', onEnd);\n handle.addEventListener('pointercancel', onEnd);\n }\n\n /** Move the panel to `(x, y)` px from its centred spot, kept inside the viewport. */\n private moveTo(x: number, y: number): void {\n const panel = this.panel();\n const view = panel?.ownerDocument.defaultView;\n if (!panel || !view) return;\n const rect = panel.getBoundingClientRect();\n // Where the panel sits with no offset at all.\n const baseLeft = rect.left - this.offset.x;\n const baseTop = rect.top - this.offset.y;\n const maxX = Math.max(-baseLeft, view.innerWidth - rect.width - baseLeft);\n const maxY = Math.max(-baseTop, view.innerHeight - rect.height - baseTop);\n this.offset = {\n x: Math.min(Math.max(x, -baseLeft), maxX),\n y: Math.min(Math.max(y, -baseTop), maxY),\n };\n this.markMoved(panel);\n panel.style.translate = `${Math.round(this.offset.x)}px ${Math.round(this.offset.y)}px`;\n }\n\n /** Resize the panel to `w × h` px within [minimum, viewport]. */\n private resizeTo(w: number, h: number): void {\n const panel = this.panel();\n const view = panel?.ownerDocument.defaultView;\n if (!panel || !view) return;\n const width = Math.min(Math.max(w, 240), view.innerWidth);\n const height = Math.min(Math.max(h, 160), view.innerHeight);\n this.markMoved(panel);\n panel.style.width = `${Math.round(width)}px`;\n panel.style.height = `${Math.round(height)}px`;\n panel.style.maxWidth = '100vw';\n panel.style.maxHeight = '100vh';\n this.clampIntoView();\n }\n\n /**\n * Once the user takes hold, the entrance animation must never run again —\n * toggling `animation` back on (as a transient class would) restarts it,\n * so the panel would blink after every drag. The class is never removed.\n */\n private markMoved(panel: HTMLElement): void {\n panel.classList.add('mk-dialog-panel--moved');\n }\n\n private clampIntoView(): void {\n if (this.offset.x === 0 && this.offset.y === 0) return;\n this.moveTo(this.offset.x, this.offset.y);\n }\n\n private isRtl(panel: HTMLElement): boolean {\n const view = panel.ownerDocument.defaultView;\n return (view?.getComputedStyle(panel).direction ?? 'ltr') === 'rtl';\n }\n\n private panel(): HTMLElement | null {\n if (this.panelEl === undefined) {\n this.panelEl = this.host.nativeElement.closest<HTMLElement>('.mk-overlay-panel');\n }\n return this.panelEl;\n }\n\n /** Point the owning dialog panel's `aria-labelledby` at the title element. */\n private wireLabelledBy(): void {\n const el = this.host.nativeElement;\n const panel = el.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]');\n if (!panel) return;\n\n const titleEl = el.querySelector<HTMLElement>(\n 'mk-dialog-title, .mk-dialog__title',\n );\n if (!titleEl) return;\n if (!titleEl.id) titleEl.id = this.titleId();\n panel.setAttribute('aria-labelledby', titleEl.id);\n }\n}\n","<header\n class=\"mk-dialog__header\"\n [class.mk-dialog__header--draggable]=\"draggable()\"\n (pointerdown)=\"onHeaderPointerDown($event)\"\n (dblclick)=\"onHeaderDoubleClick($event)\"\n>\n @if (draggable()) {\n <button\n type=\"button\"\n class=\"mk-dialog__grip\"\n [attr.aria-label]=\"i18n.dialogMove\"\n [title]=\"i18n.dialogMove\"\n (pointerdown)=\"onGripPointerDown($event)\"\n (keydown)=\"onGripKeydown($event)\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"5.5\" cy=\"3.5\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"10.5\" cy=\"3.5\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"5.5\" cy=\"8\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"10.5\" cy=\"8\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"5.5\" cy=\"12.5\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"10.5\" cy=\"12.5\" r=\"1.3\" fill=\"currentColor\" />\n </svg>\n </button>\n }\n <div class=\"mk-dialog__heading\">\n <ng-content select=\"[mkDialogHeader], mk-dialog-title\" />\n @if (dialogTitle(); as heading) {\n <h2 class=\"mk-dialog__title\" [id]=\"titleId()\">{{ heading }}</h2>\n }\n </div>\n @if (!hideClose()) {\n <button\n type=\"button\"\n class=\"mk-dialog__close\"\n [attr.aria-label]=\"i18n.close\"\n (click)=\"close()\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n }\n</header>\n\n<div class=\"mk-dialog__body\">\n <ng-content />\n</div>\n\n<footer class=\"mk-dialog__footer\">\n <ng-content select=\"[mkDialogFooter]\" />\n</footer>\n\n@if (resizable()) {\n <button\n type=\"button\"\n class=\"mk-dialog__resizer\"\n [attr.aria-label]=\"i18n.dialogResize\"\n [title]=\"i18n.dialogResize\"\n (pointerdown)=\"onResizerPointerDown($event)\"\n (keydown)=\"onResizerKeydown($event)\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M14 8L8 14M14 12l-2 2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MK_OVERLAY_DATA, MkOverlayRef } from '@mk-kit/ui/core';\nimport { MkButton } from '@mk-kit/ui/button';\nimport { MkIcon } from '@mk-kit/ui/icon';\nimport { MkDialog } from './dialog';\n\n/** Data contract for {@link MkConfirmDialog} / `MkDialogService.confirm`. */\nexport interface MkConfirmDialogData {\n /** Heading text. */\n title: string;\n /** Body message. */\n message: string;\n /** Confirm button label. Default `Confirm`. */\n confirmText?: string;\n /** Cancel button label. Default `Cancel`. */\n cancelText?: string;\n /** Tone of the confirm button (and `alertdialog` semantics when `danger`). */\n tone?: 'primary' | 'danger' | 'warning' | 'success';\n /**\n * Optional registered icon name shown beside the message. Useful when the\n * action is destructive and the wording alone carries no visual weight\n * (`trash`, `alert-triangle`, `user-x`).\n */\n icon?: string;\n /** Hide the cancel button — a single-button acknowledgement (`alert`). */\n hideCancel?: boolean;\n}\n\n/**\n * Internal component backing `MkDialogService.confirm`. Renders a title,\n * message, and cancel/confirm buttons. Resolves the overlay ref with `true`\n * on confirm and `false` on cancel. Uses `alertdialog` semantics for the\n * `danger` tone (set on the panel by the service).\n */\n@Component({\n selector: 'mk-confirm-dialog',\n imports: [MkDialog, MkButton, MkIcon],\n templateUrl: './confirm-dialog.html',\n styleUrl: './confirm-dialog.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MkConfirmDialog {\n private readonly ref =\n inject<MkOverlayRef<boolean>>(MkOverlayRef);\n protected readonly data = inject<MkConfirmDialogData>(MK_OVERLAY_DATA);\n protected readonly i18n = inject(MK_I18N);\n\n protected readonly confirmTone = computed(() => this.data.tone ?? 'primary');\n protected readonly confirmText = computed(\n () => this.data.confirmText ?? this.i18n.confirm,\n );\n protected readonly cancelText = computed(\n () => this.data.cancelText ?? this.i18n.cancel,\n );\n\n protected confirm(): void {\n this.ref.close(true);\n }\n\n protected cancel(): void {\n this.ref.close(false);\n }\n}\n","<mk-dialog [dialogTitle]=\"data.title\" hideClose>\n <div class=\"mk-confirm-dialog__body\">\n @if (data.icon; as icon) {\n <mk-icon\n class=\"mk-confirm-dialog__icon\"\n [class.mk-confirm-dialog__icon--danger]=\"data.tone === 'danger'\"\n [name]=\"icon\"\n [size]=\"22\"\n />\n }\n <p class=\"mk-confirm-dialog__message\">{{ data.message }}</p>\n </div>\n\n <div mkDialogFooter>\n @if (!data.hideCancel) {\n <button mkButton variant=\"ghost\" tone=\"neutral\" (click)=\"cancel()\">\n {{ cancelText() }}\n </button>\n }\n <button mkButton [tone]=\"confirmTone()\" (click)=\"confirm()\">\n {{ confirmText() }}\n </button>\n </div>\n</mk-dialog>\n","import { Injectable, Type, inject } from '@angular/core';\nimport {\n MkOverlayConfig,\n MkOverlayService,\n} from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkOverlayRef } from '@mk-kit/ui/core';\nimport { MkConfirmDialog, MkConfirmDialogData } from './confirm-dialog';\nimport type { MkPromptDialog, MkPromptDialogData } from './prompt-dialog';\n\n/**\n * Panel width preset. The panel is always `min(target, 92vw)`, so it shrinks to\n * fit a phone and grows to its target on a desktop.\n *\n * - `sm` (32rem) — the default; confirmations, single-field prompts\n * - `md` (45rem) — two-column forms\n * - `lg` (56rem) — forms with nested sections\n * - `xl` (75rem) — tables or side-by-side content inside a modal\n */\nexport type MkDialogSize = 'sm' | 'md' | 'lg' | 'xl';\n\n/** Configuration for `MkDialogService.open`. Extends the raw overlay config. */\nexport interface MkDialogConfig<TData = unknown>\n extends MkOverlayConfig<TData> {\n /** Panel width preset. Defaults to `sm`, matching pre-0.9 behaviour. */\n size?: MkDialogSize;\n}\n\nconst DIALOG_PANEL_CLASS = 'mk-dialog-panel';\n\n/**\n * Dialog service — a thin, opinionated layer over {@link MkOverlayService} that\n * renders content on a themed `--mk-surface` panel (shadow, radius, entrance\n * animation) and adds a `confirm()` convenience.\n *\n * ```ts\n * const ref = dialog.open(EditUserDialog, { data: user });\n * const saved = await ref.afterClosed;\n *\n * if (await dialog.confirm({ title: 'Delete?', message: 'This cannot be undone.', tone: 'danger' })) {\n * remove();\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkDialogService {\n private readonly overlay = inject(MkOverlayService);\n private readonly i18n = inject(MK_I18N);\n\n /** Open `component` inside a themed dialog panel. */\n open<TComponent, TResult = unknown, TData = unknown>(\n component: Type<TComponent>,\n config: MkDialogConfig<TData> = {},\n ): MkOverlayRef<TResult, TComponent> {\n const sizeClass = `mk-dialog-panel--${config.size ?? 'sm'}`;\n return this.overlay.open<TComponent, TResult, TData>(component, {\n ...config,\n role: config.role ?? 'dialog',\n panelClass: this.mergePanelClass(config.panelClass, sizeClass),\n });\n }\n\n /**\n * Open a confirmation dialog. Resolves `true` if confirmed, `false` if the\n * user cancels, presses Escape, or clicks the backdrop.\n */\n confirm(data: MkConfirmDialogData): Promise<boolean> {\n const ref = this.open<MkConfirmDialog, boolean, MkConfirmDialogData>(\n MkConfirmDialog,\n {\n data,\n role: data.tone === 'danger' ? 'alertdialog' : 'dialog',\n ariaLabel: data.title,\n },\n );\n return ref.afterClosed.then((result) => result === true);\n }\n\n /**\n * Open a single-button acknowledgement dialog. Resolves when the user\n * dismisses it (button, Escape, or backdrop).\n */\n alert(data: Omit<MkConfirmDialogData, 'hideCancel' | 'cancelText'>): Promise<void> {\n const ref = this.open<MkConfirmDialog, boolean, MkConfirmDialogData>(\n MkConfirmDialog,\n {\n data: {\n ...data,\n hideCancel: true,\n confirmText: data.confirmText ?? this.i18n.ok,\n },\n role: data.tone === 'danger' ? 'alertdialog' : 'dialog',\n ariaLabel: data.title,\n },\n );\n return ref.afterClosed.then(() => undefined);\n }\n\n /**\n * Open a single-field prompt dialog. Resolves with the entered string, or\n * `null` if the user cancels, presses Escape, or clicks the backdrop.\n */\n async prompt(data: MkPromptDialogData): Promise<string | null> {\n // Loaded on demand: the prompt dialog is the only thing in `feedback` that\n // needs `@mk-kit/ui/forms`, and a static reference here shipped the whole\n // forms entry (input, form field, and their dependencies) to every app\n // that injects this service — including ones that never prompt.\n const { MkPromptDialog } = await import('./prompt-dialog');\n const ref = this.open<MkPromptDialog, string | null, MkPromptDialogData>(\n MkPromptDialog,\n { data, ariaLabel: data.title },\n );\n return ref.afterClosed.then((result) => result ?? null);\n }\n\n private mergePanelClass(\n panelClass: string | string[] | undefined,\n sizeClass: string,\n ): string[] {\n const base = [DIALOG_PANEL_CLASS, sizeClass];\n if (!panelClass) return base;\n const extra = Array.isArray(panelClass) ? panelClass : [panelClass];\n return [...base, ...extra];\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { MkButton } from '@mk-kit/ui/button';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkToastItem, MkToastService } from './toast.service';\n\n/**\n * A single toast card. Internal to the toast system — rendered by\n * {@link MkToastContainer}. Displays a tone accent, optional title, message,\n * optional action button, and (when dismissible) a close button. Auto-dismiss\n * pauses while the toast is hovered or focused.\n */\n@Component({\n selector: 'mk-toast',\n imports: [MkButton],\n templateUrl: './toast.html',\n styleUrl: './toast.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-toast',\n '[attr.data-tone]': 'item().tone',\n '[attr.role]': 'role()',\n '(mouseenter)': 'pause()',\n '(mouseleave)': 'resume()',\n '(focusin)': 'pause()',\n '(focusout)': 'resume()',\n },\n})\nexport class MkToast {\n private readonly service = inject(MkToastService);\n protected readonly i18n = inject(MK_I18N);\n\n /** The toast model to render. */\n readonly item = input.required<MkToastItem>();\n\n /** Assertive alert for danger, polite status otherwise. */\n protected readonly role = computed(() =>\n this.item().tone === 'danger' ? 'alert' : 'status',\n );\n\n protected dismiss(): void {\n this.service.dismiss(this.item().id);\n }\n\n protected runAction(): void {\n this.service.runAction(this.item());\n }\n\n protected pause(): void {\n this.service.pause(this.item().id);\n }\n\n protected resume(): void {\n this.service.resume(this.item().id);\n }\n}\n","<div class=\"mk-toast__body\">\n @if (item().title; as title) {\n <p class=\"mk-toast__title\">{{ title }}</p>\n }\n <p class=\"mk-toast__message\">{{ item().message }}</p>\n\n @if (item().action; as action) {\n <div class=\"mk-toast__actions\">\n <button mkButton variant=\"link\" size=\"sm\" (click)=\"runAction()\">\n {{ action.label }}\n </button>\n </div>\n }\n</div>\n\n@if (item().dismissible) {\n <button\n type=\"button\"\n class=\"mk-toast__close\"\n [attr.aria-label]=\"i18n.dismiss\"\n (click)=\"dismiss()\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { MkToast } from './toast';\nimport { MkToastService } from './toast.service';\n\n/**\n * Fixed, bottom-right stack that renders the active toasts from\n * {@link MkToastService}. Mounted once, lazily, into `document.body` by the\n * service — not intended for direct template use.\n */\n@Component({\n selector: 'mk-toast-container',\n imports: [MkToast],\n templateUrl: './toast-container.html',\n styleUrl: './toast-container.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-toast-container',\n 'aria-label': 'Notifications',\n },\n})\nexport class MkToastContainer {\n private readonly service = inject(MkToastService);\n /** Live list of toasts to render. */\n protected readonly toasts = this.service.toasts;\n}\n","@for (toast of toasts(); track toast.id) {\n <mk-toast [item]=\"toast\" />\n}\n","import {\n ApplicationRef,\n ComponentRef,\n DOCUMENT,\n EnvironmentInjector,\n Injectable,\n PLATFORM_ID,\n createComponent,\n inject,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_OVERLAY_ROOT } from '@mk-kit/ui/core';\nimport { MkToastContainer } from './toast-container';\n\n/** Semantic tones supported by toasts. */\nexport type MkToastTone = 'info' | 'success' | 'warning' | 'danger' | 'neutral';\n\n/** An optional action button rendered inside a toast. */\nexport interface MkToastAction {\n /** Button label. */\n label: string;\n /** Invoked when the action is activated. The toast is dismissed afterwards. */\n handler?: () => void;\n}\n\n/** Options accepted by {@link MkToastService.show}. */\nexport interface MkToastConfig {\n /** Optional bold heading. */\n title?: string;\n /** Body message (required). */\n message: string;\n /** Semantic tone. Default `info`. */\n tone?: MkToastTone;\n /** Auto-dismiss delay in ms. `0` keeps the toast until dismissed. Default `5000`. */\n duration?: number;\n /** Show a close button. Default `true`. */\n dismissible?: boolean;\n /** Optional action button. */\n action?: MkToastAction;\n}\n\n/** A live toast rendered by the container. */\nexport interface MkToastItem {\n readonly id: number;\n readonly title?: string;\n readonly message: string;\n readonly tone: MkToastTone;\n readonly duration: number;\n readonly dismissible: boolean;\n readonly action?: MkToastAction;\n}\n\nconst DEFAULT_DURATION = 5000;\nlet nextId = 0;\n\ninterface ToastTimer {\n handle: ReturnType<typeof setTimeout>;\n remaining: number;\n startedAt: number;\n}\n\n/**\n * Toast service — enqueues transient notifications rendered by a single,\n * lazily-mounted {@link MkToastContainer} at the bottom-right of the viewport.\n * Each rendered toast is itself a live region (`role=\"alert\"` for `danger`,\n * else `role=\"status\"`), so assistive tech announces it exactly once. Toasts\n * auto-dismiss after `duration` ms unless it is `0`.\n *\n * ```ts\n * toasts.success('Saved');\n * toasts.show({ title: 'Upload failed', message: 'Retry?', tone: 'danger',\n * duration: 0, action: { label: 'Retry', handler: () => retry() } });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkToastService {\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly overlayRoot = inject(MK_OVERLAY_ROOT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly _toasts = signal<readonly MkToastItem[]>([]);\n /** Reactive list of currently visible toasts. */\n readonly toasts = this._toasts.asReadonly();\n\n private readonly timers = new Map<number, ToastTimer>();\n private containerRef?: ComponentRef<MkToastContainer>;\n\n /** Show a toast, returning its id (usable with {@link dismiss}). */\n show(config: MkToastConfig): number {\n const item: MkToastItem = {\n id: nextId++,\n title: config.title,\n message: config.message,\n tone: config.tone ?? 'info',\n duration: config.duration ?? DEFAULT_DURATION,\n dismissible: config.dismissible ?? true,\n action: config.action,\n };\n\n if (!this.isBrowser) return item.id;\n\n this.ensureContainer();\n // The toast element itself carries role=\"alert\"/\"status\" — no separate\n // live-announcer call, or screen readers would read everything twice.\n this._toasts.update((list) => [...list, item]);\n\n if (item.duration > 0) this.startTimer(item.id, item.duration);\n return item.id;\n }\n\n /** Show an `info` toast. */\n info(message: string, config: Partial<MkToastConfig> = {}): number {\n return this.show({ ...config, message, tone: 'info' });\n }\n /** Show a `success` toast. */\n success(message: string, config: Partial<MkToastConfig> = {}): number {\n return this.show({ ...config, message, tone: 'success' });\n }\n /** Show a `warning` toast. */\n warning(message: string, config: Partial<MkToastConfig> = {}): number {\n return this.show({ ...config, message, tone: 'warning' });\n }\n /** Show a `danger` toast. */\n danger(message: string, config: Partial<MkToastConfig> = {}): number {\n return this.show({ ...config, message, tone: 'danger' });\n }\n /** Show a `neutral` toast. */\n neutral(message: string, config: Partial<MkToastConfig> = {}): number {\n return this.show({ ...config, message, tone: 'neutral' });\n }\n\n /** Dismiss a toast by id. */\n dismiss(id: number): void {\n this.clearTimer(id);\n this._toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n /** Dismiss every visible toast. */\n clear(): void {\n this.timers.forEach((t) => clearTimeout(t.handle));\n this.timers.clear();\n this._toasts.set([]);\n }\n\n /** Run a toast action, then dismiss it. */\n runAction(item: MkToastItem): void {\n item.action?.handler?.();\n this.dismiss(item.id);\n }\n\n /** Pause a toast's auto-dismiss countdown (e.g. on hover/focus). */\n pause(id: number): void {\n const timer = this.timers.get(id);\n if (!timer) return;\n clearTimeout(timer.handle);\n timer.remaining -= Date.now() - timer.startedAt;\n }\n\n /** Resume a paused countdown. */\n resume(id: number): void {\n const timer = this.timers.get(id);\n if (!timer) return;\n this.startTimer(id, Math.max(timer.remaining, 0));\n }\n\n private startTimer(id: number, duration: number): void {\n this.timers.set(id, {\n handle: setTimeout(() => this.dismiss(id), duration),\n remaining: duration,\n startedAt: Date.now(),\n });\n }\n\n private clearTimer(id: number): void {\n const timer = this.timers.get(id);\n if (timer) clearTimeout(timer.handle);\n this.timers.delete(id);\n }\n\n private ensureContainer(): void {\n if (this.containerRef) return;\n const ref = createComponent(MkToastContainer, {\n environmentInjector: this.envInjector,\n });\n this.appRef.attachView(ref.hostView);\n this.overlayRoot().appendChild(ref.location.nativeElement);\n this.containerRef = ref;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkSnackbarItem, MkSnackbarService } from './snackbar.service';\n\n/**\n * The visual snackbar bar. Internal to the snackbar system — rendered by\n * {@link MkSnackbarContainer}. Shows a message, an optional action button and\n * (when `dismissible`) a close button. Auto-dismiss pauses on hover/focus.\n */\n@Component({\n selector: 'mk-snackbar',\n templateUrl: './snackbar.html',\n styleUrl: './snackbar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-snackbar',\n '[attr.data-tone]': 'item().tone',\n '[attr.role]': 'role()',\n '(mouseenter)': 'pause()',\n '(mouseleave)': 'resume()',\n '(focusin)': 'pause()',\n '(focusout)': 'resume()',\n },\n})\nexport class MkSnackbar {\n private readonly service = inject(MkSnackbarService);\n protected readonly i18n = inject(MK_I18N);\n\n /** The snackbar model to render. */\n readonly item = input.required<MkSnackbarItem>();\n\n /** Assertive alert for danger/warning, polite status otherwise. */\n protected readonly role = computed(() =>\n this.item().tone === 'danger' || this.item().tone === 'warning'\n ? 'alert'\n : 'status',\n );\n\n protected runAction(): void {\n this.service.runAction(this.item().id);\n }\n\n protected dismiss(): void {\n this.service.dismiss(this.item().id);\n }\n\n protected pause(): void {\n this.service.pause();\n }\n\n protected resume(): void {\n this.service.resume();\n }\n}\n","<span class=\"mk-snackbar__message\">{{ item().message }}</span>\n\n@if (item().actionLabel) {\n <button type=\"button\" class=\"mk-snackbar__action\" (click)=\"runAction()\">\n {{ item().actionLabel }}\n </button>\n}\n\n@if (item().dismissible) {\n <button\n type=\"button\"\n class=\"mk-snackbar__close\"\n [attr.aria-label]=\"i18n.dismiss\"\n (click)=\"dismiss()\"\n ></button>\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { MkSnackbar } from './snackbar';\nimport { MkSnackbarService } from './snackbar.service';\n\n/**\n * Fixed, bottom-centre host that renders the single active snackbar from\n * {@link MkSnackbarService}. Mounted once, lazily, into `document.body` by the\n * service — not intended for direct template use.\n */\n@Component({\n selector: 'mk-snackbar-container',\n imports: [MkSnackbar],\n templateUrl: './snackbar-container.html',\n styleUrl: './snackbar-container.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-snackbar-container',\n },\n})\nexport class MkSnackbarContainer {\n private readonly service = inject(MkSnackbarService);\n /** The active snackbar to render, or `null`. */\n protected readonly active = this.service.active;\n}\n","@if (active(); as item) {\n <mk-snackbar [item]=\"item\" />\n}\n","import {\n ApplicationRef,\n ComponentRef,\n DOCUMENT,\n EnvironmentInjector,\n Injectable,\n PLATFORM_ID,\n createComponent,\n inject,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_OVERLAY_ROOT } from '@mk-kit/ui/core';\nimport { MkSnackbarContainer } from './snackbar-container';\n\n/** Semantic tone of a snackbar. `neutral` is the default dark bar. */\nexport type MkSnackbarTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger';\n\n/** Why a snackbar closed. */\nexport type MkSnackbarDismissReason = 'action' | 'timeout' | 'dismiss';\n\n/** Options for {@link MkSnackbarService.open}. */\nexport interface MkSnackbarConfig {\n /** Semantic tone. Default `neutral`. */\n tone?: MkSnackbarTone;\n /** Auto-dismiss delay in ms. `0` keeps it open until dismissed. Default `5000`. */\n duration?: number;\n /** Show a close (×) button. Default `false` (dismiss via action/timeout). */\n dismissible?: boolean;\n /**\n * @deprecated The snackbar element is itself the live region — its\n * politeness is derived from `tone` (`alert` for danger/warning, else\n * `status`). This option is ignored.\n */\n politeness?: 'polite' | 'assertive';\n}\n\n/** The live snackbar model rendered by the container. */\nexport interface MkSnackbarItem {\n readonly id: number;\n readonly message: string;\n readonly actionLabel?: string;\n readonly tone: MkSnackbarTone;\n readonly dismissible: boolean;\n}\n\nconst DEFAULT_DURATION = 5000;\nlet nextId = 0;\n\n/**\n * Handle to an opened snackbar. Await {@link onAction} to react to the action\n * button, or {@link afterDismissed} to run code once it closes.\n */\nexport class MkSnackbarRef {\n private actionResolve!: () => void;\n private dismissResolve!: (reason: MkSnackbarDismissReason) => void;\n private readonly actionPromise = new Promise<void>((r) => {\n this.actionResolve = r;\n });\n private readonly dismissPromise = new Promise<MkSnackbarDismissReason>((r) => {\n this.dismissResolve = r;\n });\n\n constructor(\n /** Unique id of the snackbar this ref controls. */\n readonly id: number,\n private readonly service: MkSnackbarService,\n ) {}\n\n /** Dismiss the snackbar programmatically. */\n dismiss(): void {\n this.service.dismiss(this.id);\n }\n\n /** Resolves when the action button is activated. */\n onAction(): Promise<void> {\n return this.actionPromise;\n }\n\n /** Resolves when the snackbar has closed, with the reason it closed. */\n afterDismissed(): Promise<MkSnackbarDismissReason> {\n return this.dismissPromise;\n }\n\n /** @internal */\n _notifyAction(): void {\n this.actionResolve();\n }\n /** @internal */\n _notifyDismissed(reason: MkSnackbarDismissReason): void {\n this.dismissResolve(reason);\n }\n}\n\n/**\n * Snackbar service — shows a single, brief message at the bottom-centre of the\n * viewport with an optional action button, following the Material snackbar\n * model: only one is visible at a time, and opening a new one replaces the\n * current. For stacked, persistent notifications use `MkToastService` instead.\n *\n * ```ts\n * const ref = snackbar.open('Message archived', 'Undo');\n * ref.onAction().then(() => restore());\n *\n * snackbar.open('Changes saved', undefined, { tone: 'success' });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkSnackbarService {\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly overlayRoot = inject(MK_OVERLAY_ROOT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly _active = signal<MkSnackbarItem | null>(null);\n /** The currently visible snackbar, or `null`. */\n readonly active = this._active.asReadonly();\n\n private readonly refs = new Map<number, MkSnackbarRef>();\n private timer?: ReturnType<typeof setTimeout>;\n private remaining = 0;\n private startedAt = 0;\n private containerRef?: ComponentRef<MkSnackbarContainer>;\n\n /**\n * Open a snackbar. `action` is the (optional) button label — react to it via\n * the returned ref's {@link MkSnackbarRef.onAction}.\n */\n open(\n message: string,\n action?: string,\n config: MkSnackbarConfig = {},\n ): MkSnackbarRef {\n const id = nextId++;\n const ref = new MkSnackbarRef(id, this);\n if (!this.isBrowser) return ref;\n\n // Replace any currently-open snackbar (Material single-slot behaviour).\n const current = this._active();\n if (current) this.dismiss(current.id);\n\n const item: MkSnackbarItem = {\n id,\n message,\n actionLabel: action,\n tone: config.tone ?? 'neutral',\n dismissible: config.dismissible ?? false,\n };\n\n this.ensureContainer();\n this.refs.set(id, ref);\n // The snackbar element itself carries role=\"alert\"/\"status\" — no separate\n // live-announcer call, or screen readers would read everything twice.\n this._active.set(item);\n\n const duration = config.duration ?? DEFAULT_DURATION;\n if (duration > 0) this.startTimer(id, duration);\n return ref;\n }\n\n /** Dismiss the snackbar with the given id (if it is the active one). */\n dismiss(id: number): void {\n this.close(id, 'dismiss');\n }\n\n /** Run the action for the active snackbar, then close it. */\n runAction(id: number): void {\n this.refs.get(id)?._notifyAction();\n this.close(id, 'action');\n }\n\n /** Pause the auto-dismiss countdown (e.g. on hover/focus). */\n pause(): void {\n if (!this.timer) return;\n clearTimeout(this.timer);\n this.timer = undefined;\n this.remaining -= Date.now() - this.startedAt;\n }\n\n /** Resume a paused countdown. */\n resume(): void {\n const active = this._active();\n if (!active || this.timer || this.remaining <= 0) return;\n this.startTimer(active.id, this.remaining);\n }\n\n private close(id: number, reason: MkSnackbarDismissReason): void {\n if (this._active()?.id !== id) return;\n this.clearTimer();\n this._active.set(null);\n const ref = this.refs.get(id);\n this.refs.delete(id);\n ref?._notifyDismissed(reason);\n }\n\n private startTimer(id: number, duration: number): void {\n this.remaining = duration;\n this.startedAt = Date.now();\n this.timer = setTimeout(() => this.close(id, 'timeout'), duration);\n }\n\n private clearTimer(): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = undefined;\n this.remaining = 0;\n }\n\n private ensureContainer(): void {\n if (this.containerRef) return;\n const ref = createComponent(MkSnackbarContainer, {\n environmentInjector: this.envInjector,\n });\n this.appRef.attachView(ref.hostView);\n this.overlayRoot().appendChild(ref.location.nativeElement);\n this.containerRef = ref;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\nimport { mkUniqueId } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkOverlayRef } from '@mk-kit/ui/core';\n\n/** Distance in px the sheet must be dragged down before it dismisses. */\nconst DISMISS_THRESHOLD = 120;\n\n/**\n * BottomSheet layout — the surface rendered inside an {@link MkOverlayService}\n * panel by {@link MkBottomSheetService}. Provides a drag handle (swipe down to\n * dismiss), an optional titled header with a close button, and a scrollable\n * body for projected content.\n *\n * Slots: `[mkBottomSheetHeader]` (extra header content), default content\n * (body), `[mkBottomSheetFooter]` (sticky footer).\n *\n * ```html\n * <mk-bottom-sheet sheetTitle=\"Share\">\n * <button mkButton fullWidth variant=\"ghost\">Copy link</button>\n * <button mkButton fullWidth variant=\"ghost\">Email</button>\n * </mk-bottom-sheet>\n * ```\n */\n@Component({\n selector: 'mk-bottom-sheet',\n templateUrl: './bottom-sheet.html',\n styleUrl: './bottom-sheet.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // Unencapsulated so `.mk-bottom-sheet-panel` (the body-level overlay panel\n // outside this component's view) can be styled from here.\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mk-bottom-sheet' },\n})\nexport class MkBottomSheet {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n private readonly overlayRef = inject(MkOverlayRef, { optional: true });\n\n /** Optional plain-text title rendered in the header. */\n readonly sheetTitle = input<string>();\n /** Stable id for the built-in title element. */\n readonly titleId = input(mkUniqueId('mk-bottom-sheet-title'));\n /** Hide the drag handle (also disables swipe-to-dismiss). */\n readonly hideHandle = input(false, { transform: booleanAttribute });\n /** Hide the header close button. */\n readonly hideClose = input(false, { transform: booleanAttribute });\n\n private panel: HTMLElement | null = null;\n private dragging = false;\n private startY = 0;\n\n constructor() {\n afterNextRender(() => this.wireLabelledBy());\n }\n\n /** Close the surrounding overlay, if any. */\n protected close(): void {\n this.overlayRef?.close();\n }\n\n protected onHandlePointerDown(event: PointerEvent): void {\n this.panel ??= this.host.nativeElement.closest<HTMLElement>(\n '.mk-bottom-sheet-panel',\n );\n if (!this.panel) return;\n this.dragging = true;\n this.startY = event.clientY;\n (event.target as HTMLElement).setPointerCapture?.(event.pointerId);\n this.panel.style.transition = 'none';\n }\n\n protected onHandlePointerMove(event: PointerEvent): void {\n if (!this.dragging || !this.panel) return;\n const dy = Math.max(0, event.clientY - this.startY);\n this.panel.style.transform = `translateY(${dy}px)`;\n }\n\n protected onHandlePointerUp(event: PointerEvent): void {\n if (!this.dragging || !this.panel) return;\n this.dragging = false;\n const dy = Math.max(0, event.clientY - this.startY);\n this.panel.style.transition = '';\n if (dy > DISMISS_THRESHOLD) {\n this.overlayRef?.close();\n } else {\n this.panel.style.transform = '';\n }\n }\n\n /** Point the owning panel's `aria-labelledby` at the title element. */\n private wireLabelledBy(): void {\n const el = this.host.nativeElement;\n const panel = el.closest<HTMLElement>('[role=\"dialog\"], [role=\"alertdialog\"]');\n const titleEl = el.querySelector<HTMLElement>('.mk-bottom-sheet__title');\n if (!panel || !titleEl) return;\n if (!titleEl.id) titleEl.id = this.titleId();\n panel.setAttribute('aria-labelledby', titleEl.id);\n }\n}\n","@if (!hideHandle()) {\n <div\n class=\"mk-bottom-sheet__handle-area\"\n (pointerdown)=\"onHandlePointerDown($event)\"\n (pointermove)=\"onHandlePointerMove($event)\"\n (pointerup)=\"onHandlePointerUp($event)\"\n (pointercancel)=\"onHandlePointerUp($event)\"\n >\n <span class=\"mk-bottom-sheet__handle\" aria-hidden=\"true\"></span>\n </div>\n}\n\n@if (sheetTitle() || !hideClose()) {\n <header class=\"mk-bottom-sheet__header\">\n @if (sheetTitle(); as heading) {\n <h2 class=\"mk-bottom-sheet__title\" [id]=\"titleId()\">{{ heading }}</h2>\n }\n <ng-content select=\"[mkBottomSheetHeader]\" />\n @if (!hideClose()) {\n <button\n type=\"button\"\n class=\"mk-bottom-sheet__close\"\n [attr.aria-label]=\"i18n.close\"\n (click)=\"close()\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n }\n </header>\n}\n\n<div class=\"mk-bottom-sheet__body\">\n <ng-content />\n</div>\n\n<footer class=\"mk-bottom-sheet__footer\">\n <ng-content select=\"[mkBottomSheetFooter]\" />\n</footer>\n","import { Injectable, Type, inject } from '@angular/core';\nimport {\n MkOverlayConfig,\n MkOverlayService,\n} from '@mk-kit/ui/core';\nimport { MkOverlayRef } from '@mk-kit/ui/core';\n\n/** Configuration for `MkBottomSheetService.open`. Extends the overlay config. */\nexport interface MkBottomSheetConfig<TData = unknown>\n extends MkOverlayConfig<TData> {}\n\nconst BOTTOM_SHEET_PANEL_CLASS = 'mk-bottom-sheet-panel';\n\n/**\n * BottomSheet service — a thin layer over {@link MkOverlayService} that renders\n * a component in a panel anchored to the bottom edge of the viewport: full\n * width on small screens, a centred card capped at ~42rem on large ones. It\n * slides up on open and can be swiped down to dismiss (via {@link MkBottomSheet}).\n *\n * Use it for contextual actions, pickers and mobile-style menus. For a centred\n * modal use `MkDialogService` instead.\n *\n * ```ts\n * const ref = bottomSheet.open(ShareSheet, { data: { url } });\n * const choice = await ref.afterClosed;\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkBottomSheetService {\n private readonly overlay = inject(MkOverlayService);\n\n /** Open `component` inside a bottom-anchored sheet panel. */\n open<TComponent, TResult = unknown, TData = unknown>(\n component: Type<TComponent>,\n config: MkBottomSheetConfig<TData> = {},\n ): MkOverlayRef<TResult, TComponent> {\n return this.overlay.open<TComponent, TResult, TData>(component, {\n ...config,\n role: config.role ?? 'dialog',\n panelClass: this.mergePanelClass(config.panelClass),\n });\n }\n\n private mergePanelClass(\n panelClass: string | string[] | undefined,\n ): string[] {\n if (!panelClass) return [BOTTOM_SHEET_PANEL_CLASS];\n const extra = Array.isArray(panelClass) ? panelClass : [panelClass];\n return [BOTTOM_SHEET_PANEL_CLASS, ...extra];\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n model,\n output,\n inject,\n} from '@angular/core';\nimport type { MkTone } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/**\n * Banner — a persistent, full-width page/section message with a tone, optional\n * title, an actions slot and optional dismiss. Heavier than an inline\n * {@link MkAlert} toast; use it for standing notices (\"Trial ends in 3 days\").\n *\n * Project an icon with `[mkBannerIcon]` and buttons with `[mkBannerActions]`.\n * Danger/warning banners announce assertively (`role=\"alert\"`).\n *\n * ```html\n * <mk-banner tone=\"warning\" title=\"Storage almost full\" dismissible>\n * You've used 90% of your quota.\n * <button mkButton size=\"sm\" mkBannerActions>Upgrade</button>\n * </mk-banner>\n * ```\n */\n@Component({\n selector: 'mk-banner',\n templateUrl: './banner.html',\n styleUrl: './banner.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-banner',\n '[attr.data-tone]': 'tone()',\n },\n})\nexport class MkBanner {\n /** Localised strings (override globally via `provideMkI18n`). */\n protected readonly i18n = inject(MK_I18N);\n /** Semantic color tone. */\n readonly tone = input<MkTone>('info');\n /** Optional bold title above the message. */\n readonly title = input<string>('');\n /** Show a dismiss (×) button. */\n readonly dismissible = input(false, { transform: booleanAttribute });\n /** Two-way open state; set false to hide. */\n readonly open = model(true);\n\n /** Emitted when the banner is dismissed. */\n readonly dismissed = output<void>();\n\n protected readonly role = computed(() => {\n const t = this.tone();\n return t === 'danger' || t === 'warning' ? 'alert' : 'status';\n });\n\n protected dismiss(): void {\n this.open.set(false);\n this.dismissed.emit();\n }\n}\n","@if (open()) {\n <div class=\"mk-banner__box\">\n <span class=\"mk-banner__icon\" aria-hidden=\"true\"\n ><ng-content select=\"[mkBannerIcon]\"\n /></span>\n <!-- The live region wraps only the title + message, keeping the actions\n and the dismiss button out of what gets announced. -->\n <div class=\"mk-banner__body\" [attr.role]=\"role()\">\n @if (title()) {\n <p class=\"mk-banner__title\">{{ title() }}</p>\n }\n <div class=\"mk-banner__message\"><ng-content /></div>\n </div>\n <div class=\"mk-banner__actions\"><ng-content select=\"[mkBannerActions]\" /></div>\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"mk-banner__close\"\n [attr.aria-label]=\"i18n.dismiss\"\n (click)=\"dismiss()\"\n >\n <span aria-hidden=\"true\">×</span>\n </button>\n }\n </div>\n}\n","import { Injectable, PLATFORM_ID, computed, inject, signal } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Drives a global {@link MkLoadingBar} — the thin top-of-page progress bar for\n * route changes and background work. `start()` shows it and trickles toward 90%;\n * `complete()` finishes and hides it. Also supports a determinate `set(value)`.\n *\n * ```ts\n * const bar = inject(MkLoadingBarService);\n * router.events.subscribe(e => {\n * if (e instanceof NavigationStart) bar.start();\n * if (e instanceof NavigationEnd) bar.complete();\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkLoadingBarService {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly _progress = signal(0);\n private readonly _active = signal(false);\n /** Current progress, 0–100. */\n readonly progress = this._progress.asReadonly();\n /** Whether the bar is visible. */\n readonly active = this._active.asReadonly();\n\n private timer?: ReturnType<typeof setInterval>;\n private doneTimer?: ReturnType<typeof setTimeout>;\n\n /** Show the bar and start trickling toward 90%. */\n start(): void {\n if (!this.isBrowser) return;\n this.clearTimers();\n this._active.set(true);\n this._progress.set(8);\n this.armTrickle();\n }\n\n /** Set an explicit determinate value (0–100). */\n set(value: number): void {\n this.clearTimers();\n this._active.set(true);\n this._progress.set(Math.max(0, Math.min(100, value)));\n }\n\n /** Nudge progress up by `amount` (default 5), capped at 90%. */\n inc(amount = 5): void {\n if (!this._active()) this.start();\n this._progress.set(Math.min(90, this._progress() + amount));\n // Re-arm the trickle if it stopped at the ceiling (or after a `set()`)\n // and there is still room to move.\n if (this._progress() < 90) this.armTrickle();\n }\n\n /** Finish (jump to 100%) then fade out. */\n complete(): void {\n if (!this.isBrowser) {\n this._active.set(false);\n return;\n }\n this.clearTimers();\n this._progress.set(100);\n this.doneTimer = setTimeout(() => {\n this._active.set(false);\n this._progress.set(0);\n }, 350);\n }\n\n /** Hide immediately without finishing. */\n stop(): void {\n this.clearTimers();\n this._active.set(false);\n this._progress.set(0);\n }\n\n /**\n * Auto-slowing trickle so the bar keeps moving without ever completing.\n * Stops its own interval at the 90% ceiling — otherwise a navigation that\n * never `complete()`s would leave a timer firing (and, in a zoneless app,\n * scheduling change detection) forever. `start()`/`inc()` re-arm it.\n */\n private trickle(): void {\n const p = this._progress();\n if (p >= 90) {\n this.stopTrickle();\n return;\n }\n const step = p < 20 ? 10 : p < 50 ? 4 : p < 80 ? 2 : 0.5;\n const next = Math.min(90, p + step);\n this._progress.set(next);\n if (next >= 90) this.stopTrickle();\n }\n\n /** Start the 350ms trickle interval unless it is already running. */\n private armTrickle(): void {\n if (!this.isBrowser || this.timer) return;\n this.timer = setInterval(() => this.trickle(), 350);\n }\n\n private stopTrickle(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n private clearTimers(): void {\n if (this.timer) clearInterval(this.timer);\n if (this.doneTimer) clearTimeout(this.doneTimer);\n this.timer = undefined;\n this.doneTimer = undefined;\n }\n\n /** True while finishing (progress full but not yet hidden). */\n readonly finishing = computed(() => this._active() && this._progress() >= 100);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkLoadingBarService } from './loading-bar.service';\n\n/**\n * LoadingBar — a thin progress bar fixed to the top of the viewport, driven by\n * {@link MkLoadingBarService}. Place it once (e.g. in the app shell) and call\n * `start()` / `complete()` on navigation or async work.\n *\n * ```html\n * <mk-loading-bar />\n * ```\n */\n@Component({\n selector: 'mk-loading-bar',\n template: `<div\n class=\"mk-loading-bar__fill\"\n [style.transform]=\"fillTransform()\"\n [style.background]=\"color()\"\n ></div>`,\n styleUrl: './loading-bar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-loading-bar',\n role: 'progressbar',\n 'aria-valuemin': '0',\n 'aria-valuemax': '100',\n '[attr.aria-valuenow]': 'active() ? progress() : null',\n '[attr.aria-hidden]': \"active() ? null : 'true'\",\n '[attr.aria-label]': 'i18n.loading',\n '[class.mk-loading-bar--active]': 'active()',\n '[style.height.px]': 'height()',\n },\n})\nexport class MkLoadingBar {\n private readonly service = inject(MkLoadingBarService);\n protected readonly i18n = inject(MK_I18N);\n\n /** Bar colour. */\n readonly color = input('var(--mk-primary)');\n /** Bar thickness in px. */\n readonly height = input(3, { transform: numberAttribute });\n\n protected readonly progress = this.service.progress;\n protected readonly active = computed(() => this.service.active());\n\n /**\n * The fill is a full-width bar scaled from the inline start — `transform`\n * animates on the compositor, so each trickle tick avoids the layout+paint\n * cost that animating `width` incurred. Origin flips for RTL in the styles.\n */\n protected readonly fillTransform = computed(\n () => `scaleX(${this.progress() / 100})`,\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InjectionToken,\n Injector,\n afterNextRender,\n computed,\n inject,\n viewChild,\n} from '@angular/core';\nimport type { MkPlacement } from '@mk-kit/ui/core';\nimport { mkGetFocusable } from '@mk-kit/ui/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkAnchoredPanel } from '@mk-kit/ui/core';\n\n/**\n * A single coach-mark step in a product tour. The `target` is the element the\n * step points at — either a live `HTMLElement` or a CSS selector resolved\n * against the document when the step is shown.\n */\nexport interface MkTourStep {\n /** Element (or selector) the popover anchors to and highlights. */\n target: string | HTMLElement;\n /** Optional heading shown above the body. */\n title?: string;\n /** The explanatory copy for this step. */\n body: string;\n /** Preferred placement of the popover relative to the target. */\n placement?: MkPlacement;\n}\n\n/** Navigation callbacks the popup invokes on the owning {@link MkTourService}. */\nexport interface MkTourController {\n next(): void;\n prev(): void;\n end(): void;\n}\n\n/** Per-step data injected into {@link MkTourPopup} via {@link MK_TOUR_DATA}. */\nexport interface MkTourData {\n /** The step being shown. */\n step: MkTourStep;\n /** Zero-based index of this step. */\n index: number;\n /** Total number of steps in the tour. */\n total: number;\n /** The resolved target element to anchor against. */\n anchor: HTMLElement;\n /** Navigation handle back to the service. */\n controller: MkTourController;\n}\n\n/** DI token carrying the current {@link MkTourData} to the popup. */\nexport const MK_TOUR_DATA = new InjectionToken<MkTourData>('MK_TOUR_DATA');\n\n/**\n * The floating coach-mark popover for one tour step. Rendered dynamically by\n * {@link MkTourService} (one instance per step) and anchored to the step's\n * target through {@link MkAnchoredPanel}, so it lives in the browser top layer\n * and is never clipped by an ancestor's `overflow`/`transform`.\n */\n@Component({\n selector: 'mk-tour-popup',\n templateUrl: './tour-popup.html',\n styleUrl: './tour-popup.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkAnchoredPanel],\n host: {\n class: 'mk-tour',\n },\n})\nexport class MkTourPopup {\n private readonly injector = inject(Injector);\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n protected readonly i18n = inject(MK_I18N);\n\n /** The step + navigation data for this popup. */\n protected readonly data = inject(MK_TOUR_DATA);\n\n /** Whether this is the final step (Next becomes \"Done\"). */\n protected readonly isLast = computed(\n () => this.data.index >= this.data.total - 1,\n );\n\n constructor() {\n afterNextRender(() => this.focusInitial(), { injector: this.injector });\n }\n\n protected next(): void {\n this.data.controller.next();\n }\n\n protected prev(): void {\n this.data.controller.prev();\n }\n\n protected skip(): void {\n this.data.controller.end();\n }\n\n protected onEscape(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.data.controller.end();\n }\n\n /**\n * Ignore anchored-panel dismisses (outside pointerdown / window blur): a tour\n * should stay put while the user reads it — it ends only via the buttons or\n * Escape.\n */\n protected onDismiss(): void {\n /* intentionally inert */\n }\n\n /**\n * Trap Tab inside the popup (the dialog is `aria-modal` over a scrim): wrap\n * from the last tabbable back to the first and vice versa, and pull focus in\n * if it somehow ended up outside.\n */\n protected onTab(event: Event): void {\n const e = event as KeyboardEvent;\n const panel = this.panelRef()?.nativeElement;\n if (!panel) return;\n\n const focusable = mkGetFocusable(panel);\n if (focusable.length === 0) {\n e.preventDefault();\n panel.focus();\n return;\n }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = panel.ownerDocument.activeElement;\n\n if (!panel.contains(active)) {\n e.preventDefault();\n first.focus();\n } else if (e.shiftKey && active === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n private focusInitial(): void {\n const panel = this.panelRef()?.nativeElement;\n if (!panel) return;\n (mkGetFocusable(panel)[0] ?? panel).focus();\n }\n}\n","<div\n #panel\n class=\"mk-tour__popup\"\n role=\"dialog\"\n aria-modal=\"true\"\n tabindex=\"-1\"\n [attr.aria-label]=\"data.step.title ?? data.step.body\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"data.anchor\"\n [placement]=\"data.step.placement ?? 'bottom'\"\n [gap]=\"12\"\n (dismiss)=\"onDismiss()\"\n (keydown.escape)=\"onEscape($event)\"\n (keydown.tab)=\"onTab($event)\"\n (keydown.shift.tab)=\"onTab($event)\"\n>\n @if (data.step.title; as title) {\n <h3 class=\"mk-tour__title\">{{ title }}</h3>\n }\n <p class=\"mk-tour__body\">{{ data.step.body }}</p>\n\n <div class=\"mk-tour__footer\">\n <span class=\"mk-tour__indicator\">\n {{ i18n.tourStepOf(data.index + 1, data.total) }}\n </span>\n <div class=\"mk-tour__actions\">\n <button type=\"button\" class=\"mk-tour__btn mk-tour__btn--ghost\" (click)=\"skip()\">\n {{ i18n.tourSkip }}\n </button>\n @if (data.index > 0) {\n <button type=\"button\" class=\"mk-tour__btn\" (click)=\"prev()\">\n {{ i18n.tourPrevious }}\n </button>\n }\n <button\n type=\"button\"\n class=\"mk-tour__btn mk-tour__btn--primary\"\n (click)=\"next()\"\n >\n {{ isLast() ? i18n.tourDone : i18n.tourNext }}\n </button>\n </div>\n </div>\n</div>\n","import {\n ApplicationRef,\n ComponentRef,\n DOCUMENT,\n DestroyRef,\n EnvironmentInjector,\n Injectable,\n Injector,\n PLATFORM_ID,\n computed,\n createComponent,\n inject,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { MK_OVERLAY_ROOT } from '@mk-kit/ui/core';\nimport {\n MK_TOUR_DATA,\n MkTourPopup,\n type MkTourData,\n type MkTourStep,\n} from './tour-popup';\n\n/** Inline styles overwritten on the highlighted target; restored on teardown. */\ninterface MkTargetSnapshot {\n el: HTMLElement;\n position: string;\n zIndex: string;\n boxShadow: string;\n borderRadius: string;\n transition: string;\n}\n\n/**\n * Product-onboarding tour service — walks the user through a sequence of\n * {@link MkTourStep}s. For each step it scrolls the target into view, dims the\n * page behind a scrim, highlights the target with a bright ring, and anchors a\n * coach-mark popover ({@link MkTourPopup}) to it in the browser top layer via\n * `MkAnchoredPanel`.\n *\n * ```ts\n * const tour = inject(MkTourService);\n * await tour.start([\n * { target: '#new-btn', title: 'Create', body: 'Start a project here.' },\n * { target: '#inbox', body: 'Your notifications land here.', placement: 'left' },\n * ]);\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkTourService {\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly overlayRoot = inject(MK_OVERLAY_ROOT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly _steps = signal<readonly MkTourStep[]>([]);\n private readonly _index = signal(-1);\n private readonly _running = signal(false);\n\n /** Zero-based index of the current step, or `-1` when no tour is running. */\n readonly index = this._index.asReadonly();\n /** Whether a tour is currently active. */\n readonly running = this._running.asReadonly();\n /** Total number of steps in the active tour. */\n readonly total = computed(() => this._steps().length);\n /** The current step, or `null`. */\n readonly currentStep = computed<MkTourStep | null>(() => {\n const i = this._index();\n return i >= 0 ? (this._steps()[i] ?? null) : null;\n });\n\n private popupRef?: ComponentRef<MkTourPopup>;\n private scrim?: HTMLElement;\n private snapshot?: MkTargetSnapshot;\n private endResolve?: () => void;\n private endPromise = Promise.resolve();\n /** Element focused before start(); focus is restored to it on end(). */\n private previouslyFocused: HTMLElement | null = null;\n\n constructor() {\n // If a tour is still active when the app (root injector) is torn down,\n // end it — otherwise the capture-phase document keydown listener, scrim\n // and popup DOM would outlive the application.\n inject(DestroyRef).onDestroy(() => this.end());\n }\n\n /**\n * Begin a tour at step 0. Returns a promise that resolves when the tour ends\n * (finished, skipped, or Escaped).\n */\n start(steps: MkTourStep[]): Promise<void> {\n if (!this.isBrowser || steps.length === 0) return Promise.resolve();\n // Restart cleanly if one is already running.\n if (this._running()) this.end();\n\n this.endPromise = new Promise<void>((resolve) => {\n this.endResolve = resolve;\n });\n this.previouslyFocused = this.document\n .activeElement as HTMLElement | null;\n this._steps.set([...steps]);\n this._running.set(true);\n this.document.addEventListener('keydown', this.onKeydown, true);\n this.ensureScrim();\n this.showStep(0, 1);\n return this.endPromise;\n }\n\n /** Resolves when the active (or next) tour ends. */\n afterEnd(): Promise<void> {\n return this.endPromise;\n }\n\n /** Advance to the next step, or finish on the last step. */\n next(): void {\n if (!this._running()) return;\n this.showStep(this._index() + 1, 1);\n }\n\n /** Return to the previous step (no-op at the first step). */\n prev(): void {\n if (!this._running() || this._index() <= 0) return;\n this.showStep(this._index() - 1, -1);\n }\n\n /** End the tour and clean up all DOM, highlight, and listeners. */\n end(): void {\n if (!this._running()) return;\n this._running.set(false);\n this.teardownStep();\n this.removeScrim();\n this.document.removeEventListener('keydown', this.onKeydown, true);\n this._index.set(-1);\n this._steps.set([]);\n // Return focus to wherever the user was before the tour started\n // (Done/Skip/Escape all funnel through here).\n this.previouslyFocused?.focus?.();\n this.previouslyFocused = null;\n const resolve = this.endResolve;\n this.endResolve = undefined;\n resolve?.();\n }\n\n private readonly onKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n this.end();\n }\n };\n\n /**\n * Render the step at `index`. Missing targets are skipped by continuing in\n * `dir` (+1 forward, -1 back); if none remain the tour ends.\n */\n private showStep(index: number, dir: 1 | -1): void {\n this.teardownStep();\n const steps = this._steps();\n\n let i = index;\n let target: HTMLElement | null = null;\n while (i >= 0 && i < steps.length) {\n target = this.resolveTarget(steps[i].target);\n if (target) break;\n i += dir;\n }\n if (!target || i < 0 || i >= steps.length) {\n this.end();\n return;\n }\n\n this._index.set(i);\n this.highlight(target);\n target.scrollIntoView?.({ block: 'center', inline: 'center', behavior: 'smooth' });\n\n const data: MkTourData = {\n step: steps[i],\n index: i,\n total: steps.length,\n anchor: target,\n controller: {\n next: () => this.next(),\n prev: () => this.prev(),\n end: () => this.end(),\n },\n };\n\n const ref = createComponent(MkTourPopup, {\n environmentInjector: this.envInjector,\n elementInjector: Injector.create({\n parent: this.envInjector,\n providers: [{ provide: MK_TOUR_DATA, useValue: data }],\n }),\n });\n this.appRef.attachView(ref.hostView);\n this.overlayRoot().appendChild(ref.location.nativeElement);\n this.popupRef = ref;\n }\n\n /** Destroy the current popup and restore the current target's styles. */\n private teardownStep(): void {\n if (this.popupRef) {\n // At app teardown the ApplicationRef destroys (and detaches) its views\n // before injector destroy hooks run — don't touch it then.\n if (!this.appRef.destroyed) this.appRef.detachView(this.popupRef.hostView);\n this.popupRef.destroy();\n this.popupRef.location.nativeElement.remove();\n this.popupRef = undefined;\n }\n this.unhighlight();\n }\n\n private resolveTarget(target: string | HTMLElement): HTMLElement | null {\n if (typeof target !== 'string') {\n return target.isConnected ? target : null;\n }\n return this.document.querySelector<HTMLElement>(target);\n }\n\n /** Raise the target above the scrim and draw a bright ring around it. */\n private highlight(el: HTMLElement): void {\n const style = el.style;\n this.snapshot = {\n el,\n position: style.position,\n zIndex: style.zIndex,\n boxShadow: style.boxShadow,\n borderRadius: style.borderRadius,\n transition: style.transition,\n };\n el.classList.add('mk-tour-target');\n if (getComputedStyle(el).position === 'static') {\n style.position = 'relative';\n }\n style.setProperty('z-index', 'calc(var(--mk-z-overlay, 1000) + 1)');\n style.boxShadow =\n '0 0 0 3px var(--mk-primary), 0 0 0 6px var(--mk-primary-contrast)';\n if (!style.borderRadius) style.borderRadius = 'var(--mk-radius-md)';\n style.transition = 'box-shadow var(--mk-duration-fast, 140ms) ease';\n }\n\n private unhighlight(): void {\n const snap = this.snapshot;\n if (!snap) return;\n const { el } = snap;\n el.classList.remove('mk-tour-target');\n el.style.position = snap.position;\n el.style.zIndex = snap.zIndex;\n el.style.boxShadow = snap.boxShadow;\n el.style.borderRadius = snap.borderRadius;\n el.style.transition = snap.transition;\n this.snapshot = undefined;\n }\n\n private ensureScrim(): void {\n if (this.scrim) return;\n const scrim = this.document.createElement('div');\n scrim.className = 'mk-tour-scrim';\n scrim.style.cssText =\n 'position:fixed;inset:0;background:var(--mk-overlay-scrim,rgba(0,0,0,0.45));animation:mk-overlay-fade var(--mk-duration-fast,140ms) var(--mk-ease-out,ease);';\n scrim.style.setProperty('z-index', 'var(--mk-z-overlay, 1000)');\n this.overlayRoot().appendChild(scrim);\n this.scrim = scrim;\n }\n\n private removeScrim(): void {\n this.scrim?.remove();\n this.scrim = undefined;\n }\n}\n","import {\n ApplicationRef,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Directive,\n DOCUMENT,\n ElementRef,\n EnvironmentInjector,\n Injectable,\n booleanAttribute,\n createComponent,\n effect,\n inject,\n input,\n numberAttribute,\n signal,\n type ComponentRef,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkSpinner } from '@mk-kit/ui/data';\n\n/**\n * The translucent panel with a spinner that `mkBlockUi` and\n * `MkBlockUiService` drop over a region or the page.\n */\n@Component({\n selector: 'mk-block-ui-overlay',\n template: `\n <div class=\"mk-block-ui__panel\">\n <mk-spinner [label]=\"message() || i18n.loading\" />\n @if (message()) {\n <span class=\"mk-block-ui__message\">{{ message() }}</span>\n }\n </div>\n `,\n styles: `\n :host {\n position: absolute;\n inset: 0;\n z-index: var(--mk-z-sticky, 10);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mk-block-ui-scrim, color-mix(in srgb, var(--mk-surface) 70%, transparent));\n backdrop-filter: blur(1px);\n border-radius: inherit;\n cursor: progress;\n animation: mk-block-ui-in var(--mk-duration-fast) var(--mk-ease-standard);\n }\n :host(.mk-block-ui--page) {\n position: fixed;\n z-index: var(--mk-z-overlay, 1000);\n border-radius: 0;\n }\n .mk-block-ui__panel {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--mk-space-3);\n padding: var(--mk-space-4) var(--mk-space-5);\n border-radius: var(--mk-radius-lg);\n background: var(--mk-surface);\n box-shadow: var(--mk-shadow-md);\n color: var(--mk-text);\n font-size: var(--mk-font-size-sm);\n }\n @keyframes mk-block-ui-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @media (prefers-reduced-motion: reduce) {\n :host { animation: none; backdrop-filter: none; }\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkSpinner],\n host: { class: 'mk-block-ui', role: 'status', 'aria-live': 'polite' },\n})\nexport class MkBlockUiOverlay {\n protected readonly i18n = inject(MK_I18N);\n readonly message = signal('');\n}\n\n/** Mount an overlay into `host`, making the host a positioning context if it has none. */\nfunction mountOverlay(\n document: Document,\n injector: EnvironmentInjector,\n appRef: ApplicationRef,\n host: HTMLElement,\n message: string,\n page: boolean,\n): { ref: ComponentRef<MkBlockUiOverlay>; dispose: () => void } {\n const ref = createComponent(MkBlockUiOverlay, { environmentInjector: injector });\n const el = ref.location.nativeElement as HTMLElement;\n if (page) el.classList.add('mk-block-ui--page');\n ref.instance.message.set(message);\n const view = document.defaultView;\n const current = view?.getComputedStyle(host).position ?? '';\n const positioned = !page && current !== '' && current !== 'static';\n const addedPosition = !page && !positioned;\n if (addedPosition) host.style.position = 'relative';\n // Everything already inside becomes inert: no clicks, no Tab stops, no\n // screen-reader traversal — only the status overlay is reachable.\n const inerted: Element[] = [];\n for (const child of Array.from(host.children)) {\n if (!child.hasAttribute('inert')) {\n child.setAttribute('inert', '');\n inerted.push(child);\n }\n }\n host.appendChild(el);\n host.setAttribute('aria-busy', 'true');\n // Attach so later `message` updates render with the app's change detection.\n appRef.attachView(ref.hostView);\n ref.changeDetectorRef.detectChanges();\n return {\n ref,\n dispose: () => {\n appRef.detachView(ref.hostView);\n ref.destroy();\n el.remove();\n for (const child of inerted) child.removeAttribute('inert');\n host.removeAttribute('aria-busy');\n if (addedPosition) host.style.position = '';\n },\n };\n}\n\n/**\n * Block UI — cover the host element with a translucent panel and spinner\n * while something loads, so its contents can neither be read nor operated:\n * a card refreshing, a form submitting, a table re-fetching.\n *\n * Children get `inert` (no clicks, no Tab stops) and the host `aria-busy`.\n * `mkBlockUiDelay` (ms) holds the overlay back for quick operations so the\n * screen does not flash.\n *\n * ```html\n * <mk-card [mkBlockUi]=\"saving()\" mkBlockUiMessage=\"Saving…\">…</mk-card>\n * <form [mkBlockUi]=\"submitting()\" [mkBlockUiDelay]=\"300\">…</form>\n * ```\n */\n@Directive({\n selector: '[mkBlockUi]',\n host: { '[class.mk-block-ui-host]': 'mkBlockUi()' },\n})\nexport class MkBlockUi {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly injector = inject(EnvironmentInjector);\n private readonly appRef = inject(ApplicationRef);\n\n /** Block while `true`. */\n readonly mkBlockUi = input(false, { transform: booleanAttribute });\n /** Text under the spinner (also its accessible label). */\n readonly mkBlockUiMessage = input('');\n /** Wait this many ms before showing, to avoid a flash on fast operations. */\n readonly mkBlockUiDelay = input(0, { transform: numberAttribute });\n\n private mounted: ReturnType<typeof mountOverlay> | null = null;\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n effect(() => {\n const on = this.mkBlockUi();\n const message = this.mkBlockUiMessage();\n const delay = this.mkBlockUiDelay();\n this.cancelTimer();\n if (!on) {\n this.unmount();\n return;\n }\n if (this.mounted) {\n this.mounted.ref.instance.message.set(message);\n return;\n }\n if (delay > 0) this.timer = setTimeout(() => this.mount(message), delay);\n else this.mount(message);\n });\n inject(DestroyRef).onDestroy(() => {\n this.cancelTimer();\n this.unmount();\n });\n }\n\n private mount(message: string): void {\n this.timer = null;\n this.mounted = mountOverlay(this.document, this.injector, this.appRef, this.host.nativeElement, message, false);\n }\n\n private unmount(): void {\n this.mounted?.dispose();\n this.mounted = null;\n }\n\n private cancelTimer(): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n }\n}\n\n/**\n * Block the whole page. Reference-counted: every `block()` returns a release\n * function, and the overlay disappears once all of them have been called.\n *\n * ```ts\n * const release = this.blockUi.block('Exporting…');\n * try { await this.api.export(); } finally { release(); }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkBlockUiService {\n private readonly document = inject(DOCUMENT);\n private readonly injector = inject(EnvironmentInjector);\n private readonly appRef = inject(ApplicationRef);\n private mounted: ReturnType<typeof mountOverlay> | null = null;\n private readonly _count = signal(0);\n\n /** Number of active blocks. */\n readonly count = this._count.asReadonly();\n\n /** Show the page overlay (or update its message); call the returned function to release. */\n block(message = ''): () => void {\n if (typeof this.document.body === 'undefined') return () => {};\n this._count.update((n) => n + 1);\n if (this.mounted) this.mounted.ref.instance.message.set(message);\n else this.mounted = mountOverlay(this.document, this.injector, this.appRef, this.document.body, message, true);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this._count.update((n) => Math.max(0, n - 1));\n if (this._count() === 0) {\n this.mounted?.dispose();\n this.mounted = null;\n }\n };\n }\n\n /** True while the page is blocked. */\n isBlocked(): boolean {\n return this._count() > 0;\n }\n}\n","/**\n * Feedback & Overlay component group barrel.\n * Re-exports every public symbol (components, directives, services, types).\n */\nexport * from './alert';\nexport * from './tooltip';\nexport * from './popover';\nexport * from './result';\nexport * from './hovercard';\nexport * from './notification-center';\nexport * from './dialog';\nexport * from './toast';\nexport * from './snackbar';\nexport * from './bottom-sheet';\nexport * from './banner';\nexport * from './loading-bar';\nexport * from './tour';\nexport * from './block-ui';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["DEFAULT_DURATION","nextId"],"mappings":";;;;;;;;AAiBA;;;;;;;;;;;;;;AAcG;MAeU,OAAO,CAAA;;AAEC,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;IAEhC,IAAI,GAAG,KAAK,CAAc,MAAM;6EAAC;;IAEjC,OAAO,GAAG,KAAK,CAAiB,MAAM;gFAAC;;AAEvC,IAAA,KAAK,GAAG,KAAK;yFAAU;;IAEvB,WAAW,GAAG,KAAK,CAAC,KAAK,mFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG3D,SAAS,GAAG,MAAM,EAAQ;;IAGhB,IAAI,GAAG,QAAQ,CAAC,MACjC,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,GAAG,OAAO,GAAG,QAAQ;6EAC3E;IAES,SAAS,GAAA;AACjB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;uGAtBW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,22BC9CpB,8vBA6BA,EAAA,MAAA,EAAA,CAAA,mjGAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDiBa,OAAO,EAAA,UAAA,EAAA,CAAA;kBAdnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,eAAA,EAGH,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,UAAU;AACjB,wBAAA,kBAAkB,EAAE,QAAQ;AAC5B,wBAAA,wBAAwB,EAAE,sBAAsB;AAChD,wBAAA,yBAAyB,EAAE,uBAAuB;AAClD,wBAAA,2BAA2B,EAAE,yBAAyB;AACtD,wBAAA,aAAa,EAAE,QAAQ;AACxB,qBAAA,EAAA,QAAA,EAAA,8vBAAA,EAAA,MAAA,EAAA,CAAA,mjGAAA,CAAA,EAAA;;;AEvBH;AACA,MAAM,UAAU,GAAG,GAAG;AAEtB;;;;AAIG;AACH,MAAM,WAAW,GAAG,GAAG;AAEvB;;;AAGG;MAcU,cAAc,CAAA;;IAEhB,IAAI,GAAG,KAAK,CAAC,EAAE;6EAAC;;AAEhB,IAAA,EAAE,GAAG,KAAK;sFAAU;;IAEpB,SAAS,GAAG,KAAK,CAAc,KAAK;kFAAC;;IAErC,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;uGARrD,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,svBChD3B,gBACA,EAAA,MAAA,EAAA,CAAA,ovBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FD+Ca,cAAc,EAAA,UAAA,EAAA,CAAA;kBAb1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,eAAA,EAGL,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,YAAY;AACnB,wBAAA,IAAI,EAAE,SAAS;AACf,wBAAA,WAAW,EAAE,MAAM;AACnB,wBAAA,uBAAuB,EAAE,aAAa;AACtC,wBAAA,6BAA6B,EAAE,WAAW;AAC3C,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,ovBAAA,CAAA,EAAA;;AAaH;;;;;;;;;;;;;AAaG;MAkBU,SAAS,CAAA;AACH,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;AAClD,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACzC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC;IACrC,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;IAE3D,iBAAiB,GAAG,KAAK;;IAGxB,SAAS,GAAG,KAAK,CAAC,EAAE;kFAAC;;IAErB,kBAAkB,GAAG,KAAK,CAAc,KAAK;2FAAC;AAEtC,IAAA,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC;AAC7C,IAAA,GAAG;AACH,IAAA,SAAS;AACT,IAAA,SAAS;IACT,mBAAmB,GAAkB,IAAI;AAEjD;;;;AAIG;IACc,YAAY,GAAG,MAAW;AACzC,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC9B,IAAA,CAAC;IACgB,YAAY,GAAG,MAAW;QACzC,IAAI,CAAC,YAAY,EAAE;AACrB,IAAA,CAAC;AAED;;;;AAIG;AACc,IAAA,iBAAiB,GAAG,CAAC,KAAoB,KAAU;QAClE,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;QACzC,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,IAAI,EAAE;AACb,IAAA,CAAC;IAES,cAAc,GAAA;;AAEtB,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;IAC/B;IAEU,cAAc,GAAA;AACtB,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE;IACrB;IAEQ,YAAY,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;AACf,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC;IAC7D;IAEU,OAAO,GAAA;;;AAGf,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;YAC9B;QACF;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACtB;AAEU,IAAA,aAAa,CAAC,KAAmB,EAAA;AACzC,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;;;;;QAK7B,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AAC9C,YAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YACpB;QACF;QACA,IAAI,CAAC,IAAI,EAAE;IACb;AAEA;;;;;AAKG;AACc,IAAA,qBAAqB,GAAG,CAAC,KAAY,KAAU;AAC9D,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,aAAwC;AACzE,QAAA,IAAI,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;YAAE;QAC7B,IAAI,CAAC,IAAI,EAAE;AACb,IAAA,CAAC;AAEO,IAAA,YAAY,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG;YAAE;AAC7D,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,IAAI,CAAC,IAAI,EAAE;QACb;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC;QACvD;IACF;IAEU,IAAI,GAAA;AACZ,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,QAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE;AAEf,QAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC;AAC1E,QAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAC/B,aAAa,EACb,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CACL;;AAGD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;AAClC,QAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,IAAI,EAAE;AACrC,YAAA,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC;QACxC;aAAO;YACL,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC,mBAAmB,CAAC;QAC/D;AACA,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,aAE/B;AACD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,UAAU,EAAE;AACzE,YAAA,IAAI;gBACF,KAAK,CAAC,WAAW,EAAE;YACrB;AAAE,YAAA,MAAM;;YAER;QACF;QAEA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AACzC,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;AAClB,QAAA,IAAI,CAAC,GAAG,GAAG,SAAS;IACtB;IAEQ,IAAI,GAAA;QACV,IAAI,IAAI,CAAC,GAAG;YAAE;AAEd,QAAA,MAAM,GAAG,GAAG,eAAe,CAAC,cAAc,EAAE;YAC1C,mBAAmB,EAAE,IAAI,CAAC,WAAW;AACtC,SAAA,CAAC;QACF,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;QAClC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AAEpC,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,aAA4B;QACvD,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC;AACrC,QAAA,IAAI,CAAC,GAAG,GAAG,GAAG;;QAGd,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC;QACvD,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC;;;;;AAKvD,QAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC;;;AAGvE,QAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAC5B,aAAa,EACb,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CACL;;;QAID,MAAM,WAAW,GAAG,KAAmD;AACvE,QAAA,IAAI,OAAO,WAAW,CAAC,WAAW,KAAK,UAAU,EAAE;AACjD,YAAA,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC;AACvC,YAAA,IAAI;gBACF,WAAW,CAAC,WAAW,EAAE;YAC3B;AAAE,YAAA,MAAM;;YAER;QACF;;AAGA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;QACvC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC;AACnE,QAAA,OAAO,CAAC,YAAY,CAClB,kBAAkB,EAClB,IAAI,CAAC;cACD,GAAG,IAAI,CAAC,mBAAmB,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,CAAA;AAC/C,cAAE,IAAI,CAAC,SAAS,CACnB;AAED,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;;QAEpB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC,MAAK;YACpD,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;AACrC,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,QAAQ,CAAC,KAAkB,EAAA;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAC5D,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,qBAAqB,EAAE;AACzC,QAAA,MAAM,GAAG,GAAG,yBAAyB,CACnC,IAAI,EACJ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EACxC;AACE,YAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW;AAChD,YAAA,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY;AACnD,SAAA;;;AAGD,QAAA;AACE,YAAA,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE;AACpC,YAAA,GAAG,EAAE,CAAC;AACN,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,GAAG,EACD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa;AAChE,iBAAA,SAAS,KAAK,KAAK;AACzB,SAAA,CACF;AACD,QAAA,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AAC9B,QAAA,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;AACxB,QAAA,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;QAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAA,EAAA,CAAI;QAChC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,CAAA,EAAA,CAAI;IACpC;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,IAAI,EAAE;IACb;uGA5OW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAT,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,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,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBAjBrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,IAAI,EAAE;AACJ,wBAAA,cAAc,EAAE,kBAAkB;AAClC,wBAAA,cAAc,EAAE,kBAAkB;AAClC,wBAAA,WAAW,EAAE,WAAW;AACxB,wBAAA,YAAY,EAAE,QAAQ;AACtB,wBAAA,kBAAkB,EAAE,QAAQ;;;;;;;AAO5B,wBAAA,eAAe,EAAE,uBAAuB;AACzC,qBAAA;AACF,iBAAA;;;AErED;;;;;;;;;;;;;;;;;AAiBG;MAYU,SAAS,CAAA;AACH,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3B,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClD,QAAQ,GAAG,SAAS,CAA0B,OAAO;iFAAC;;AAG9D,IAAA,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC;;IAGlC,SAAS,GAAG,KAAK,CAAc,QAAQ;kFAAC;;AAExC,IAAA,SAAS,GAAG,KAAK;6FAAU;;IAE3B,SAAS,GAAG,KAAK,CAAC,IAAI,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGxD,MAAM,GAAG,MAAM,EAAQ;IAEf,KAAK,GAAG,MAAM,CAAC,KAAK;8EAAC;;AAE7B,IAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;IAEtB,QAAQ,GAAG,MAAM,CAA0B,SAAS;iFAAC;IAChE,SAAS,GAAuB,IAAI;;AAG5C,IAAA,IAAI,CAAC,OAAoB,EAAA;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE;YAAE;AACrC,QAAA,IAAI,CAAC,SAAS,GAAG,OAAO;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,eAAe,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzE;IACF;;IAGA,KAAK,CAAC,YAAY,GAAG,IAAI,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YAAE;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,YAAY;YAAE,OAAO,EAAE,KAAK,EAAE;AAClC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;;AAGA,IAAA,MAAM,CAAC,OAAoB,EAAA;QACzB,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACtD;IAEQ,YAAY,GAAA;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AAC5C,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,KAAK,EAAE;IAC7C;AAEU,IAAA,QAAQ,CAAC,KAAY,EAAA;QAC7B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAClB;AAEU,IAAA,eAAe,CAAC,KAAiB,EAAA;AACzC,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,aAA4B;;;AAGlD,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AAC5C,QAAA,IAAI,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC;YAAE;;AAEnE,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IACnB;uGAzEW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAT,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,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,WAAA,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,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,YAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjDtB,6bAmBA,EAAA,MAAA,EAAA,CAAA,6rBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDyBY,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKd,SAAS,EAAA,UAAA,EAAA,CAAA;kBAXrB,SAAS;+BACE,YAAY,EAAA,QAAA,EACZ,WAAW,EAAA,eAAA,EAGJ,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,eAAe,CAAC,EAAA,IAAA,EACpB;AACJ,wBAAA,KAAK,EAAE,YAAY;AACpB,qBAAA,EAAA,QAAA,EAAA,6bAAA,EAAA,MAAA,EAAA,CAAA,6rBAAA,CAAA,EAAA;sEAK8D,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,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,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,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEjDxE;;;;;;;;;AASG;MAYU,gBAAgB,CAAA;AACV,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;;IAG1D,OAAO,GAAG,KAAK,CAAC,QAAQ,8EAAc,KAAK,EAAE,qBAAqB,EAAA,CAAG;AAEpE,IAAA,OAAO,CAAC,KAAY,EAAA;QAC5B,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IAChD;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YACrD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B;IACF;uGAhBW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAX5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,IAAI,EAAE;AACJ,wBAAA,eAAe,EAAE,QAAQ;AACzB,wBAAA,sBAAsB,EAAE,oBAAoB;AAC5C,wBAAA,sBAAsB,EAAE,mBAAmB;AAC3C,wBAAA,SAAS,EAAE,iBAAiB;AAC5B,wBAAA,WAAW,EAAE,mBAAmB;AACjC,qBAAA;AACF,iBAAA;;;ACVD;;;;;;;;;;AAUG;MAYU,YAAY,CAAA;IACN,OAAO,GAAG,SAAS,CAAC,SAAS;gFAAC;AAC5B,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;AAGhC,IAAA,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc;gFAAC;;AAEzC,IAAA,KAAK,GAAG,KAAK;yFAAU;;AAEvB,IAAA,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;oFAAC;;AAEtC,IAAA,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;mFAAC;;IAEpC,IAAI,GAAG,KAAK,CAAS,QAAQ;6EAAC;;IAE9B,SAAS,GAAG,KAAK,CAAc,KAAK;kFAAC;;IAGrC,OAAO,GAAG,MAAM,EAAQ;;IAExB,MAAM,GAAG,MAAM,EAAQ;;AAGhC,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,IAAI,IAAI;IACxC;;IAGA,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,KAAK;IAC1C;;AAGA,IAAA,IAAI,CAAC,OAAoB,EAAA;QACvB,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC;IAC/B;;AAGA,IAAA,MAAM,CAAC,OAAoB,EAAA;QACzB,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC;IACjC;;IAGA,KAAK,GAAA;QACH,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC;IAC7B;;IAGQ,SAAS,GAAG,KAAK;IAEf,SAAS,GAAA;AACjB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACnB,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC;IAC7B;IAEU,QAAQ,GAAA;;QAEhB,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC;IAC7B;;IAGU,eAAe,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;YACtB;QACF;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;uGApEW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,49BACc,SAAS,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpChD,gpBAoBA,EAAA,MAAA,EAAA,CAAA,ggBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDUY,SAAS,sJAAE,QAAQ,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKlB,YAAY,EAAA,UAAA,EAAA,CAAA;kBAXxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,QAAA,EACf,cAAc,EAAA,eAAA,EAGP,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAA,IAAA,EACxB;AACJ,wBAAA,KAAK,EAAE,eAAe;AACvB,qBAAA,EAAA,QAAA,EAAA,gpBAAA,EAAA,MAAA,EAAA,CAAA,ggBAAA,CAAA,EAAA;yFAGoC,SAAS,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,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,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,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,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,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,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,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEjChD;;;;;;;;;AASG;MAYU,mBAAmB,CAAA;AACb,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;;IAG1D,UAAU,GAAG,KAAK,CAAC,QAAQ,iFAClC,KAAK,EAAE,iBAAiB,EAAA,CACxB;AAEQ,IAAA,OAAO,CAAC,KAAY,EAAA;QAC5B,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IACnD;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE;YACxD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE;QAC3B;IACF;uGAlBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAX/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,IAAI,EAAE;AACJ,wBAAA,eAAe,EAAE,QAAQ;AACzB,wBAAA,sBAAsB,EAAE,uBAAuB;AAC/C,wBAAA,sBAAsB,EAAE,sBAAsB;AAC9C,wBAAA,SAAS,EAAE,iBAAiB;AAC5B,wBAAA,WAAW,EAAE,mBAAmB;AACjC,qBAAA;AACF,iBAAA;;;ACAD;;;;;;;;;;;;;;;;AAgBG;MAaU,QAAQ,CAAA;;IAEV,MAAM,GAAG,KAAK,CAAiB,MAAM;+EAAC;;IAEtC,WAAW,GAAG,KAAK,CAAS,EAAE;oFAAC;;IAE/B,QAAQ,GAAG,KAAK,CAAS,EAAE;iFAAC;;AAGlB,IAAA,QAAQ,GAAG,QAAQ,CAAsB,MAAK;AAC/D,QAAA,QAAQ,IAAI,CAAC,MAAM,EAAE;AACnB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,GAAG;AACZ,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,QAAQ;AACjB,YAAA;AACE,gBAAA,OAAO,MAAM;;IAEnB,CAAC;iFAAC;;AAGiB,IAAA,IAAI,GAAG,QAAQ,CAAe,MAAK;AACpD,QAAA,QAAQ,IAAI,CAAC,MAAM,EAAE;AACnB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,SAAS;AAClB,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,SAAS;AAClB,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,OAAO;AAChB,YAAA;AACE,gBAAA,OAAO,MAAM;;IAEnB,CAAC;6EAAC;uGA1CS,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,4mBCpDrB,mlFA6DA,EAAA,MAAA,EAAA,CAAA,i4CAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDTa,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAZpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,eAAA,EAGJ,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,WAAW;AAClB,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,oBAAoB,EAAE,UAAU;AAChC,wBAAA,kBAAkB,EAAE,QAAQ;AAC7B,qBAAA,EAAA,QAAA,EAAA,mlFAAA,EAAA,MAAA,EAAA,CAAA,i4CAAA,CAAA,EAAA;;;AEhCH;;;;;;;;;;;;;;;;;;AAkBG;MAYU,WAAW,CAAA;AACL,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3B,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;AAG1D,IAAA,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC;;IAGpC,SAAS,GAAG,KAAK,CAAc,cAAc;kFAAC;;AAE9C,IAAA,SAAS,GAAG,KAAK;6FAAU;;IAE3B,SAAS,GAAG,KAAK,CAAC,GAAG,iFAAI,SAAS,EAAE,eAAe,EAAA,CAAG;;IAEtD,UAAU,GAAG,KAAK,CAAC,GAAG,kFAAI,SAAS,EAAE,eAAe,EAAA,CAAG;;IAEvD,aAAa,GAAG,KAAK,CAAC,IAAI,qFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG5D,MAAM,GAAG,MAAM,EAAQ;IAEf,KAAK,GAAG,MAAM,CAAC,KAAK;8EAAC;;AAE7B,IAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;IAEtB,QAAQ,GAAG,MAAM,CAA0B,SAAS;iFAAC;IAChE,SAAS,GAAuB,IAAI;IAEpC,SAAS,GAAkB,IAAI;IAC/B,UAAU,GAAkB,IAAI;;AAGxC,IAAA,YAAY,CAAC,OAAoB,EAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QACrB,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;;AAEhB,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO;AACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;YAC1B;QACF;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;YAAE;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAK;AAClC,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACpB,QAAA,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACtB;;IAGA,aAAa,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QACrB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAK;AACnC,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;YACtB,IAAI,CAAC,KAAK,EAAE;AACd,QAAA,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACvB;AAEA;;;AAGG;IACH,QAAQ,GAAA;QACN,IAAI,CAAC,eAAe,EAAE;IACxB;;AAGA,IAAA,IAAI,CAAC,OAAoB,EAAA;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE;YAAE;QACrC,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,OAAO;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB;;IAGA,KAAK,GAAA;QACH,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YAAE;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;AAC5B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEU,WAAW,GAAA;QACnB,IAAI,CAAC,QAAQ,EAAE;IACjB;IAEU,WAAW,GAAA;QACnB,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA;;;;;AAKG;AACO,IAAA,cAAc,CAAC,KAAiB,EAAA;AACxC,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,aAA4B;AAClD,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,aAAmC;AACvD,QAAA,IAAI,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC;YAAE;QACnE,IAAI,CAAC,aAAa,EAAE;IACtB;AAEU,IAAA,QAAQ,CAAC,KAAY,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YAAE;QAC3B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;;;;AAIvB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS;QAC9B,IAAI,CAAC,KAAK,EAAE;QACZ,OAAO,EAAE,KAAK,EAAE;IAClB;IAEQ,QAAQ,CAAC,EAAc,EAAE,KAAa,EAAA;AAC5C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW;AACtC,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,IAAI;IACjD;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;YAC3B,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AACvD,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;IACF;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE;YAC5B,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AACxD,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACxB;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,eAAe,EAAE;IACxB;uGA/IW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,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,WAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChDxB,kiBAsBA,EAAA,MAAA,EAAA,CAAA,ysBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDqBY,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKd,WAAW,EAAA,UAAA,EAAA,CAAA;kBAXvB,SAAS;+BACE,cAAc,EAAA,QAAA,EACd,aAAa,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,eAAe,CAAC,EAAA,IAAA,EACpB;AACJ,wBAAA,KAAK,EAAE,cAAc;AACtB,qBAAA,EAAA,QAAA,EAAA,kiBAAA,EAAA,MAAA,EAAA,CAAA,ysBAAA,CAAA,EAAA;;;AE3CH;;;;AAIG;AACH,MAAM,uBAAuB,GAAG,GAAG;AAEnC;;;;;;;;;;;;;;;;AAgBG;MAgBU,kBAAkB,CAAA;AACZ,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;;AAE3D,IAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB;;IAGzC,SAAS,GAAG,KAAK,CAAC,QAAQ,gFAAgB,KAAK,EAAE,gBAAgB,EAAA,CAAG;IAEnE,OAAO,GAAA;QACf,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,GAAG,uBAAuB;YAAE;AACjE,QAAA,IAAI,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IACxD;AAEA;;;;;;AAMG;AACO,IAAA,aAAa,CAAC,KAAmB,EAAA;AACzC,QAAA,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO;YAAE;AACnC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,KAAK,EAAE;QACd;aAAO;;YAEL,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QACpC;IACF;IAEU,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE;IAClC;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACvD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE;QAC1B;IACF;uGAzCW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,MAAA,EAAA,WAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAf9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,IAAI,EAAE;AACJ,wBAAA,eAAe,EAAE,QAAQ;AACzB,wBAAA,sBAAsB,EAAE,sBAAsB;AAC9C,wBAAA,sBAAsB,EAAE,qBAAqB;AAC7C,wBAAA,cAAc,EAAE,WAAW;AAC3B,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,cAAc,EAAE,WAAW;AAC3B,wBAAA,QAAQ,EAAE,WAAW;AACrB,wBAAA,eAAe,EAAE,uBAAuB;AACxC,wBAAA,WAAW,EAAE,mBAAmB;AACjC,qBAAA;AACF,iBAAA;;;ACHD;;;;;;;;;;;;;;;;AAgBG;MAWU,oBAAoB,CAAA;AACd,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3B,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClD,QAAQ,GAAG,SAAS,CAA0B,OAAO;iFAAC;IACtD,UAAU,GACzB,SAAS,CAAgC,SAAS;mFAAC;AAClC,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;AAGhC,IAAA,OAAO,GAAG,UAAU,CAAC,wBAAwB,CAAC;;AAE9C,IAAA,OAAO,GAAG,UAAU,CAAC,8BAA8B,CAAC;;IAGpD,aAAa,GAAG,KAAK,CAAmB,EAAE;sFAAC;;AAE3C,IAAA,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB;mFAAC;;AAEhD,IAAA,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW;kFAAC;;IAExC,SAAS,GAAG,KAAK,CAAC,OAAO;kFAAC;;IAG1B,SAAS,GAAG,MAAM,EAAkB;;IAEpC,IAAI,GAAG,MAAM,EAAkB;;IAE/B,aAAa,GAAG,MAAM,EAAQ;IAEtB,KAAK,GAAG,MAAM,CAAC,KAAK;8EAAC;;AAE7B,IAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;;IAG9B,WAAW,GAAG,QAAQ,CAC7B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM;oFACzD;;AAGkB,IAAA,YAAY,GAAG,QAAQ,CAAC,MACzC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;qFAClD;;AAGkB,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AAC3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE;AAC5B,QAAA,OAAO,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAA,EAAG,CAAC,EAAE;IAChC,CAAC;kFAAC;;IAGF,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;IAChD;;IAGA,SAAS,GAAA;QACP,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE;YAAE;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,eAAe,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzE;;IAGA,KAAK,CAAC,YAAY,GAAG,IAAI,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YAAE;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,YAAY;YAAE,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IAC5D;;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;YAAE;AAC9B,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,KAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CACrD;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;IAC3B;;AAGU,IAAA,UAAU,CAAC,IAAoB,EAAA;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;AAEQ,IAAA,QAAQ,CAAC,IAAoB,EAAA;AACnC,QAAA,IAAI,OAAmC;AACvC,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,KAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACb,YAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI;AAAE,gBAAA,OAAO,CAAC;YAClC,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;AAC9B,YAAA,OAAO,OAAO;QAChB,CAAC,CAAC,CACH;AACD,QAAA,IAAI,OAAO;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACtC;AAEU,IAAA,QAAQ,CAAC,KAAY,EAAA;QAC7B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAClB;AAEU,IAAA,eAAe,CAAC,KAAiB,EAAA;AACzC,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,aAA4B;AAClD,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa;AAChD,QAAA,IAAI,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC;YAAE;AAC5D,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IACnB;IAEQ,YAAY,GAAA;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AAC5C,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,KAAK,EAAE;IAC7C;uGAlHW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjEjC,2kGA2GA,EAAA,MAAA,EAAA,CAAA,i4HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/CY,eAAe,oOAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAK7C,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAVhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,eAAA,EAGjB,uBAAuB,CAAC,MAAM,WACtC,CAAC,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAA,IAAA,EACnD;AACJ,wBAAA,KAAK,EAAE,wBAAwB;AAChC,qBAAA,EAAA,QAAA,EAAA,2kGAAA,EAAA,MAAA,EAAA,CAAA,i4HAAA,CAAA,EAAA;AAK8D,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,OAAO,oEAE3B,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,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,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,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEtDtD;;;;;;;;;;AAUG;MAYU,aAAa,CAAA;;AAEf,IAAA,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC;2EAAC;uGAFvC,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,6UATd,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FASf,aAAa,EAAA,UAAA,EAAA,CAAA;kBAXzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,QAAQ,EAAE,gBAAgB;oBAC1B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,kBAAkB;AACzB,wBAAA,IAAI,EAAE,SAAS;AACf,wBAAA,YAAY,EAAE,GAAG;AACjB,wBAAA,WAAW,EAAE,MAAM;AACpB,qBAAA;AACF,iBAAA;;AAMD;;;;;;;;;;;;;;;;;;;AAmBG;MAWU,QAAQ,CAAA;AACF,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;;AAEhD,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IACxB,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG7D,IAAA,WAAW,GAAG,KAAK;+FAAU;;AAE7B,IAAA,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC;gFAAC;;IAE9C,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAClE;;;;AAIG;IACM,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAClE;;;;AAIG;IACM,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEjD,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAExC,IAAA,OAAO;;IAEP,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAE/B,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5C,iBAAiB,CAAC,MAAK;AACrB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,IAAI,CAAC,KAAK;gBAAE;YACZ,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,4BAA4B,EAAE,SAAS,CAAC;YAC/D,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,4BAA4B,EAAE,SAAS,CAAC;AACjE,QAAA,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,WAAW;QAC9D,IAAI,IAAI,EAAE;YACR,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE;AAC3C,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACzC,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/E;IACF;;IAGU,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;IAC1B;;IAGA,KAAK,GAAA;AACH,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC5B,QAAA,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AAC1B,QAAA,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACtB,QAAA,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;IACzB;;AAIU,IAAA,mBAAmB,CAAC,KAAmB,EAAA;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AACvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;;AAE1C,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,8DAA8D,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC;YAAE;AAC3H,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC;IAClC;AAEU,IAAA,iBAAiB,CAAC,KAAmB,EAAA;AAC7C,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC;IAClC;AAEU,IAAA,oBAAoB,CAAC,KAAmB,EAAA;AAChD,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC;IACpC;AAEU,IAAA,mBAAmB,CAAC,KAAiB,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AACvB,QAAA,IAAK,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,oCAAoC,CAAC;YAAE;QACjF,IAAI,CAAC,KAAK,EAAE;IACd;AAEU,IAAA,aAAa,CAAC,KAAoB,EAAA;AAC1C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC;AACpC,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC;QAClD,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC/D;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE;YAC/B,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEU,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AAC7C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE;AACrC,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC;AAClD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,KAAK,IAAI,KAAK,EAAE;YAClB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAC7B,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QAC/E;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE;YAC/B,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEQ,IAAA,OAAO,UAAU,CAAC,GAAW,EAAE,IAAY,EAAA;QACjD,QAAQ,GAAG;AACT,YAAA,KAAK,WAAW;gBACd,OAAO,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE;AAC3B,YAAA,KAAK,YAAY;gBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE;AAC1B,YAAA,KAAK,SAAS;gBACZ,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE;AAC3B,YAAA,KAAK,WAAW;gBACd,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE;AAC1B,YAAA;AACE,gBAAA,OAAO,IAAI;;IAEjB;IAEQ,YAAY,CAAC,KAAmB,EAAE,IAAuB,EAAA;AAC/D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;QAClC,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAA4B;AACjD,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;AAC5B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO;QAC5B,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACtC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7B,MAAM,CAAC,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC;AAC3C,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACrB,QAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC;AAEhD,QAAA,MAAM,MAAM,GAAG,CAAC,CAAe,KAAI;AACjC,YAAA,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM;AAC7B,YAAA,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM;YAC7B,IAAI,IAAI,KAAK,MAAM;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC;;gBACnE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACrE,QAAA,CAAC;QACD,MAAM,KAAK,GAAG,MAAK;AACjB,YAAA,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC;AACjD,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC;AAC9C,YAAA,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,KAAK,CAAC;YAClD,MAAM,CAAC,qBAAqB,GAAG,KAAK,CAAC,SAAS,CAAC;AAC/C,YAAA,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,2BAA2B,CAAC;AACrD,QAAA,CAAC;AACD,QAAA,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC;AAC9C,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC;AAC3C,QAAA,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,KAAK,CAAC;IACjD;;IAGQ,MAAM,CAAC,CAAS,EAAE,CAAS,EAAA;AACjC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,MAAM,IAAI,GAAG,KAAK,EAAE,aAAa,CAAC,WAAW;AAC7C,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;YAAE;AACrB,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE;;QAE1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AACxC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;AACzE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACzE,IAAI,CAAC,MAAM,GAAG;AACZ,YAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;AACzC,YAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;SACzC;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACrB,QAAA,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI;IACzF;;IAGQ,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAA;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,MAAM,IAAI,GAAG,KAAK,EAAE,aAAa,CAAC,WAAW;AAC7C,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;YAAE;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;AACzD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;AAC3D,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACrB,QAAA,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;AAC5C,QAAA,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;AAC9C,QAAA,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AAC9B,QAAA,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,OAAO;QAC/B,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA;;;;AAIG;AACK,IAAA,SAAS,CAAC,KAAkB,EAAA;AAClC,QAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAC/C;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;YAAE;AAChD,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C;AAEQ,IAAA,KAAK,CAAC,KAAkB,EAAA;AAC9B,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW;AAC5C,QAAA,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,KAAK,MAAM,KAAK;IACrE;IAEQ,KAAK,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;AAC9B,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAc,mBAAmB,CAAC;QAClF;QACA,OAAO,IAAI,CAAC,OAAO;IACrB;;IAGQ,cAAc,GAAA;AACpB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;QAClC,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAc,uCAAuC,CAAC;AAC9E,QAAA,IAAI,CAAC,KAAK;YAAE;QAEZ,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAC9B,oCAAoC,CACrC;AACD,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,IAAI,CAAC,OAAO,CAAC,EAAE;AAAE,YAAA,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;QAC5C,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE,CAAC;IACnD;uGA1OW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,4wBCzErB,86EAyEA,EAAA,MAAA,EAAA,CAAA,yvGAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDAa,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAVpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,eAAA,EAGJ,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAGhC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B,EAAE,KAAK,EAAE,WAAW,EAAE,EAAA,QAAA,EAAA,86EAAA,EAAA,MAAA,EAAA,CAAA,yvGAAA,CAAA,EAAA;;;AErC9B;;;;;AAKG;MAQU,eAAe,CAAA;AACT,IAAA,GAAG,GAClB,MAAM,CAAwB,YAAY,CAAC;AAC1B,IAAA,IAAI,GAAG,MAAM,CAAsB,eAAe,CAAC;AACnD,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;AAEtB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS;oFAAC;AACzD,IAAA,WAAW,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;oFACjD;AACkB,IAAA,UAAU,GAAG,QAAQ,CACtC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM;mFAC/C;IAES,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;IACtB;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;IACvB;uGApBW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,6EC/C5B,4tBAwBA,EAAA,MAAA,EAAA,CAAA,oXAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDkBY,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,+JAAE,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKzB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;+BACE,mBAAmB,EAAA,OAAA,EACpB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAA,eAAA,EAGpB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4tBAAA,EAAA,MAAA,EAAA,CAAA,oXAAA,CAAA,EAAA;;;AEjBjD,MAAM,kBAAkB,GAAG,iBAAiB;AAE5C;;;;;;;;;;;;;AAaG;MAEU,eAAe,CAAA;AACT,IAAA,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAClC,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;AAGvC,IAAA,IAAI,CACF,SAA2B,EAC3B,MAAA,GAAgC,EAAE,EAAA;QAElC,MAAM,SAAS,GAAG,CAAA,iBAAA,EAAoB,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA,CAAE;AAC3D,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAA6B,SAAS,EAAE;AAC9D,YAAA,GAAG,MAAM;AACT,YAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ;YAC7B,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC;AAC/D,SAAA,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,OAAO,CAAC,IAAyB,EAAA;AAC/B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CACnB,eAAe,EACf;YACE,IAAI;AACJ,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,aAAa,GAAG,QAAQ;YACvD,SAAS,EAAE,IAAI,CAAC,KAAK;AACtB,SAAA,CACF;AACD,QAAA,OAAO,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,CAAC;IAC1D;AAEA;;;AAGG;AACH,IAAA,KAAK,CAAC,IAA4D,EAAA;AAChE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CACnB,eAAe,EACf;AACE,YAAA,IAAI,EAAE;AACJ,gBAAA,GAAG,IAAI;AACP,gBAAA,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;AAC9C,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,aAAa,GAAG,QAAQ;YACvD,SAAS,EAAE,IAAI,CAAC,KAAK;AACtB,SAAA,CACF;QACD,OAAO,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC;IAC9C;AAEA;;;AAGG;IACH,MAAM,MAAM,CAAC,IAAwB,EAAA;;;;;QAKnC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,OAAO,iDAAiB,CAAC;AAC1D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CACnB,cAAc,EACd,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAChC;AACD,QAAA,OAAO,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC;IACzD;IAEQ,eAAe,CACrB,UAAyC,EACzC,SAAiB,EAAA;AAEjB,QAAA,MAAM,IAAI,GAAG,CAAC,kBAAkB,EAAE,SAAS,CAAC;AAC5C,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,IAAI;AAC5B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,UAAU,CAAC;AACnE,QAAA,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC5B;uGA9EW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA;;2FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACjClC;;;;;AAKG;MAiBU,OAAO,CAAA;AACD,IAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;IAGhC,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAe;;IAG1B,IAAI,GAAG,QAAQ,CAAC,MACjC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,GAAG,OAAO,GAAG,QAAQ;6EACnD;IAES,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACtC;IAEU,SAAS,GAAA;QACjB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACrC;IAEU,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACpC;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACrC;uGA1BW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,SAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,QAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjCpB,82BAiCA,EAAA,MAAA,EAAA,CAAA,o8DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDdY,QAAQ,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAcP,OAAO,EAAA,UAAA,EAAA,CAAA;kBAhBnB,SAAS;+BACE,UAAU,EAAA,OAAA,EACX,CAAC,QAAQ,CAAC,mBAGF,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,UAAU;AACjB,wBAAA,kBAAkB,EAAE,aAAa;AACjC,wBAAA,aAAa,EAAE,QAAQ;AACvB,wBAAA,cAAc,EAAE,SAAS;AACzB,wBAAA,cAAc,EAAE,UAAU;AAC1B,wBAAA,WAAW,EAAE,SAAS;AACtB,wBAAA,YAAY,EAAE,UAAU;AACzB,qBAAA,EAAA,QAAA,EAAA,82BAAA,EAAA,MAAA,EAAA,CAAA,o8DAAA,CAAA,EAAA;;;AE3BH;;;;AAIG;MAYU,gBAAgB,CAAA;AACV,IAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;;AAE9B,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;uGAHpC,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpB7B,kFAGA,EAAA,MAAA,EAAA,CAAA,iWAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDQY,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FASN,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAX5B,SAAS;+BACE,oBAAoB,EAAA,OAAA,EACrB,CAAC,OAAO,CAAC,mBAGD,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,oBAAoB;AAC3B,wBAAA,YAAY,EAAE,eAAe;AAC9B,qBAAA,EAAA,QAAA,EAAA,kFAAA,EAAA,MAAA,EAAA,CAAA,iWAAA,CAAA,EAAA;;;AEmCH,MAAMA,kBAAgB,GAAG,IAAI;AAC7B,IAAIC,QAAM,GAAG,CAAC;AAQd;;;;;;;;;;;;AAYG;MAEU,cAAc,CAAA;AACR,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACzC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC;IACrC,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAElD,OAAO,GAAG,MAAM,CAAyB,EAAE;gFAAC;;AAEpD,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAE1B,IAAA,MAAM,GAAG,IAAI,GAAG,EAAsB;AAC/C,IAAA,YAAY;;AAGpB,IAAA,IAAI,CAAC,MAAqB,EAAA;AACxB,QAAA,MAAM,IAAI,GAAgB;YACxB,EAAE,EAAEA,QAAM,EAAE;YACZ,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;AACvB,YAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM;AAC3B,YAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAID,kBAAgB;AAC7C,YAAA,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;YACvC,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB;QAED,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,EAAE;QAEnC,IAAI,CAAC,eAAe,EAAE;;;AAGtB,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;AAE9C,QAAA,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC;YAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;QAC9D,OAAO,IAAI,CAAC,EAAE;IAChB;;AAGA,IAAA,IAAI,CAAC,OAAe,EAAE,MAAA,GAAiC,EAAE,EAAA;AACvD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACxD;;AAEA,IAAA,OAAO,CAAC,OAAe,EAAE,MAAA,GAAiC,EAAE,EAAA;AAC1D,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3D;;AAEA,IAAA,OAAO,CAAC,OAAe,EAAE,MAAA,GAAiC,EAAE,EAAA;AAC1D,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3D;;AAEA,IAAA,MAAM,CAAC,OAAe,EAAE,MAAA,GAAiC,EAAE,EAAA;AACzD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC1D;;AAEA,IAAA,OAAO,CAAC,OAAe,EAAE,MAAA,GAAiC,EAAE,EAAA;AAC1D,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3D;;AAGA,IAAA,OAAO,CAAC,EAAU,EAAA;AAChB,QAAA,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IACtB;;AAGA,IAAA,SAAS,CAAC,IAAiB,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACvB;;AAGA,IAAA,KAAK,CAAC,EAAU,EAAA;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1B,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS;IACjD;;AAGA,IAAA,MAAM,CAAC,EAAU,EAAA;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACnD;IAEQ,UAAU,CAAC,EAAU,EAAE,QAAgB,EAAA;AAC7C,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;AAClB,YAAA,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;AACpD,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACtB,SAAA,CAAC;IACJ;AAEQ,IAAA,UAAU,CAAC,EAAU,EAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACjC,QAAA,IAAI,KAAK;AAAE,YAAA,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;AACrC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IACxB;IAEQ,eAAe,GAAA;QACrB,IAAI,IAAI,CAAC,YAAY;YAAE;AACvB,QAAA,MAAM,GAAG,GAAG,eAAe,CAAC,gBAAgB,EAAE;YAC5C,mBAAmB,EAAE,IAAI,CAAC,WAAW;AACtC,SAAA,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;AAC1D,QAAA,IAAI,CAAC,YAAY,GAAG,GAAG;IACzB;uGAlHW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cADD,MAAM,EAAA,CAAA;;2FACnB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACjElC;;;;AAIG;MAgBU,UAAU,CAAA;AACJ,IAAA,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACjC,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;IAGhC,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAkB;;IAG7B,IAAI,GAAG,QAAQ,CAAC,MACjC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK;AACpD,UAAE;AACF,UAAE,QAAQ;6EACb;IAES,SAAS,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACxC;IAEU,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACtC;IAEU,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;IACtB;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;IACvB;uGA5BW,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,waC9BvB,sZAgBA,EAAA,MAAA,EAAA,CAAA,8nFAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDca,UAAU,EAAA,UAAA,EAAA,CAAA;kBAftB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,aAAa;AACpB,wBAAA,kBAAkB,EAAE,aAAa;AACjC,wBAAA,aAAa,EAAE,QAAQ;AACvB,wBAAA,cAAc,EAAE,SAAS;AACzB,wBAAA,cAAc,EAAE,UAAU;AAC1B,wBAAA,WAAW,EAAE,SAAS;AACtB,wBAAA,YAAY,EAAE,UAAU;AACzB,qBAAA,EAAA,QAAA,EAAA,sZAAA,EAAA,MAAA,EAAA,CAAA,8nFAAA,CAAA,EAAA;;;AExBH;;;;AAIG;MAWU,mBAAmB,CAAA;AACb,IAAA,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC;;AAEjC,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;uGAHpC,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBhC,mEAGA,EAAA,MAAA,EAAA,CAAA,+MAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDQY,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAQT,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAV/B,SAAS;+BACE,uBAAuB,EAAA,OAAA,EACxB,CAAC,UAAU,CAAC,mBAGJ,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,uBAAuB;AAC/B,qBAAA,EAAA,QAAA,EAAA,mEAAA,EAAA,MAAA,EAAA,CAAA,+MAAA,CAAA,EAAA;;;AEkCH,MAAM,gBAAgB,GAAG,IAAI;AAC7B,IAAI,MAAM,GAAG,CAAC;AAEd;;;AAGG;MACU,aAAa,CAAA;AAYb,IAAA,EAAA;AACQ,IAAA,OAAA;AAZX,IAAA,aAAa;AACb,IAAA,cAAc;AACL,IAAA,aAAa,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,KAAI;AACvD,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC;AACxB,IAAA,CAAC,CAAC;AACe,IAAA,cAAc,GAAG,IAAI,OAAO,CAA0B,CAAC,CAAC,KAAI;AAC3E,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC;AACzB,IAAA,CAAC,CAAC;AAEF,IAAA,WAAA;;AAEW,IAAA,EAAU,EACF,OAA0B,EAAA;QADlC,IAAA,CAAA,EAAE,GAAF,EAAE;QACM,IAAA,CAAA,OAAO,GAAP,OAAO;IACvB;;IAGH,OAAO,GAAA;QACL,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/B;;IAGA,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,aAAa;IAC3B;;IAGA,cAAc,GAAA;QACZ,OAAO,IAAI,CAAC,cAAc;IAC5B;;IAGA,aAAa,GAAA;QACX,IAAI,CAAC,aAAa,EAAE;IACtB;;AAEA,IAAA,gBAAgB,CAAC,MAA+B,EAAA;AAC9C,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;IAC7B;AACD;AAED;;;;;;;;;;;;AAYG;MAEU,iBAAiB,CAAA;AACX,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACzC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC;IACrC,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAElD,OAAO,GAAG,MAAM,CAAwB,IAAI;gFAAC;;AAErD,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAE1B,IAAA,IAAI,GAAG,IAAI,GAAG,EAAyB;AAChD,IAAA,KAAK;IACL,SAAS,GAAG,CAAC;IACb,SAAS,GAAG,CAAC;AACb,IAAA,YAAY;AAEpB;;;AAGG;AACH,IAAA,IAAI,CACF,OAAe,EACf,MAAe,EACf,SAA2B,EAAE,EAAA;AAE7B,QAAA,MAAM,EAAE,GAAG,MAAM,EAAE;QACnB,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,GAAG;;AAG/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,IAAI,OAAO;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;AAErC,QAAA,MAAM,IAAI,GAAmB;YAC3B,EAAE;YACF,OAAO;AACP,YAAA,WAAW,EAAE,MAAM;AACnB,YAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,SAAS;AAC9B,YAAA,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK;SACzC;QAED,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;;;AAGtB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAEtB,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,gBAAgB;QACpD,IAAI,QAAQ,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC;AAC/C,QAAA,OAAO,GAAG;IACZ;;AAGA,IAAA,OAAO,CAAC,EAAU,EAAA;AAChB,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC;IAC3B;;AAGA,IAAA,SAAS,CAAC,EAAU,EAAA;QAClB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE;AAClC,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC;IAC1B;;IAGA,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE;AACjB,QAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS;QACtB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS;IAC/C;;IAGA,MAAM,GAAA;AACJ,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE;QAC7B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC;YAAE;QAClD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC;IAC5C;IAEQ,KAAK,CAAC,EAAU,EAAE,MAA+B,EAAA;AACvD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE;YAAE;QAC/B,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACpB,QAAA,GAAG,EAAE,gBAAgB,CAAC,MAAM,CAAC;IAC/B;IAEQ,UAAU,CAAC,EAAU,EAAE,QAAgB,EAAA;AAC7C,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;AAC3B,QAAA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC;IACpE;IAEQ,UAAU,GAAA;QAChB,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AACxC,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC;IACpB;IAEQ,eAAe,GAAA;QACrB,IAAI,IAAI,CAAC,YAAY;YAAE;AACvB,QAAA,MAAM,GAAG,GAAG,eAAe,CAAC,mBAAmB,EAAE;YAC/C,mBAAmB,EAAE,IAAI,CAAC,WAAW;AACtC,SAAA,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;AAC1D,QAAA,IAAI,CAAC,YAAY,GAAG,GAAG;IACzB;uGA5GW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;2FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AClGlC;AACA,MAAM,iBAAiB,GAAG,GAAG;AAE7B;;;;;;;;;;;;;;;AAeG;MAWU,aAAa,CAAA;AACP,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;;AAEhD,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IACxB,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG7D,IAAA,UAAU,GAAG,KAAK;8FAAU;;AAE5B,IAAA,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,uBAAuB,CAAC;gFAAC;;IAEpD,UAAU,GAAG,KAAK,CAAC,KAAK,kFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAE1D,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAE1D,KAAK,GAAuB,IAAI;IAChC,QAAQ,GAAG,KAAK;IAChB,MAAM,GAAG,CAAC;AAElB,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9C;;IAGU,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;IAC1B;AAEU,IAAA,mBAAmB,CAAC,KAAmB,EAAA;AAC/C,QAAA,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAC5C,wBAAwB,CACzB;QACD,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE;AACjB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;QAC1B,KAAK,CAAC,MAAsB,CAAC,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;IACtC;AAEU,IAAA,mBAAmB,CAAC,KAAmB,EAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE;AACnC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,WAAA,EAAc,EAAE,CAAA,GAAA,CAAK;IACpD;AAEU,IAAA,iBAAiB,CAAC,KAAmB,EAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE;AACnC,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AAChC,QAAA,IAAI,EAAE,GAAG,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;QAC1B;aAAO;YACL,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;QACjC;IACF;;IAGQ,cAAc,GAAA;AACpB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;QAClC,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAc,uCAAuC,CAAC;QAC9E,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAc,yBAAyB,CAAC;AACxE,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO;YAAE;QACxB,IAAI,CAAC,OAAO,CAAC,EAAE;AAAE,YAAA,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;QAC5C,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE,CAAC;IACnD;uGAjEW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,opBC3C1B,o1CA8CA,EAAA,MAAA,EAAA,CAAA,8oEAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDHa,aAAa,EAAA,UAAA,EAAA,CAAA;kBAVzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAGhC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAA,QAAA,EAAA,o1CAAA,EAAA,MAAA,EAAA,CAAA,8oEAAA,CAAA,EAAA;;;AE9BpC,MAAM,wBAAwB,GAAG,uBAAuB;AAExD;;;;;;;;;;;;;AAaG;MAEU,oBAAoB,CAAA;AACd,IAAA,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC;;AAGnD,IAAA,IAAI,CACF,SAA2B,EAC3B,MAAA,GAAqC,EAAE,EAAA;AAEvC,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAA6B,SAAS,EAAE;AAC9D,YAAA,GAAG,MAAM;AACT,YAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ;YAC7B,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC;AACpD,SAAA,CAAC;IACJ;AAEQ,IAAA,eAAe,CACrB,UAAyC,EAAA;AAEzC,QAAA,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,wBAAwB,CAAC;AAClD,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,UAAU,CAAC;AACnE,QAAA,OAAO,CAAC,wBAAwB,EAAE,GAAG,KAAK,CAAC;IAC7C;uGArBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAApB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACdlC;;;;;;;;;;;;;;AAcG;MAWU,QAAQ,CAAA;;AAEA,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;IAEhC,IAAI,GAAG,KAAK,CAAS,MAAM;6EAAC;;IAE5B,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;;IAEzB,WAAW,GAAG,KAAK,CAAC,KAAK,mFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAE3D,IAAI,GAAG,KAAK,CAAC,IAAI;6EAAC;;IAGlB,SAAS,GAAG,MAAM,EAAQ;AAEhB,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS,GAAG,OAAO,GAAG,QAAQ;IAC/D,CAAC;6EAAC;IAEQ,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;uGAvBW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,ysBCtCrB,q4BA0BA,EAAA,MAAA,EAAA,CAAA,0lGAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDYa,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAVpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,eAAA,EAGJ,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,WAAW;AAClB,wBAAA,kBAAkB,EAAE,QAAQ;AAC7B,qBAAA,EAAA,QAAA,EAAA,q4BAAA,EAAA,MAAA,EAAA,CAAA,0lGAAA,CAAA,EAAA;;;AEjCH;;;;;;;;;;;;AAYG;MAEU,mBAAmB,CAAA;IACb,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAElD,SAAS,GAAG,MAAM,CAAC,CAAC;kFAAC;IACrB,OAAO,GAAG,MAAM,CAAC,KAAK;gFAAC;;AAE/B,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;;AAEtC,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAEnC,IAAA,KAAK;AACL,IAAA,SAAS;;IAGjB,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QACrB,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE;IACnB;;AAGA,IAAA,GAAG,CAAC,KAAa,EAAA;QACf,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACvD;;IAGA,GAAG,CAAC,MAAM,GAAG,CAAC,EAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,IAAI,CAAC,KAAK,EAAE;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,CAAC;;;AAG3D,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAAE,IAAI,CAAC,UAAU,EAAE;IAC9C;;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACvB;QACF;QACA,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,CAAC,EAAE,GAAG,CAAC;IACT;;IAGA,IAAI,GAAA;QACF,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB;AAEA;;;;;AAKG;IACK,OAAO,GAAA;AACb,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;AAC1B,QAAA,IAAI,CAAC,IAAI,EAAE,EAAE;YACX,IAAI,CAAC,WAAW,EAAE;YAClB;QACF;AACA,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG;AACxD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,IAAI,IAAI,IAAI,EAAE;YAAE,IAAI,CAAC,WAAW,EAAE;IACpC;;IAGQ,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK;YAAE;AACnC,QAAA,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC;IACrD;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,YAAA,IAAI,CAAC,KAAK,GAAG,SAAS;QACxB;IACF;IAEQ,WAAW,GAAA;QACjB,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QACzC,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAChD,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;IAC5B;;AAGS,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG;kFAAC;uGAlGnE,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACLlC;;;;;;;;AAQG;MAsBU,YAAY,CAAA;AACN,IAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACnC,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;IAGhC,KAAK,GAAG,KAAK,CAAC,mBAAmB;8EAAC;;IAElC,MAAM,GAAG,KAAK,CAAC,CAAC,8EAAI,SAAS,EAAE,eAAe,EAAA,CAAG;AAEvC,IAAA,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ;IAChC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;+EAAC;AAEjE;;;;AAIG;AACgB,IAAA,aAAa,GAAG,QAAQ,CACzC,MAAM,CAAA,OAAA,EAAU,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA,CAAA,CAAG;sFACzC;uGAnBU,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,aAAA,EAAA,eAAA,EAAA,GAAA,EAAA,eAAA,EAAA,KAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,8BAAA,EAAA,kBAAA,EAAA,0BAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,8BAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnBb,CAAA;;;;AAIF,SAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,opBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAeG,YAAY,EAAA,UAAA,EAAA,CAAA;kBArBxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,QAAA,EAChB,CAAA;;;;UAIF,EAAA,eAAA,EAES,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,gBAAgB;AACvB,wBAAA,IAAI,EAAE,aAAa;AACnB,wBAAA,eAAe,EAAE,GAAG;AACpB,wBAAA,eAAe,EAAE,KAAK;AACtB,wBAAA,sBAAsB,EAAE,8BAA8B;AACtD,wBAAA,oBAAoB,EAAE,0BAA0B;AAChD,wBAAA,mBAAmB,EAAE,cAAc;AACnC,wBAAA,gCAAgC,EAAE,UAAU;AAC5C,wBAAA,mBAAmB,EAAE,UAAU;AAChC,qBAAA,EAAA,MAAA,EAAA,CAAA,opBAAA,CAAA,EAAA;;;ACcH;MACa,YAAY,GAAG,IAAI,cAAc,CAAa,cAAc;AAEzE;;;;;AAKG;MAWU,WAAW,CAAA;AACL,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3B,QAAQ,GAAG,SAAS,CAA0B,OAAO;iFAAC;AACpD,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;AAGtB,IAAA,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;;AAG3B,IAAA,MAAM,GAAG,QAAQ,CAClC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;+EAC7C;AAED,IAAA,WAAA,GAAA;AACE,QAAA,eAAe,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzE;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IAC7B;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IAC7B;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;IAC5B;AAEU,IAAA,QAAQ,CAAC,KAAY,EAAA;QAC7B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;IAC5B;AAEA;;;;AAIG;IACO,SAAS,GAAA;;IAEnB;AAEA;;;;AAIG;AACO,IAAA,KAAK,CAAC,KAAY,EAAA;QAC1B,MAAM,CAAC,GAAG,KAAsB;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AAC5C,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B,CAAC,CAAC,cAAc,EAAE;YAClB,KAAK,CAAC,KAAK,EAAE;YACb;QACF;AACA,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,aAAa;QAEhD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;YAC3B,CAAC,CAAC,cAAc,EAAE;YAClB,KAAK,CAAC,KAAK,EAAE;QACf;aAAO,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM,KAAK,KAAK,EAAE;YACzC,CAAC,CAAC,cAAc,EAAE;YAClB,IAAI,CAAC,KAAK,EAAE;QACd;aAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;YACzC,CAAC,CAAC,cAAc,EAAE;YAClB,KAAK,CAAC,KAAK,EAAE;QACf;IACF;IAEQ,YAAY,GAAA;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AAC5C,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,KAAK,EAAE;IAC7C;uGAhFW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxExB,syCA4CA,EAAA,MAAA,EAAA,CAAA,gnDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDuBY,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKd,WAAW,EAAA,UAAA,EAAA,CAAA;kBAVvB,SAAS;+BACE,eAAe,EAAA,eAAA,EAGR,uBAAuB,CAAC,MAAM,WACtC,CAAC,eAAe,CAAC,EAAA,IAAA,EACpB;AACJ,wBAAA,KAAK,EAAE,SAAS;AACjB,qBAAA,EAAA,QAAA,EAAA,syCAAA,EAAA,MAAA,EAAA,CAAA,gnDAAA,CAAA,EAAA;gGAI8D,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEzCxE;;;;;;;;;;;;;;AAcG;MAEU,aAAa,CAAA;AACP,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACzC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC;IACrC,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAElD,MAAM,GAAG,MAAM,CAAwB,EAAE;+EAAC;AAC1C,IAAA,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;+EAAC;IACnB,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;;AAGhC,IAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;;AAEhC,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;;IAEpC,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM;8EAAC;;AAE5C,IAAA,WAAW,GAAG,QAAQ,CAAoB,MAAK;AACtD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;QACvB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI;IACnD,CAAC;oFAAC;AAEM,IAAA,QAAQ;AACR,IAAA,KAAK;AACL,IAAA,QAAQ;AACR,IAAA,UAAU;AACV,IAAA,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE;;IAE9B,iBAAiB,GAAuB,IAAI;AAEpD,IAAA,WAAA,GAAA;;;;AAIE,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IAChD;AAEA;;;AAGG;AACH,IAAA,KAAK,CAAC,KAAmB,EAAA;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;QAEnE,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE,IAAI,CAAC,GAAG,EAAE;QAE/B,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;AAC9C,YAAA,IAAI,CAAC,UAAU,GAAG,OAAO;AAC3B,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC3B,aAAA,aAAmC;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;QAC/D,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC,UAAU;IACxB;;IAGA,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,UAAU;IACxB;;IAGA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACrC;;IAGA,IAAI,GAAA;QACF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;YAAE;AAC5C,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC;;IAGA,GAAG,GAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;;;AAGnB,QAAA,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI;AACjC,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU;AAC/B,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;QAC3B,OAAO,IAAI;IACb;AAEiB,IAAA,SAAS,GAAG,CAAC,CAAgB,KAAU;AACtD,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;YACtB,CAAC,CAAC,eAAe,EAAE;YACnB,IAAI,CAAC,GAAG,EAAE;QACZ;AACF,IAAA,CAAC;AAED;;;AAGG;IACK,QAAQ,CAAC,KAAa,EAAE,GAAW,EAAA;QACzC,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAE3B,IAAI,CAAC,GAAG,KAAK;QACb,IAAI,MAAM,GAAuB,IAAI;QACrC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE;AACjC,YAAA,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,YAAA,IAAI,MAAM;gBAAE;YACZ,CAAC,IAAI,GAAG;QACV;AACA,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE;YACzC,IAAI,CAAC,GAAG,EAAE;YACV;QACF;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AACtB,QAAA,MAAM,CAAC,cAAc,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAElF,QAAA,MAAM,IAAI,GAAe;AACvB,YAAA,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACd,YAAA,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,KAAK,CAAC,MAAM;AACnB,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,UAAU,EAAE;AACV,gBAAA,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE;AACvB,gBAAA,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE;AACvB,gBAAA,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE;AACtB,aAAA;SACF;AAED,QAAA,MAAM,GAAG,GAAG,eAAe,CAAC,WAAW,EAAE;YACvC,mBAAmB,EAAE,IAAI,CAAC,WAAW;AACrC,YAAA,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC;gBAC/B,MAAM,EAAE,IAAI,CAAC,WAAW;gBACxB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aACvD,CAAC;AACH,SAAA,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;AAC1D,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;IACrB;;IAGQ,YAAY,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;;;AAGjB,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC1E,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;YACvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE;AAC7C,YAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;QAC3B;QACA,IAAI,CAAC,WAAW,EAAE;IACpB;AAEQ,IAAA,aAAa,CAAC,MAA4B,EAAA;AAChD,QAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;YAC9B,OAAO,MAAM,CAAC,WAAW,GAAG,MAAM,GAAG,IAAI;QAC3C;QACA,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAc,MAAM,CAAC;IACzD;;AAGQ,IAAA,SAAS,CAAC,EAAe,EAAA;AAC/B,QAAA,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK;QACtB,IAAI,CAAC,QAAQ,GAAG;YACd,EAAE;YACF,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B;AACD,QAAA,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAClC,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE;AAC9C,YAAA,KAAK,CAAC,QAAQ,GAAG,UAAU;QAC7B;AACA,QAAA,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,qCAAqC,CAAC;AACnE,QAAA,KAAK,CAAC,SAAS;AACb,YAAA,mEAAmE;QACrE,IAAI,CAAC,KAAK,CAAC,YAAY;AAAE,YAAA,KAAK,CAAC,YAAY,GAAG,qBAAqB;AACnE,QAAA,KAAK,CAAC,UAAU,GAAG,gDAAgD;IACrE;IAEQ,WAAW,GAAA;AACjB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ;AAC1B,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI;AACnB,QAAA,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACrC,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;QACjC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;QAC7B,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QACnC,EAAE,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;QACzC,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;AACrC,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;IAC3B;IAEQ,WAAW,GAAA;QACjB,IAAI,IAAI,CAAC,KAAK;YAAE;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAChD,QAAA,KAAK,CAAC,SAAS,GAAG,eAAe;QACjC,KAAK,CAAC,KAAK,CAAC,OAAO;AACjB,YAAA,6JAA6J;QAC/J,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,2BAA2B,CAAC;QAC/D,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC;AACrC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;IACpB;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS;IACxB;uGA3NW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;2FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AC1BlC;;;AAGG;MAsDU,gBAAgB,CAAA;AACR,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,OAAO,GAAG,MAAM,CAAC,EAAE;gFAAC;uGAFlB,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,QAAA,EAAA,EAAA,cAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnDjB;;;;;;;AAOT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+5BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAyCS,SAAS,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGR,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBArD5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,QAAA,EACrB;;;;;;;GAOT,EAAA,eAAA,EAwCgB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,SAAS,CAAC,QACd,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAA,MAAA,EAAA,CAAA,+5BAAA,CAAA,EAAA;;AAOvE;AACA,SAAS,YAAY,CACnB,QAAkB,EAClB,QAA6B,EAC7B,MAAsB,EACtB,IAAiB,EACjB,OAAe,EACf,IAAa,EAAA;AAEb,IAAA,MAAM,GAAG,GAAG,eAAe,CAAC,gBAAgB,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC;AAChF,IAAA,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,aAA4B;AACpD,IAAA,IAAI,IAAI;AAAE,QAAA,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC/C,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACjC,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW;AACjC,IAAA,MAAM,OAAO,GAAG,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE;AAC3D,IAAA,MAAM,UAAU,GAAG,CAAC,IAAI,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,QAAQ;AAClE,IAAA,MAAM,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU;AAC1C,IAAA,IAAI,aAAa;AAAE,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;;;IAGnD,MAAM,OAAO,GAAc,EAAE;AAC7B,IAAA,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAC7C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;AAChC,YAAA,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;AAC/B,YAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACrB;IACF;AACA,IAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;AACpB,IAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC;;AAEtC,IAAA,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/B,IAAA,GAAG,CAAC,iBAAiB,CAAC,aAAa,EAAE;IACrC,OAAO;QACL,GAAG;QACH,OAAO,EAAE,MAAK;AACZ,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC/B,GAAG,CAAC,OAAO,EAAE;YACb,EAAE,CAAC,MAAM,EAAE;YACX,KAAK,MAAM,KAAK,IAAI,OAAO;AAAE,gBAAA,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC;AAC3D,YAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;AACjC,YAAA,IAAI,aAAa;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE;QAC7C,CAAC;KACF;AACH;AAEA;;;;;;;;;;;;;AAaG;MAKU,SAAS,CAAA;AACH,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;AAClD,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACtC,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;;IAGvC,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAEzD,gBAAgB,GAAG,KAAK,CAAC,EAAE;yFAAC;;IAE5B,cAAc,GAAG,KAAK,CAAC,CAAC,sFAAI,SAAS,EAAE,eAAe,EAAA,CAAG;IAE1D,OAAO,GAA2C,IAAI;IACtD,KAAK,GAAyC,IAAI;AAE1D,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;AAC3B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACvC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;YACnC,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,EAAE,EAAE;gBACP,IAAI,CAAC,OAAO,EAAE;gBACd;YACF;AACA,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBAC9C;YACF;YACA,IAAI,KAAK,GAAG,CAAC;AAAE,gBAAA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;;AACnE,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAC1B,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAK;YAChC,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,OAAO,EAAE;AAChB,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,KAAK,CAAC,OAAe,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;QACjB,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC;IACjH;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;AACvB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;IACrB;IAEQ,WAAW,GAAA;QACjB,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AACxC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;uGApDW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAT,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,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,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBAJrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,IAAI,EAAE,EAAE,0BAA0B,EAAE,aAAa,EAAE;AACpD,iBAAA;;AAwDD;;;;;;;;AAQG;MAEU,gBAAgB,CAAA;AACV,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACtC,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;IACxC,OAAO,GAA2C,IAAI;IAC7C,MAAM,GAAG,MAAM,CAAC,CAAC;+EAAC;;AAG1B,IAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;;IAGzC,KAAK,CAAC,OAAO,GAAG,EAAE,EAAA;AAChB,QAAA,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW;AAAE,YAAA,OAAO,MAAK,EAAE,CAAC;AAC9D,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,OAAO;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;;YAC3D,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;QAC9G,IAAI,QAAQ,GAAG,KAAK;AACpB,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,QAAQ;gBAAE;YACd,QAAQ,GAAG,IAAI;YACf,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;AACvB,gBAAA,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;AACvB,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI;YACrB;AACF,QAAA,CAAC;IACH;;IAGA,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;IAC1B;uGA/BW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA;;2FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACnNlC;;;AAGG;;ACHH;;AAEG;;;;"}
|