@mk-kit/ui 0.43.0 → 0.45.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/README.md +11 -0
- package/fesm2022/mk-kit-ui-core.mjs +30 -13
- package/fesm2022/mk-kit-ui-core.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-data.mjs +1 -1
- package/fesm2022/mk-kit-ui-data.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-directives.mjs +27 -8
- package/fesm2022/mk-kit-ui-directives.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-dnd.mjs +43 -8
- package/fesm2022/mk-kit-ui-dnd.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-forms.mjs +1 -1
- package/fesm2022/mk-kit-ui-forms.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-locales-pl.mjs +503 -0
- package/fesm2022/mk-kit-ui-locales-pl.mjs.map +1 -0
- package/fesm2022/mk-kit-ui-media.mjs +1 -1
- package/fesm2022/mk-kit-ui-media.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-table.mjs +658 -22
- package/fesm2022/mk-kit-ui-table.mjs.map +1 -1
- package/fesm2022/mk-kit-ui-testing.mjs +54 -0
- package/fesm2022/mk-kit-ui-testing.mjs.map +1 -1
- package/package.json +5 -1
- package/types/mk-kit-ui-core.d.ts +36 -10
- package/types/mk-kit-ui-directives.d.ts +12 -6
- package/types/mk-kit-ui-dnd.d.ts +32 -4
- package/types/mk-kit-ui-locales-pl.d.ts +42 -0
- package/types/mk-kit-ui-table.d.ts +234 -8
- package/types/mk-kit-ui-testing.d.ts +16 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mk-kit-ui-directives.mjs","sources":["../../../projects/mk-kit/directives/directives/click-outside.ts","../../../projects/mk-kit/directives/directives/copy-to-clipboard.ts","../../../projects/mk-kit/directives/directives/autosize.ts","../../../projects/mk-kit/directives/directives/autofocus.ts","../../../projects/mk-kit/directives/directives/scrollspy.ts","../../../projects/mk-kit/directives/directives/intersect.ts","../../../projects/mk-kit/directives/directives/infinite-scroll.ts","../../../projects/mk-kit/directives/directives/ripple.ts","../../../projects/mk-kit/directives/directives/mask.ts","../../../projects/mk-kit/directives/directives/field.ts","../../../projects/mk-kit/directives/history/history.service.ts","../../../projects/mk-kit/directives/hotkeys/hotkeys.service.ts","../../../projects/mk-kit/directives/history/history-hotkeys.ts","../../../projects/mk-kit/directives/hotkeys/hotkey.directive.ts","../../../projects/mk-kit/directives/permissions/permission-policy.ts","../../../projects/mk-kit/directives/permissions/can.ts","../../../projects/mk-kit/directives/permissions/can-disable.ts","../../../projects/mk-kit/directives/pipes/intl-utils.ts","../../../projects/mk-kit/directives/pipes/currency.pipe.ts","../../../projects/mk-kit/directives/pipes/relative-time.pipe.ts","../../../projects/mk-kit/directives/pipes/file-size.pipe.ts","../../../projects/mk-kit/directives/pipes/initials.pipe.ts","../../../projects/mk-kit/directives/pipes/truncate.pipe.ts","../../../projects/mk-kit/directives/pipes/pluralize.pipe.ts","../../../projects/mk-kit/directives/index.ts","../../../projects/mk-kit/directives/mk-kit-ui-directives.ts"],"sourcesContent":["import {\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n booleanAttribute,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Emits when a pointer press lands outside the host element — the building block\n * for dismissing menus, popovers and custom dropdowns. Listens on the document\n * in the capture phase so it fires before the target handles the event.\n *\n * ```html\n * <div class=\"panel\" (mkClickOutside)=\"close()\">…</div>\n * ```\n */\n@Directive({\n selector: '[mkClickOutside]',\n exportAs: 'mkClickOutside',\n})\nexport class MkClickOutside {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Disable the listener without removing the directive. */\n readonly enabled = input(true, {\n alias: 'mkClickOutsideEnabled',\n transform: booleanAttribute,\n });\n\n /** Emits the originating event when a pointerdown occurs outside the host. */\n readonly mkClickOutside = output<PointerEvent>();\n\n private readonly onPointerdown = (event: Event): void => {\n // Defensive: the listener detaches on the effect flush after `enabled`\n // flips false, so also ignore any event racing in before that.\n if (!this.enabled()) return;\n const target = event.target as Node | null;\n if (target && !this.host.nativeElement.contains(target)) {\n this.mkClickOutside.emit(event as PointerEvent);\n }\n };\n\n constructor() {\n // The document listener exists only while `enabled()` — an idle directive\n // must not run its handler (and wake change detection) on every pointer\n // press on the page. Effect cleanup also detaches it on destroy.\n effect((onCleanup) => {\n if (!this.isBrowser || !this.enabled()) return;\n this.document.addEventListener('pointerdown', this.onPointerdown, true);\n onCleanup(() =>\n this.document.removeEventListener('pointerdown', this.onPointerdown, true),\n );\n });\n }\n}\n","import {\n DOCUMENT,\n Directive,\n PLATFORM_ID,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Copies text to the clipboard when the host is clicked. Emits `(copied)` on\n * success and `(copyFailed)` on error, and exposes a transient `copied` signal\n * (via `exportAs`) so a template can show a \"Copied!\" state without extra code.\n *\n * ```html\n * <button mkButton [mkCopyToClipboard]=\"token\" #c=\"mkCopyToClipboard\">\n * {{ c.justCopied() ? 'Copied!' : 'Copy' }}\n * </button>\n * ```\n */\n@Directive({\n selector: '[mkCopyToClipboard]',\n exportAs: 'mkCopyToClipboard',\n host: {\n '(click)': 'copy()',\n },\n})\nexport class MkCopyToClipboard {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** The text to copy. */\n readonly text = input.required<string>({ alias: 'mkCopyToClipboard' });\n /** How long (ms) the `copied` signal stays true after a successful copy. */\n readonly feedbackDuration = input(1500, {\n alias: 'mkCopyFeedbackDuration',\n transform: numberAttribute,\n });\n\n /** Emits the copied text on success. */\n readonly copied = output<string>({ alias: 'copiedText' });\n /** Emits the error on failure. */\n readonly copyFailed = output<unknown>();\n\n private readonly _copied = signal(false);\n /** True for `feedbackDuration` ms after a successful copy. */\n readonly justCopied = this._copied.asReadonly();\n\n private resetTimer?: ReturnType<typeof setTimeout>;\n\n /** Copy the text now. Bound to the host click, but callable directly too. */\n async copy(): Promise<void> {\n if (!this.isBrowser) return;\n const value = this.text();\n try {\n await this.write(value);\n this.copied.emit(value);\n this.flagCopied();\n } catch (err) {\n this.copyFailed.emit(err);\n }\n }\n\n private async write(value: string): Promise<void> {\n const clipboard = this.document.defaultView?.navigator?.clipboard;\n if (clipboard?.writeText) {\n await clipboard.writeText(value);\n return;\n }\n // Fallback for non-secure contexts: a hidden textarea + execCommand.\n const ta = this.document.createElement('textarea');\n ta.value = value;\n ta.setAttribute('readonly', '');\n ta.style.cssText = 'position:fixed;top:-9999px;opacity:0;';\n this.document.body.appendChild(ta);\n ta.select();\n const ok =\n typeof this.document.execCommand === 'function' &&\n this.document.execCommand('copy');\n ta.remove();\n if (!ok) throw new Error('Clipboard copy failed');\n }\n\n private flagCopied(): void {\n this._copied.set(true);\n if (this.resetTimer) clearTimeout(this.resetTimer);\n // Reset after the feedback window (guarded so tests without a view work).\n this.resetTimer = setTimeout(\n () => this._copied.set(false),\n this.feedbackDuration(),\n );\n }\n\n ngOnDestroy(): void {\n if (this.resetTimer) clearTimeout(this.resetTimer);\n }\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n afterNextRender,\n effect,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Grows a `<textarea>` to fit its content, between `minRows` and `maxRows`\n * (0 = unbounded). Resizes on input and when the bound value changes.\n *\n * ```html\n * <textarea mkInput mkAutosize [mkAutosizeMaxRows]=\"8\" [(ngModel)]=\"note\"></textarea>\n * ```\n */\n@Directive({\n selector: 'textarea[mkAutosize]',\n host: {\n '(input)': 'resize()',\n style: 'resize: none;',\n },\n})\nexport class MkAutosize {\n private readonly el = inject<ElementRef<HTMLTextAreaElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Minimum height in rows. */\n readonly minRows = input(1, {\n alias: 'mkAutosizeMinRows',\n transform: numberAttribute,\n });\n /** Maximum height in rows before scrolling (0 = unbounded). */\n readonly maxRows = input(0, {\n alias: 'mkAutosizeMaxRows',\n transform: numberAttribute,\n });\n /** Bind the textarea's value so programmatic changes trigger a resize. */\n readonly value = input<unknown>(undefined, { alias: 'mkAutosizeValue' });\n\n constructor() {\n afterNextRender(() => this.resize());\n // Re-fit whenever the bound value (or the row bounds) change.\n effect(() => {\n this.value();\n this.minRows();\n this.maxRows();\n if (this.isBrowser) queueMicrotask(() => this.resize());\n });\n }\n\n /** Recompute the textarea height from its content. */\n resize(): void {\n if (!this.isBrowser) return;\n const ta = this.el.nativeElement;\n const style = this.document.defaultView?.getComputedStyle(ta);\n const line = parseFloat(style?.lineHeight ?? '') || 20;\n const vPad =\n parseFloat(style?.paddingTop ?? '0') +\n parseFloat(style?.paddingBottom ?? '0') +\n parseFloat(style?.borderTopWidth ?? '0') +\n parseFloat(style?.borderBottomWidth ?? '0');\n\n ta.style.height = 'auto';\n const content = ta.scrollHeight;\n const min = this.minRows() * line + vPad;\n const max = this.maxRows() > 0 ? this.maxRows() * line + vPad : Infinity;\n const height = Math.min(max, Math.max(min, content));\n ta.style.height = `${height}px`;\n ta.style.overflowY = content > max ? 'auto' : 'hidden';\n }\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Focuses the host element once it renders. Handy for dialogs, drawers and\n * newly-revealed forms. Disable conditionally with `[mkAutofocus]=\"cond\"`.\n *\n * ```html\n * <input mkInput mkAutofocus />\n * <input mkInput [mkAutofocus]=\"isEditing()\" [mkAutofocusDelay]=\"100\" />\n * ```\n */\n@Directive({\n selector: '[mkAutofocus]',\n})\nexport class MkAutofocus {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Whether to focus. Bare `mkAutofocus` = true. */\n readonly enabled = input(true, {\n alias: 'mkAutofocus',\n transform: booleanAttribute,\n });\n /** Delay before focusing, in ms (e.g. to wait out an entrance animation). */\n readonly delay = input(0, {\n alias: 'mkAutofocusDelay',\n transform: numberAttribute,\n });\n\n private timeoutId?: number;\n\n constructor() {\n afterNextRender(() => {\n if (!this.isBrowser || !this.enabled()) return;\n if (this.delay() > 0) {\n this.timeoutId = this.document.defaultView?.setTimeout(\n () => this.focus(),\n this.delay(),\n );\n } else {\n this.focus();\n }\n });\n }\n\n private focus(): void {\n this.el.nativeElement.focus();\n }\n\n ngOnDestroy(): void {\n if (this.timeoutId != null) {\n this.document.defaultView?.clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n }\n }\n}\n","import {\n DOCUMENT,\n Directive,\n PLATFORM_ID,\n afterNextRender,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Scrollspy — tracks which section is currently in view and exposes its `id`,\n * so a table of contents / \"on this page\" nav can highlight the active link.\n *\n * Apply it to any element (typically the nav) and point `mkScrollspy` at a CSS\n * selector matching the section elements to watch (each needs an `id`). Read the\n * active id via the exported instance, or bind `(activeChange)`:\n *\n * ```html\n * <nav mkScrollspy=\"main :is(h2, h3)[id]\" #spy=\"mkScrollspy\">\n * <a href=\"#intro\" [class.is-active]=\"spy.activeId() === 'intro'\">Intro</a>\n * …\n * </nav>\n * ```\n *\n * A section activates once its top passes `offset` px below the top of the\n * scroll root (default the viewport). When scrolling through a gap between\n * sections the previous one stays active until the next crosses the line.\n */\n@Directive({\n selector: '[mkScrollspy]',\n exportAs: 'mkScrollspy',\n})\nexport class MkScrollspy {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** CSS selector for the section elements to track (queried within `root`). */\n readonly sections = input.required<string>({ alias: 'mkScrollspy' });\n /**\n * Scroll container. Sections are queried inside it and its top edge is the\n * activation reference. Defaults to the whole document / viewport.\n */\n readonly root = input<HTMLElement | null>(null);\n /**\n * Distance (px) below the scroll root's top at which a section becomes\n * active. Raise it to account for a sticky header.\n */\n readonly offset = input(96);\n\n /** The id of the currently active section (`null` before the first one). */\n readonly activeId = signal<string | null>(null);\n /** Emitted whenever the active section changes. */\n readonly activeChange = output<string | null>();\n\n private scrollSource?: EventTarget;\n\n constructor() {\n // afterNextRender runs once inputs are bound, so root()/sections() resolve\n // and the projected sections exist in the DOM.\n afterNextRender(() => {\n if (!this.isBrowser) return;\n const view = this.document.defaultView;\n this.scrollSource = this.root() ?? view ?? undefined;\n this.scrollSource?.addEventListener('scroll', this.onScroll, {\n passive: true,\n });\n view?.addEventListener('resize', this.onScroll);\n this.compute();\n });\n }\n\n /** Re-evaluate the active section (call after sections change). */\n refresh(): void {\n if (this.isBrowser) this.compute();\n }\n\n private querySections(): HTMLElement[] {\n const rootEl: ParentNode = this.root() ?? this.document;\n return Array.from(rootEl.querySelectorAll<HTMLElement>(this.sections()));\n }\n\n private computeRaf: number | null = null;\n /** rAF-coalesced — several scroll ticks per frame trigger one layout read. */\n private readonly onScroll = (): void => {\n if (this.computeRaf != null) return;\n this.computeRaf =\n this.document.defaultView?.requestAnimationFrame(() => {\n this.computeRaf = null;\n this.compute();\n }) ?? null;\n };\n\n private compute(): void {\n const sections = this.querySections();\n if (!sections.length) {\n this.setActive(null);\n return;\n }\n // At the very bottom the final section may be too short to reach the line —\n // activate it explicitly so the last nav item can still highlight.\n if (this.atBottom()) {\n this.setActive(sections[sections.length - 1].id || null);\n return;\n }\n const rootEl = this.root();\n const line = (rootEl ? rootEl.getBoundingClientRect().top : 0) + this.offset();\n\n // Active = the last section whose top has crossed the activation line.\n let active: HTMLElement | null = null;\n for (const section of sections) {\n if (section.getBoundingClientRect().top - line <= 1) active = section;\n else break;\n }\n // Nothing crossed yet (still above the first section) → highlight the first.\n this.setActive((active ?? sections[0]).id || null);\n }\n\n /** Whether the scroll root is scrolled to (or within 1px of) its bottom. */\n private atBottom(): boolean {\n const root = this.root();\n if (root) {\n return root.scrollTop + root.clientHeight >= root.scrollHeight - 1;\n }\n const view = this.document.defaultView;\n if (!view) return false;\n const doc = this.document.documentElement;\n return view.scrollY + view.innerHeight >= doc.scrollHeight - 1;\n }\n\n private setActive(id: string | null): void {\n if (this.activeId() === id) return;\n this.activeId.set(id);\n this.activeChange.emit(id);\n }\n\n ngOnDestroy(): void {\n if (this.computeRaf != null) {\n this.document.defaultView?.cancelAnimationFrame(this.computeRaf);\n this.computeRaf = null;\n }\n this.scrollSource?.removeEventListener('scroll', this.onScroll);\n this.document.defaultView?.removeEventListener('resize', this.onScroll);\n }\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n Injector,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Intersect — a thin `IntersectionObserver` wrapper. Emits `(mkIntersect)` with\n * the host's visibility whenever it enters or leaves the viewport (or `root`),\n * and exposes an `intersecting` signal via `exportAs`. Set `once` to fire a\n * single time and disconnect — the primitive for reveal-on-scroll animations\n * and lazy loading.\n *\n * ```html\n * <img [attr.src]=\"loaded() ? src : null\" mkIntersect once\n * (mkIntersect)=\"loaded.set(true)\" />\n *\n * <div mkIntersect #io=\"mkIntersect\" [class.in-view]=\"io.intersecting()\">…</div>\n * ```\n */\n@Directive({\n selector: '[mkIntersect]',\n exportAs: 'mkIntersect',\n})\nexport class MkIntersect {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Element used as the viewport for the check (defaults to the browser one). */\n readonly root = input<HTMLElement | null>(null);\n /** Margin grown/shrunk around the root before computing intersection. */\n readonly rootMargin = input('0px');\n /** Visibility ratio(s) at which the observer fires. */\n readonly threshold = input<number | number[]>(0);\n /** Emit the first time the host becomes visible, then disconnect. */\n readonly once = input(false, { transform: booleanAttribute });\n\n /** Emits the host's `isIntersecting` state on every change. */\n readonly mkIntersect = output<boolean>();\n /** The current visibility, also readable via `exportAs`. */\n readonly intersecting = signal(false);\n\n private observer?: IntersectionObserver;\n\n constructor() {\n afterNextRender(() => {\n if (!this.isBrowser || typeof IntersectionObserver === 'undefined') return;\n this.observer = new IntersectionObserver(\n (entries) => this.onEntries(entries),\n {\n root: this.root(),\n rootMargin: this.rootMargin(),\n threshold: this.threshold(),\n },\n );\n this.observer.observe(this.host.nativeElement);\n }, { injector: this.injector });\n }\n\n private onEntries(entries: IntersectionObserverEntry[]): void {\n // Ignore any callback queued before we disconnected (e.g. after `once`).\n if (!this.observer) return;\n const entry = entries[entries.length - 1];\n const visible = entry.isIntersecting;\n if (visible === this.intersecting()) return;\n this.intersecting.set(visible);\n this.mkIntersect.emit(visible);\n if (visible && this.once()) this.disconnect();\n }\n\n private disconnect(): void {\n this.observer?.disconnect();\n this.observer = undefined;\n }\n\n ngOnDestroy(): void {\n this.disconnect();\n }\n}\n","import {\n Directive,\n ElementRef,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n numberAttribute,\n output,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * InfiniteScroll — emits `(mkInfiniteScroll)` when the host scroll container is\n * scrolled within `distance` px of its bottom, so a list can load its next\n * page. Apply it to the scrollable element (`overflow: auto`). It fires once per\n * approach and re-arms after you scroll back up past the threshold, so a single\n * gesture never triggers repeated loads. Set `disabled` while a page is loading\n * or once everything is loaded.\n *\n * ```html\n * <div class=\"feed\" mkInfiniteScroll [disabled]=\"loading() || done()\"\n * (mkInfiniteScroll)=\"loadMore()\">\n * @for (item of items(); track item.id) { … }\n * </div>\n * ```\n */\n@Directive({\n selector: '[mkInfiniteScroll]',\n exportAs: 'mkInfiniteScroll',\n})\nexport class MkInfiniteScroll {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Distance (px) from the bottom at which the output fires. */\n readonly distance = input(200, { transform: numberAttribute });\n /** Pause firing (e.g. while a page is loading or all items are loaded). */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Emitted when the host is scrolled near its bottom. */\n readonly mkInfiniteScroll = output<void>();\n\n /** Whether the next bottom-approach is allowed to fire. */\n private armed = true;\n\n constructor() {\n afterNextRender(() => {\n if (!this.isBrowser) return;\n this.host.nativeElement.addEventListener('scroll', this.onScroll, {\n passive: true,\n });\n // Fire immediately if the initial content doesn't fill the container.\n this.check();\n });\n }\n\n private readonly onScroll = (): void => this.check();\n\n private check(): void {\n const el = this.host.nativeElement;\n const remaining = el.scrollHeight - el.scrollTop - el.clientHeight;\n if (remaining > this.distance()) {\n // Scrolled away from the bottom — allow the next approach to fire.\n this.armed = true;\n return;\n }\n if (!this.armed || this.disabled()) return;\n this.armed = false;\n this.mkInfiniteScroll.emit();\n }\n\n ngOnDestroy(): void {\n this.host.nativeElement.removeEventListener('scroll', this.onScroll);\n }\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Ripple — a Material-style touch ripple that expands from the pointer on press.\n * Apply it to any pressable surface (button, list item, card). The directive\n * makes the host a positioned, clipping container and paints a short-lived wave;\n * it respects `prefers-reduced-motion`.\n *\n * ```html\n * <button mkRipple>Save</button>\n * <li mkRipple mkRippleColor=\"var(--mk-primary)\">Item</li>\n * ```\n */\n@Directive({\n selector: '[mkRipple]',\n host: {\n '(pointerdown)': 'spawn($event)',\n },\n})\nexport class MkRipple {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Wave colour (any CSS colour). Defaults to the host's `currentColor`. */\n readonly color = input<string>('', { alias: 'mkRippleColor' });\n /** Start every ripple from the centre instead of the pointer. */\n readonly centered = input(false, {\n alias: 'mkRippleCentered',\n transform: booleanAttribute,\n });\n /** Turn the effect off. */\n readonly disabled = input(false, {\n alias: 'mkRippleDisabled',\n transform: booleanAttribute,\n });\n\n protected spawn(event: PointerEvent): void {\n if (!this.isBrowser || this.disabled()) return;\n const el = this.host.nativeElement;\n const view = this.document.defaultView;\n if (view?.matchMedia?.('(prefers-reduced-motion: reduce)').matches) return;\n\n // Make the host a positioned, clipping container (idempotent).\n const cs = view?.getComputedStyle(el);\n if (cs && cs.position === 'static') el.style.position = 'relative';\n el.style.overflow = 'hidden';\n\n const rect = el.getBoundingClientRect();\n const x = this.centered() ? rect.width / 2 : event.clientX - rect.left;\n const y = this.centered() ? rect.height / 2 : event.clientY - rect.top;\n // Radius that reaches the farthest corner from the origin.\n const radius = Math.hypot(\n Math.max(x, rect.width - x),\n Math.max(y, rect.height - y),\n );\n\n const wave = this.document.createElement('span');\n wave.className = 'mk-ripple__wave';\n Object.assign(wave.style, {\n position: 'absolute',\n left: `${x - radius}px`,\n top: `${y - radius}px`,\n width: `${radius * 2}px`,\n height: `${radius * 2}px`,\n borderRadius: '50%',\n background: this.color() || 'currentColor',\n pointerEvents: 'none',\n transform: 'scale(0)',\n opacity: '0.3',\n });\n el.appendChild(wave);\n\n const cleanup = () => wave.remove();\n const anim = wave.animate?.(\n [\n { transform: 'scale(0)', opacity: 0.3 },\n { transform: 'scale(1)', opacity: 0 },\n ],\n { duration: 500, easing: 'ease-out' },\n );\n if (anim) anim.onfinish = cleanup;\n // Fallback removal in case the animation never resolves (or is unsupported).\n view?.setTimeout(cleanup, 650);\n }\n}\n","import {\n Directive,\n ElementRef,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\n\n/** Result of applying a mask: the formatted string and its raw token chars. */\nexport interface MkMaskResult {\n masked: string;\n unmasked: string;\n}\n\n/** Token → predicate for the character it accepts. */\nconst MK_MASK_TOKENS: Record<string, RegExp> = {\n '0': /[0-9]/, // digit\n A: /[A-Za-z]/, // letter\n '*': /[0-9A-Za-z]/, // alphanumeric\n};\n\nconst ALNUM = /[0-9A-Za-z]/;\n\n/**\n * Format `value` against a mask `pattern`. Pattern tokens: `0` = digit,\n * `A` = letter, `*` = alphanumeric; any other character is a literal that is\n * inserted automatically. Characters that don't fit the current token are\n * skipped, so pasted / mistyped input is coerced into shape.\n *\n * Returns the `masked` (display) string and the `unmasked` string (only the\n * token characters — the value you usually store).\n */\nexport function mkApplyMask(value: string, pattern: string): MkMaskResult {\n let masked = '';\n let unmasked = '';\n let vi = 0;\n for (let pi = 0; pi < pattern.length; pi++) {\n const pc = pattern[pi];\n const rule = MK_MASK_TOKENS[pc];\n if (rule) {\n while (vi < value.length && !rule.test(value[vi])) vi++;\n if (vi >= value.length) break;\n masked += value[vi];\n unmasked += value[vi];\n vi++;\n } else {\n // Stop rather than emit a trailing literal with no content after it.\n if (vi >= value.length) break;\n masked += pc;\n if (value[vi] === pc) vi++;\n }\n }\n return { masked, unmasked };\n}\n\n/**\n * Compute where the caret belongs after re-masking: after the same number of\n * value (alphanumeric) characters the caret used to sit behind, absorbing any\n * literal(s) that immediately follow — so typing \"1\" in \"(0)\" lands the caret\n * after the \"(\". Shared by {@link MkMask} and the masked form controls.\n */\nexport function mkMaskCaret(\n oldValue: string,\n oldCaret: number,\n masked: string,\n): number {\n const before = oldValue.slice(0, oldCaret);\n const target = (before.match(/[0-9A-Za-z]/g) ?? []).length;\n let pos = 0;\n let seen = 0;\n while (pos < masked.length && seen < target) {\n if (ALNUM.test(masked[pos])) seen++;\n pos++;\n }\n while (pos < masked.length && !ALNUM.test(masked[pos])) pos++;\n return pos;\n}\n\n/**\n * Mask — formats an `<input>` as the user types against a token pattern\n * (phone, card, date, custom). Apply it to any text input; read the raw value\n * via `(unmaskedChange)` (or the exported `unmasked` getter) and the formatted\n * value via `(maskedChange)`.\n *\n * ```html\n * <input mkInput mkMask=\"(000) 000-0000\" (unmaskedChange)=\"phone.set($event)\" />\n * <input mkInput mkMask=\"0000 0000 0000 0000\" />\n * ```\n */\n@Directive({\n selector: '[mkMask]',\n exportAs: 'mkMask',\n host: {\n '(input)': 'onInput()',\n '[attr.inputmode]': 'inputMode()',\n },\n})\nexport class MkMask {\n private readonly host = inject<ElementRef<HTMLInputElement>>(ElementRef);\n\n /** The mask pattern (token string). */\n readonly pattern = input.required<string>({ alias: 'mkMask' });\n /** Override the derived `inputmode` (`numeric` for digit-only masks). */\n readonly maskInputmode = input<string | null>(null, {\n alias: 'mkMaskInputmode',\n });\n\n /** Mobile keyboard hint: numeric for digit-only patterns unless overridden. */\n protected readonly inputMode = computed(\n () => this.maskInputmode() ?? (/[A*]/.test(this.pattern()) ? 'text' : 'numeric'),\n );\n\n /** The formatted value, on every change. */\n readonly maskedChange = output<string>();\n /** The raw value (token characters only), on every change. */\n readonly unmaskedChange = output<string>();\n\n private _masked = '';\n private _unmasked = '';\n\n /** The current formatted value. */\n get value(): string {\n return this._masked;\n }\n /** The current raw value (token characters only). */\n get unmasked(): string {\n return this._unmasked;\n }\n\n protected onInput(): void {\n const el = this.host.nativeElement;\n const oldValue = el.value;\n const oldCaret = el.selectionStart ?? oldValue.length;\n const { masked, unmasked } = mkApplyMask(oldValue, this.pattern());\n\n el.value = masked;\n this.setCaret(el, oldValue, oldCaret, masked);\n\n if (masked === this._masked) return;\n this._masked = masked;\n this._unmasked = unmasked;\n this.maskedChange.emit(masked);\n this.unmaskedChange.emit(unmasked);\n }\n\n /** Position the caret after the same number of value chars as before. */\n private setCaret(\n el: HTMLInputElement,\n oldValue: string,\n oldCaret: number,\n masked: string,\n ): void {\n const pos = mkMaskCaret(oldValue, oldCaret, masked);\n try {\n el.setSelectionRange(pos, pos);\n } catch {\n // Some input types (e.g. number, email) don't support selection.\n }\n }\n}\n","import { Directive, ElementRef, computed, inject, input } from '@angular/core';\n\n/** The attributes a field preset can control. */\nconst MK_FIELD_ATTRS = [\n 'type',\n 'inputmode',\n 'autocomplete',\n 'autocapitalize',\n 'autocorrect',\n 'spellcheck',\n 'enterkeyhint',\n] as const;\n\ntype MkFieldAttr = (typeof MK_FIELD_ATTRS)[number];\n\n/** The attribute bundle applied for one `MkFieldKind`. Omitted = not set. */\nexport type MkFieldPreset = Partial<Record<MkFieldAttr, string>>;\n\n/** Semantic field kinds understood by {@link MkField}. */\nexport type MkFieldKind =\n | 'email'\n | 'tel'\n | 'url'\n | 'search'\n | 'numeric'\n | 'given-name'\n | 'family-name'\n | 'name'\n | 'organization'\n | 'street'\n | 'address-line1'\n | 'address-line2'\n | 'city'\n | 'region'\n | 'country'\n | 'postal-code'\n | 'username'\n | 'one-time-code';\n\n/**\n * The attribute bundle per field kind. Exported so hosts can inspect what a\n * kind resolves to, or spread an entry into their own preset table.\n *\n * `autocorrect` (non-standard, honoured by iOS Safari) is set to `off`\n * wherever `spellcheck` is `false`.\n */\nexport const MK_FIELD_PRESETS: Readonly<Record<MkFieldKind, MkFieldPreset>> = {\n email: {\n type: 'email',\n inputmode: 'email',\n autocomplete: 'email',\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n },\n tel: { type: 'tel', inputmode: 'tel', autocomplete: 'tel' },\n url: {\n type: 'url',\n inputmode: 'url',\n autocomplete: 'url',\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n },\n search: {\n type: 'search',\n inputmode: 'search',\n autocomplete: 'off',\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n enterkeyhint: 'search',\n },\n numeric: { inputmode: 'numeric' },\n 'given-name': {\n type: 'text',\n autocomplete: 'given-name',\n autocapitalize: 'words',\n },\n 'family-name': {\n type: 'text',\n autocomplete: 'family-name',\n autocapitalize: 'words',\n },\n name: { type: 'text', autocomplete: 'name', autocapitalize: 'words' },\n organization: {\n type: 'text',\n autocomplete: 'organization',\n autocapitalize: 'words',\n },\n street: {\n type: 'text',\n autocomplete: 'street-address',\n autocapitalize: 'words',\n },\n 'address-line1': {\n type: 'text',\n autocomplete: 'address-line1',\n autocapitalize: 'words',\n },\n 'address-line2': {\n type: 'text',\n autocomplete: 'address-line2',\n autocapitalize: 'words',\n },\n city: {\n type: 'text',\n autocomplete: 'address-level2',\n autocapitalize: 'words',\n },\n region: {\n type: 'text',\n autocomplete: 'address-level1',\n autocapitalize: 'words',\n },\n country: {\n type: 'text',\n autocomplete: 'country-name',\n autocapitalize: 'words',\n },\n 'postal-code': {\n type: 'text',\n autocomplete: 'postal-code',\n autocapitalize: 'characters',\n autocorrect: 'off',\n spellcheck: 'false',\n },\n username: {\n type: 'text',\n autocomplete: 'username',\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n },\n 'one-time-code': {\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'one-time-code',\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n },\n};\n\n/**\n * Field — applies the semantic mobile-keyboard and autofill attribute bundle\n * for a kind of field, so you never again ship an email input that iOS\n * capitalises or an address input the browser can't autofill.\n *\n * It sets `type`, `inputmode`, `autocomplete`, `autocapitalize`, `autocorrect`,\n * `spellcheck` and `enterkeyhint` (see {@link MK_FIELD_PRESETS}) and nothing\n * else — no styling, no value handling — so it composes with `mkInput`,\n * `mk-form-field`, `[(ngModel)]` and reactive forms untouched.\n *\n * ```html\n * <input mkInput mkField=\"email\" formControlName=\"email\" />\n * <input mkInput mkField=\"street\" formControlName=\"street\" />\n * <input mkInput [mkField]=\"isCompany() ? 'organization' : 'name'\" />\n * ```\n *\n * ## Precedence\n *\n * A **static** attribute you write on the element wins: the directive reads the\n * seven attributes once at construction (before any host binding has run) and\n * keeps whatever was already there, filling in only what you left out. So\n * `<input mkField=\"username\" type=\"password\" />` stays a password field but\n * still gets `autocomplete=\"username\"`, `autocapitalize=\"off\"`, …\n *\n * A **template binding** for the same attribute (`[attr.autocomplete]=\"…\"`)\n * does *not* win — Angular applies directive host bindings after template\n * bindings, so the preset overwrites it. Use a static attribute to override, or\n * drop `mkField` and set the bundle yourself.\n */\n@Directive({\n selector: '[mkField]',\n host: {\n '[attr.type]': 'attrs().type',\n '[attr.inputmode]': 'attrs().inputmode',\n '[attr.autocomplete]': 'attrs().autocomplete',\n '[attr.autocapitalize]': 'attrs().autocapitalize',\n '[attr.autocorrect]': 'attrs().autocorrect',\n '[attr.spellcheck]': 'attrs().spellcheck',\n '[attr.enterkeyhint]': 'attrs().enterkeyhint',\n },\n})\nexport class MkField {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Which kind of field this is. */\n readonly kind = input.required<MkFieldKind>({ alias: 'mkField' });\n\n /**\n * Attributes the consumer put on the element themselves, read once before\n * any host binding has run — these always win over the preset.\n */\n private readonly authored: MkFieldPreset = Object.fromEntries(\n MK_FIELD_ATTRS.map((name) => [name, this.el.nativeElement.getAttribute(name)]).filter(\n ([, value]) => value !== null,\n ),\n );\n\n /** The resolved attribute bundle: authored value, else preset, else unset. */\n protected readonly attrs = computed<Record<MkFieldAttr, string | null>>(() => {\n const preset = MK_FIELD_PRESETS[this.kind()] ?? {};\n const resolved = {} as Record<MkFieldAttr, string | null>;\n for (const name of MK_FIELD_ATTRS) {\n resolved[name] = this.authored[name] ?? preset[name] ?? null;\n }\n return resolved;\n });\n}\n","import { Injectable, computed, signal, type Signal } from '@angular/core';\n\n/**\n * A single undoable step recorded in an {@link MkHistoryStack}.\n *\n * The **first** execution of an action is the caller's job — `push()` records\n * an action that has *already happened*. `undo()` reverts it; `redo()` applies\n * it again after an undo.\n */\nexport interface MkHistoryEntry {\n /** Human label for menus/tooltips (\"Delete row\", \"Move card\"). */\n label: string;\n /** Revert the action. */\n undo(): void;\n /** Re-apply the action after an undo. */\n redo(): void;\n}\n\n/**\n * MkHistoryStack — a pure, signal-based, linear undo/redo command stack with\n * no Angular DI involved. Instantiate it directly for a local editing session\n * (a dialog, a canvas, a form wizard), or use the app-wide singleton\n * {@link MkHistoryService}.\n *\n * ```ts\n * const stack = new MkHistoryStack();\n * deleteRow(row); // 1. do the work yourself\n * stack.push({ // 2. record how to revert/redo it\n * label: 'Delete row',\n * undo: () => insertRow(row),\n * redo: () => deleteRow(row),\n * });\n * stack.undo(); // row is back\n * ```\n *\n * ### Linear history\n * `push()` clears the redo branch — after undoing twice and pushing a new\n * entry, the two undone entries are gone (the standard editor model).\n *\n * ### ⚠️ Re-entrancy guard — the classic footgun\n * Pushes made **while** `undo()` or `redo()` is executing are **silently\n * ignored**. Naive consumers often record history from a generic change\n * handler (`(cellEdit)`, `valueChanges`, …); when an undo replays the old\n * value, that same handler fires again and would push a mirror entry,\n * corrupting the stack into an undo/redo ping-pong. The guard makes that\n * pattern safe by construction. If you need to record something new in\n * response to an undo, do it after `undo()` returns.\n */\nexport class MkHistoryStack {\n private readonly undoStack = signal<readonly MkHistoryEntry[]>([]);\n private readonly redoStack = signal<readonly MkHistoryEntry[]>([]);\n\n /** True while an entry's `undo()`/`redo()` is running (re-entrancy guard). */\n private replaying = false;\n\n /** Depth of nested `batch()` calls; > 0 while a batch is collecting. */\n private batchDepth = 0;\n private batchLabel = '';\n private batchBuffer: MkHistoryEntry[] = [];\n\n private maxSize = 100;\n\n /** True when at least one entry can be undone. */\n readonly canUndo: Signal<boolean> = computed(() => this.undoStack().length > 0);\n /** True when at least one undone entry can be redone. */\n readonly canRedo: Signal<boolean> = computed(() => this.redoStack().length > 0);\n /** Label of the entry `undo()` would revert, or `null` (\"Undo *Delete row*\"). */\n readonly undoLabel: Signal<string | null> = computed(\n () => this.undoStack().at(-1)?.label ?? null,\n );\n /** Label of the entry `redo()` would re-apply, or `null`. */\n readonly redoLabel: Signal<string | null> = computed(\n () => this.redoStack().at(-1)?.label ?? null,\n );\n /** Number of undoable entries currently on the stack. */\n readonly size: Signal<number> = computed(() => this.undoStack().length);\n\n /**\n * Maximum number of undoable entries kept (default `100`). When exceeded the\n * **oldest** entries are dropped. Settable at any time; lowering it trims\n * the stack immediately. Values below 1 are clamped to 1.\n */\n get limit(): number {\n return this.maxSize;\n }\n set limit(value: number) {\n this.maxSize = Math.max(1, Math.floor(value));\n this.undoStack.update((stack) =>\n stack.length > this.maxSize ? stack.slice(stack.length - this.maxSize) : stack,\n );\n }\n\n /**\n * Record an already-performed action. Clears the redo branch and evicts the\n * oldest entry beyond {@link limit}. Ignored while `undo()`/`redo()` is\n * executing (see the re-entrancy note on the class) — inside a `batch()` the\n * entry is collected into the composite instead.\n */\n push(entry: MkHistoryEntry): void {\n if (this.replaying) return;\n if (this.batchDepth > 0) {\n this.batchBuffer.push(entry);\n return;\n }\n this.commit(entry);\n }\n\n /** Undo the most recent entry. Returns `false` when there is nothing to undo. */\n undo(): boolean {\n const entry = this.undoStack().at(-1);\n if (!entry) return false;\n this.undoStack.update((stack) => stack.slice(0, -1));\n this.replaying = true;\n try {\n entry.undo();\n } finally {\n this.replaying = false;\n }\n this.redoStack.update((stack) => [...stack, entry]);\n return true;\n }\n\n /** Redo the most recently undone entry. Returns `false` when there is nothing to redo. */\n redo(): boolean {\n const entry = this.redoStack().at(-1);\n if (!entry) return false;\n this.redoStack.update((stack) => stack.slice(0, -1));\n this.replaying = true;\n try {\n entry.redo();\n } finally {\n this.replaying = false;\n }\n this.undoStack.update((stack) => [...stack, entry]);\n return true;\n }\n\n /** Drop all entries (both branches) and any in-flight batch collection. */\n clear(): void {\n this.undoStack.set([]);\n this.redoStack.set([]);\n this.batchBuffer = [];\n }\n\n /**\n * Group every `push()` made during `work()` into **one** undoable step.\n * Undo runs the children in reverse order; redo runs them forward. Nested\n * `batch()` calls flatten into the outermost batch (its label wins). An\n * empty batch records nothing. Returns `work()`'s result; if `work()`\n * throws, entries pushed before the throw are still committed.\n */\n batch<T>(label: string, work: () => T): T {\n if (this.replaying) return work();\n this.batchDepth++;\n if (this.batchDepth === 1) {\n this.batchLabel = label;\n this.batchBuffer = [];\n }\n try {\n return work();\n } finally {\n this.batchDepth--;\n if (this.batchDepth === 0 && this.batchBuffer.length > 0) {\n const children = this.batchBuffer;\n this.batchBuffer = [];\n this.commit({\n label: this.batchLabel,\n undo: () => {\n for (let i = children.length - 1; i >= 0; i--) children[i].undo();\n },\n redo: () => {\n for (const child of children) child.redo();\n },\n });\n }\n }\n }\n\n /**\n * Create an **independent** stack with the same API — e.g. for a dialog's\n * local editing session that should not pollute the app-wide history.\n * Discard it (or `clear()` it) when the session ends.\n */\n createScope(): MkHistoryStack {\n return new MkHistoryStack();\n }\n\n /** Append to the undo stack: clear the redo branch, evict beyond the limit. */\n private commit(entry: MkHistoryEntry): void {\n this.redoStack.set([]);\n this.undoStack.update((stack) => {\n const next = [...stack, entry];\n return next.length > this.maxSize ? next.slice(next.length - this.maxSize) : next;\n });\n }\n}\n\n/**\n * MkHistoryService — the app-wide {@link MkHistoryStack} singleton. Inject it\n * anywhere; call {@link MkHistoryStack.createScope} for an isolated local\n * stack, or wire `mod+z` / `mod+shift+z` / `mod+y` with\n * {@link registerHistoryHotkeys}.\n *\n * ### Recipe — undoable `mk-table` cell edits\n * Wire the table's `(cellEdit)` output so each saved cell becomes one\n * undoable step. Apply the edit yourself first (`push()` records an action\n * that already happened), and match rows by a stable id — the row object is\n * replaced by the immutable update:\n *\n * ```ts\n * // <mk-table [rows]=\"rows()\" [columns]=\"columns\" (cellEdit)=\"onCellEdit($event)\" />\n * private readonly history = inject(MkHistoryService);\n * readonly rows = signal<Order[]>([...]);\n *\n * onCellEdit(edit: MkCellEdit<Order>): void {\n * const previous = edit.row[edit.key as keyof Order];\n * const apply = (value: unknown) =>\n * this.rows.update((rows) =>\n * rows.map((r) => (r.id === edit.row.id ? { ...r, [edit.key]: value } : r)),\n * );\n * apply(edit.value); // first execution is the caller's job\n * this.history.push({\n * label: `Edit ${edit.key}`,\n * undo: () => apply(previous),\n * redo: () => apply(edit.value),\n * });\n * }\n * ```\n *\n * Undoing replays the old value through the same `apply` function; if your\n * change pipeline re-emits into `onCellEdit` during that replay, the\n * re-entrancy guard drops the spurious `push()` (see {@link MkHistoryStack}).\n */\n@Injectable({ providedIn: 'root' })\nexport class MkHistoryService extends MkHistoryStack {}\n","import { DOCUMENT, Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * A single hotkey combo parsed into a normalized key + modifier flags.\n * Produced by {@link mkParseHotkey}; consumed by {@link mkMatchesHotkey}.\n */\nexport interface MkParsedHotkey {\n /** The non-modifier key, lowercased and alias-normalized (e.g. `k`, `escape`, `?`). */\n key: string;\n /** `mod` — Cmd on macOS, Ctrl elsewhere. */\n mod: boolean;\n /** The Control key. */\n ctrl: boolean;\n /** The Meta / Command / Windows key. */\n meta: boolean;\n /** The Alt / Option key. */\n alt: boolean;\n /** The Shift key. */\n shift: boolean;\n}\n\n/** Options accepted by {@link MkHotkeysService.register}. */\nexport interface MkHotkeyOptions {\n /** Call `preventDefault()` on the event when the hotkey fires. Default `false`. */\n preventDefault?: boolean;\n /** Also fire while an editable field (input/textarea/select/contentEditable) is focused. Default `false`. */\n allowInInput?: boolean;\n}\n\n/** Tokens that count as modifiers rather than the trigger key. */\nconst MODIFIERS = new Set(['mod', 'ctrl', 'control', 'meta', 'cmd', 'command', 'alt', 'option', 'shift']);\n\n/** Human-friendly aliases mapped onto their `KeyboardEvent.key` (lowercased) form. */\nconst KEY_ALIASES: Record<string, string> = {\n esc: 'escape',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n down: 'arrowdown',\n left: 'arrowleft',\n right: 'arrowright',\n del: 'delete',\n return: 'enter',\n plus: '+',\n};\n\n/** Keys that are themselves modifiers — ignored as sequence/trigger keys. */\nconst MODIFIER_KEYS = new Set(['control', 'shift', 'alt', 'meta', 'os', 'altgraph']);\n\n/** True on Apple platforms, where `mod` maps to the Command (meta) key. */\nexport function mkIsMacPlatform(): boolean {\n return typeof navigator !== 'undefined' && (navigator.platform ?? '').includes('Mac');\n}\n\n/**\n * Parse a single hotkey combo (e.g. `'mod+k'`, `'ctrl+shift+p'`, `'?'`) into a\n * structured {@link MkParsedHotkey}. Tokens are joined by `+`; the last\n * non-modifier token is the trigger key. Pure and SSR-safe.\n *\n * For a chord (space-separated sequence like `'g i'`), split on whitespace and\n * parse each step — {@link MkHotkeysService} does this for you.\n */\nexport function mkParseHotkey(combo: string): MkParsedHotkey {\n const parsed: MkParsedHotkey = {\n key: '',\n mod: false,\n ctrl: false,\n meta: false,\n alt: false,\n shift: false,\n };\n const tokens = combo\n .trim()\n .split('+')\n .map((t) => t.trim().toLowerCase())\n .filter((t) => t.length > 0);\n\n for (const token of tokens) {\n switch (token) {\n case 'mod':\n parsed.mod = true;\n break;\n case 'ctrl':\n case 'control':\n parsed.ctrl = true;\n break;\n case 'meta':\n case 'cmd':\n case 'command':\n parsed.meta = true;\n break;\n case 'alt':\n case 'option':\n parsed.alt = true;\n break;\n case 'shift':\n parsed.shift = true;\n break;\n default:\n parsed.key = KEY_ALIASES[token] ?? token;\n }\n }\n return parsed;\n}\n\n/**\n * Does a `keydown` event satisfy a hotkey? `combo` may be a raw string (parsed\n * on the fly) or an already-parsed {@link MkParsedHotkey}.\n *\n * The key is compared case-insensitively; modifier flags must match exactly.\n * `mod` resolves to Meta on macOS and Ctrl elsewhere. Shift is not enforced for\n * symbol keys (e.g. `'?'`), whose shifted state varies by keyboard layout.\n */\nexport function mkMatchesHotkey(event: KeyboardEvent, combo: string | MkParsedHotkey): boolean {\n const parsed = typeof combo === 'string' ? mkParseHotkey(combo) : combo;\n if (!parsed.key) return false;\n\n if (event.key.toLowerCase() !== parsed.key) return false;\n\n const mac = mkIsMacPlatform();\n const wantCtrl = parsed.ctrl || (parsed.mod && !mac);\n const wantMeta = parsed.meta || (parsed.mod && mac);\n if (event.ctrlKey !== wantCtrl) return false;\n if (event.metaKey !== wantMeta) return false;\n if (event.altKey !== parsed.alt) return false;\n\n // Shift: enforce when requested; for symbol keys (non-alphanumeric single\n // chars) the shifted state is layout-dependent, so don't enforce its absence.\n if (parsed.shift) {\n if (!event.shiftKey) return false;\n } else {\n const symbolKey = parsed.key.length === 1 && !/[a-z0-9]/i.test(parsed.key);\n if (!symbolKey && event.shiftKey) return false;\n }\n return true;\n}\n\ninterface Registration {\n steps: MkParsedHotkey[];\n handler: (e: KeyboardEvent) => void;\n preventDefault: boolean;\n allowInInput: boolean;\n}\n\n/** Window (ms) to complete a two-step chord before the pending key is dropped. */\nconst SEQUENCE_TIMEOUT = 1000;\n\n/**\n * MkHotkeysService — app-wide keyboard shortcuts. Register a combo string and a\n * handler; a single `keydown` listener (attached lazily on the first\n * registration, browser only) dispatches to every match.\n *\n * Supports single combos (`'mod+k'`, `'ctrl+shift+p'`, `'?'`) and simple\n * two-step chords (`'g i'`). By default hotkeys are ignored while an editable\n * field is focused — pass `allowInInput` to opt in per registration.\n *\n * ```ts\n * const off = hotkeys.register('mod+k', (e) => openPalette(), { preventDefault: true });\n * // …later\n * off();\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkHotkeysService {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly registrations = new Set<Registration>();\n private attached = false;\n\n /** The first key of an in-progress chord, awaiting its second key. */\n private pendingEvent: KeyboardEvent | null = null;\n private pendingTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Register `combo` → `handler`. Returns a disposer that unregisters it.\n * `combo` may be a single combo or a space-separated two-step chord.\n */\n register(\n combo: string,\n handler: (e: KeyboardEvent) => void,\n options: MkHotkeyOptions = {},\n ): () => void {\n const steps = combo\n .trim()\n .split(/\\s+/)\n .filter((s) => s.length > 0)\n .map(mkParseHotkey);\n\n const registration: Registration = {\n steps,\n handler,\n preventDefault: options.preventDefault ?? false,\n allowInInput: options.allowInInput ?? false,\n };\n this.registrations.add(registration);\n this.ensureAttached();\n\n return () => {\n this.registrations.delete(registration);\n if (this.registrations.size === 0) this.detach();\n };\n }\n\n /** Remove every registration and detach the listener. */\n unregisterAll(): void {\n this.registrations.clear();\n this.clearPending();\n this.detach();\n }\n\n private ensureAttached(): void {\n if (this.attached || !this.isBrowser) return;\n this.document.addEventListener('keydown', this.onKeydown, true);\n this.attached = true;\n }\n\n private detach(): void {\n if (!this.attached) return;\n this.document.removeEventListener('keydown', this.onKeydown, true);\n this.attached = false;\n }\n\n private readonly onKeydown = (event: Event): void => {\n const e = event as KeyboardEvent;\n // Bare modifier presses neither trigger nor advance a chord.\n if (MODIFIER_KEYS.has(e.key.toLowerCase())) return;\n\n const editable = this.isEditable(e.target);\n\n // 1. Try to complete an in-progress chord.\n if (this.pendingEvent) {\n const first = this.pendingEvent;\n let completed = false;\n for (const reg of this.registrations) {\n if (reg.steps.length !== 2) continue;\n if (editable && !reg.allowInInput) continue;\n if (mkMatchesHotkey(first, reg.steps[0]) && mkMatchesHotkey(e, reg.steps[1])) {\n this.trigger(reg, e);\n completed = true;\n }\n }\n this.clearPending();\n if (completed) return;\n // Otherwise fall through: this key may fire a single hotkey or open a chord.\n }\n\n // 2. Single-combo matches.\n let matched = false;\n for (const reg of this.registrations) {\n if (reg.steps.length !== 1) continue;\n if (editable && !reg.allowInInput) continue;\n if (mkMatchesHotkey(e, reg.steps[0])) {\n this.trigger(reg, e);\n matched = true;\n }\n }\n if (matched) return;\n\n // 3. Open a chord if this key matches the first step of any two-step combo.\n for (const reg of this.registrations) {\n if (reg.steps.length !== 2) continue;\n if (editable && !reg.allowInInput) continue;\n if (mkMatchesHotkey(e, reg.steps[0])) {\n this.pendingEvent = e;\n this.pendingTimer = setTimeout(() => this.clearPending(), SEQUENCE_TIMEOUT);\n return;\n }\n }\n };\n\n private trigger(reg: Registration, e: KeyboardEvent): void {\n if (reg.preventDefault) e.preventDefault();\n reg.handler(e);\n }\n\n private clearPending(): void {\n this.pendingEvent = null;\n if (this.pendingTimer) {\n clearTimeout(this.pendingTimer);\n this.pendingTimer = undefined;\n }\n }\n\n private isEditable(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null;\n if (!el || typeof el.tagName !== 'string') return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n return el.isContentEditable === true;\n }\n}\n","import { DestroyRef, inject } from '@angular/core';\nimport { MkHotkeysService } from '../hotkeys/hotkeys.service';\nimport { MkHistoryService, type MkHistoryStack } from './history.service';\n\n/**\n * Opt-in helper wiring the standard editor shortcuts to a history stack\n * through {@link MkHotkeysService}:\n *\n * - `mod+z` → `undo()`\n * - `mod+shift+z` **and** `mod+y` → `redo()`\n *\n * Must be called in an **injection context** (constructor, field initializer,\n * or `runInInjectionContext`). Nothing is registered automatically — apps own\n * their shortcuts and call this where (and if) they want them:\n *\n * ```ts\n * export class AppShell {\n * private readonly disposeHistoryKeys = registerHistoryHotkeys();\n * }\n * ```\n *\n * Pass a specific stack (e.g. a `createScope()` stack for a dialog) to bind\n * the shortcuts to it instead of the app-wide {@link MkHistoryService}.\n *\n * Returns a dispose function that unregisters all three shortcuts; it is also\n * called automatically when the current injection context is destroyed.\n *\n * Notes:\n * - `MkHotkeysService` ignores keydowns while an editable element\n * (input/textarea/select/contentEditable) is focused, so native text-field\n * undo keeps working — no extra handling needed here.\n * - The shortcuts register with `preventDefault` so the browser's own\n * history/document undo does not fire alongside yours.\n */\nexport function registerHistoryHotkeys(\n history: MkHistoryStack = inject(MkHistoryService),\n): () => void {\n const hotkeys = inject(MkHotkeysService);\n const disposers = [\n hotkeys.register('mod+z', () => void history.undo(), { preventDefault: true }),\n hotkeys.register('mod+shift+z', () => void history.redo(), { preventDefault: true }),\n hotkeys.register('mod+y', () => void history.redo(), { preventDefault: true }),\n ];\n\n let disposed = false;\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n for (const off of disposers) off();\n };\n inject(DestroyRef, { optional: true })?.onDestroy(dispose);\n return dispose;\n}\n","import {\n Directive,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport {\n MkHotkeysService,\n type MkParsedHotkey,\n mkIsMacPlatform,\n mkParseHotkey,\n} from './hotkeys.service';\n\n/**\n * `aria-keyshortcuts` names (UI Events `KeyboardEvent.key` values) keyed by\n * the lowercase form {@link mkParseHotkey} produces. Space and plus have\n * dedicated names because they collide with the ARIA separators.\n */\nconst ARIA_KEY_NAMES: Record<string, string> = {\n ' ': 'Space',\n '+': 'Plus',\n escape: 'Escape',\n enter: 'Enter',\n tab: 'Tab',\n backspace: 'Backspace',\n delete: 'Delete',\n insert: 'Insert',\n home: 'Home',\n end: 'End',\n pageup: 'PageUp',\n pagedown: 'PageDown',\n arrowup: 'ArrowUp',\n arrowdown: 'ArrowDown',\n arrowleft: 'ArrowLeft',\n arrowright: 'ArrowRight',\n};\n\n/** Map a parsed (lowercase) key to its `aria-keyshortcuts` spelling. */\nfunction ariaKeyName(key: string): string {\n const mapped = ARIA_KEY_NAMES[key];\n if (mapped) return mapped;\n if (/^f\\d{1,2}$/.test(key)) return key.toUpperCase(); // F1 … F12\n return key.length === 1 ? key.toUpperCase() : key;\n}\n\n/**\n * One parsed combo as an ARIA `+`-joined token, e.g. `Control+Shift+P`.\n * `mod` resolves the same way the matcher does: Meta on macOS, Control\n * elsewhere ({@link mkIsMacPlatform}).\n */\nfunction ariaCombo(parsed: MkParsedHotkey): string {\n const mac = mkIsMacPlatform();\n const tokens: string[] = [];\n if (parsed.ctrl || (parsed.mod && !mac)) tokens.push('Control');\n if (parsed.alt) tokens.push('Alt');\n if (parsed.shift) tokens.push('Shift');\n if (parsed.meta || (parsed.mod && mac)) tokens.push('Meta');\n if (parsed.key) tokens.push(ariaKeyName(parsed.key));\n return tokens.join('+');\n}\n\n/**\n * `[mkHotkey]` — declaratively bind a keyboard shortcut to a host element.\n *\n * When the combo fires, a `<button>` or `<a>` host is `click()`ed; any other\n * host emits `(mkHotkeyPressed)`. Registration is scoped to the element's\n * lifetime (auto-unregistered on destroy) via {@link MkHotkeysService}.\n *\n * ```html\n * <button mkHotkey=\"mod+s\" (click)=\"save()\">Save</button>\n * <div mkHotkey=\"?\" (mkHotkeyPressed)=\"showHelp()\">…</div>\n * ```\n */\n@Directive({\n selector: '[mkHotkey]',\n exportAs: 'mkHotkey',\n host: {\n '[attr.aria-keyshortcuts]': 'ariaKeyshortcuts()',\n },\n})\nexport class MkHotkey {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly hotkeys = inject(MkHotkeysService);\n\n /** The combo (or space-separated chord) to bind, e.g. `mod+k`, `g i`, `?`. */\n readonly mkHotkey = input.required<string>();\n /** Fire even while an editable field is focused. */\n readonly mkHotkeyAllowInInput = input(false, { transform: booleanAttribute });\n /** Call `preventDefault()` when the hotkey fires. Defaults to `true`. */\n readonly mkHotkeyPreventDefault = input(true, { transform: booleanAttribute });\n\n /** Emitted when the hotkey fires and the host is not a button/link. */\n readonly mkHotkeyPressed = output<KeyboardEvent>();\n\n /**\n * The combo in `aria-keyshortcuts` syntax — per-step tokens `+`-joined\n * (`Control+K`), chord steps space-separated (`G I`). Exposed on the host.\n */\n protected readonly ariaKeyshortcuts = computed(() => {\n const combos = this.mkHotkey()\n .trim()\n .split(/\\s+/)\n .filter((s) => s.length > 0)\n .map((step) => ariaCombo(mkParseHotkey(step)))\n .filter((s) => s.length > 0);\n return combos.length ? combos.join(' ') : null;\n });\n\n private dispose?: () => void;\n\n constructor() {\n afterNextRender(() => {\n this.dispose = this.hotkeys.register(this.mkHotkey(), (e) => this.onTrigger(e), {\n allowInInput: this.mkHotkeyAllowInInput(),\n preventDefault: this.mkHotkeyPreventDefault(),\n });\n });\n }\n\n private onTrigger(e: KeyboardEvent): void {\n const el = this.host.nativeElement;\n const tag = el.tagName;\n if (tag === 'BUTTON' || tag === 'A') {\n el.click();\n return;\n }\n this.mkHotkeyPressed.emit(e);\n }\n\n ngOnDestroy(): void {\n this.dispose?.();\n }\n}\n","import type { Signal } from '@angular/core';\n\n/**\n * Permission policy — the contract the permission directives (`*mkCan`,\n * `*mkCannot`, `[mkCanDisable]`) check against. Provide an implementation\n * once at bootstrap; the directives inject it optionally and, when no policy\n * is provided at all, treat every permission as **granted** — an app that\n * never wires permissions must not have its whole UI hidden.\n *\n * `can` may return a plain `boolean` (static role checks) or a\n * `Signal<boolean>` (live permissions). The directives normalise both, and a\n * signal-returning policy re-evaluates reactively: views appear/disappear and\n * controls enable/disable the moment the underlying permissions change.\n *\n * ```ts\n * // A signal-based policy fed from an auth service:\n * @Injectable()\n * export class AppPermissionPolicy extends MkPermissionPolicy {\n * private readonly auth = inject(AuthService);\n *\n * can(permission: string): Signal<boolean> {\n * // auth.permissions is a Signal<string[]> that updates on login/logout.\n * return computed(() => this.auth.permissions().includes(permission));\n * }\n * }\n *\n * bootstrapApplication(App, {\n * providers: [\n * { provide: MkPermissionPolicy, useClass: AppPermissionPolicy },\n * ],\n * });\n * ```\n *\n * A static policy is just as valid:\n *\n * ```ts\n * class StaticPolicy extends MkPermissionPolicy {\n * can(permission: string): boolean {\n * return CURRENT_USER.permissions.includes(permission);\n * }\n * }\n * ```\n */\nexport abstract class MkPermissionPolicy {\n /**\n * Whether the current user holds `permission`. Return a `Signal<boolean>`\n * to make the verdict live; a plain boolean is treated as static.\n */\n abstract can(permission: string): boolean | Signal<boolean>;\n}\n\n/**\n * Resolve a policy verdict to a boolean, unwrapping signal-based results.\n * Call it inside a reactive context (`computed` / `effect`) so a\n * signal-returning policy stays live. A missing policy grants everything.\n */\nexport function mkPermissionGranted(\n policy: MkPermissionPolicy | null,\n permission: string,\n): boolean {\n if (!policy) return true;\n const verdict = policy.can(permission);\n return typeof verdict === 'boolean' ? verdict : verdict();\n}\n","import {\n Directive,\n TemplateRef,\n ViewContainerRef,\n computed,\n effect,\n inject,\n input,\n type Signal,\n} from '@angular/core';\nimport { MkPermissionPolicy, mkPermissionGranted } from './permission-policy';\n\n/**\n * Shared view management for `*mkCan` / `*mkCannot`. Must be called from the\n * directive's constructor (an injection context). Creates the embedded view\n * while the (possibly negated) verdict holds, the `else` template while it\n * does not, and destroys/recreates views when a signal-based policy flips.\n */\nfunction setupPermissionView(\n permission: Signal<string>,\n fallback: Signal<TemplateRef<unknown> | null>,\n negate: boolean,\n): void {\n const policy = inject(MkPermissionPolicy, { optional: true });\n const templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n const viewContainer = inject(ViewContainerRef);\n\n const visible = computed(() => {\n const granted = mkPermissionGranted(policy, permission());\n return negate ? !granted : granted;\n });\n\n // Tracks the currently rendered template so a change to the *other* branch\n // (e.g. the else template resolving while the view is shown) is a no-op.\n let rendered: TemplateRef<unknown> | null = null;\n effect(() => {\n const next = visible() ? templateRef : fallback();\n if (next === rendered) return;\n rendered = next;\n viewContainer.clear();\n if (next) viewContainer.createEmbeddedView(next);\n });\n}\n\n/**\n * Structural directive that renders its template only while the app's\n * {@link MkPermissionPolicy} grants the given permission. With a\n * signal-based policy the check is live — the view is created and destroyed\n * as permissions change. When no policy is provided, everything is granted.\n *\n * ```html\n * <button *mkCan=\"'posts.delete'\" (click)=\"remove()\">Delete</button>\n *\n * <!-- With a fallback template, like *ngIf's else: -->\n * <section *mkCan=\"'billing.view'; else locked\">…</section>\n * <ng-template #locked><mk-empty-state title=\"No access\" /></ng-template>\n * ```\n */\n@Directive({ selector: '[mkCan]' })\nexport class MkCan {\n /** The permission key to check, e.g. `'posts.delete'`. */\n readonly permission = input.required<string>({ alias: 'mkCan' });\n /** Template rendered while the permission is denied (`; else ref`). */\n readonly elseTemplate = input<TemplateRef<unknown> | null>(null, {\n alias: 'mkCanElse',\n });\n\n constructor() {\n setupPermissionView(this.permission, this.elseTemplate, false);\n }\n}\n\n/**\n * The negation of {@link MkCan}: renders its template only while the\n * permission is **denied** — for upsell hints, \"ask an admin\" notes and the\n * like. With no policy provided everything is granted, so `*mkCannot`\n * renders nothing.\n *\n * ```html\n * <p *mkCannot=\"'reports.export'\">Exporting requires an admin role.</p>\n * ```\n */\n@Directive({ selector: '[mkCannot]' })\nexport class MkCannot {\n /** The permission key to check. */\n readonly permission = input.required<string>({ alias: 'mkCannot' });\n /** Template rendered while the permission is granted (`; else ref`). */\n readonly elseTemplate = input<TemplateRef<unknown> | null>(null, {\n alias: 'mkCannotElse',\n });\n\n constructor() {\n setupPermissionView(this.permission, this.elseTemplate, true);\n }\n}\n","import {\n Directive,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport { MkPermissionPolicy, mkPermissionGranted } from './permission-policy';\n\n/**\n * Disables the host while the app's {@link MkPermissionPolicy} denies the\n * given permission — the \"keep it visible but inert\" alternative to `*mkCan`\n * for buttons, inputs and menu items.\n *\n * While denied, the host gets `aria-disabled=\"true\"`, and — when the element\n * supports it (button, input, select, textarea, fieldset…) — its native\n * `disabled` property is set too. Non-disableable elements (links, custom\n * menu items) get `aria-disabled` only; pair it with CSS / a click guard as\n * needed. The directive owns the disabled state: it also re-enables the host\n * when the permission is granted. With a signal-based policy the state flips\n * live; with no policy provided, everything is granted.\n *\n * ```html\n * <button [mkCanDisable]=\"'posts.delete'\" (click)=\"remove()\">Delete</button>\n * <a [mkCanDisable]=\"'billing.view'\" routerLink=\"/billing\">Billing</a>\n * ```\n */\n@Directive({\n selector: '[mkCanDisable]',\n host: {\n '[attr.aria-disabled]': \"denied() ? 'true' : null\",\n },\n})\nexport class MkCanDisable {\n private readonly policy = inject(MkPermissionPolicy, { optional: true });\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The permission key to check, e.g. `'posts.delete'`. */\n readonly permission = input.required<string>({ alias: 'mkCanDisable' });\n\n /** Whether the permission is currently denied. */\n protected readonly denied = computed(\n () => !mkPermissionGranted(this.policy, this.permission()),\n );\n\n constructor() {\n const el = this.host.nativeElement as HTMLElement & { disabled?: boolean };\n effect(() => {\n const denied = this.denied();\n // Only elements with a native `disabled` member (form controls) get the\n // property; everything else relies on `aria-disabled` alone.\n if ('disabled' in el) el.disabled = denied;\n });\n }\n}\n","import type { MkI18nStrings } from '@mk-kit/ui/core';\n\n/**\n * Resolve the locale a formatting pipe should use: an explicit per-call\n * locale wins, then `provideMkI18n({ locale })`, then the runtime default\n * (`undefined` lets `Intl` pick the environment locale).\n */\nexport function mkResolveLocale(\n i18n: Pick<MkI18nStrings, 'locale'>,\n explicit?: string | null,\n): string | undefined {\n return explicit || i18n.locale || undefined;\n}\n\n/**\n * Small bounded memo for `Intl` formatter instances — constructing them is\n * far more expensive than calling `format()`, and a pure pipe in a list\n * re-runs for every row.\n */\nexport class MkIntlCache<T> {\n private readonly map = new Map<string, T>();\n\n constructor(\n private readonly create: (locale: string | undefined, options: Record<string, unknown>) => T,\n private readonly limit = 32,\n ) {}\n\n get(locale: string | undefined, options: Record<string, unknown> = {}): T {\n const key = `${locale ?? ''}|${JSON.stringify(options)}`;\n let hit = this.map.get(key);\n if (hit === undefined) {\n hit = this.create(locale, options);\n if (this.map.size >= this.limit) {\n // Evict the oldest entry (Map iteration order is insertion order).\n this.map.delete(this.map.keys().next().value as string);\n }\n this.map.set(key, hit);\n }\n return hit;\n }\n}\n\n/** Coerce a pipe input to a finite number; `null` for anything else. */\nexport function mkToNumber(value: unknown): number | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'string' && value.trim() === '') return null;\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\n/** Coerce a `Date | number | string` to a valid timestamp; `null` for anything else. */\nexport function mkToTimestamp(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null;\n const t =\n value instanceof Date\n ? value.getTime()\n : typeof value === 'number'\n ? value\n : new Date(value as string).getTime();\n return Number.isFinite(t) ? t : null;\n}\n","import { Pipe, type PipeTransform, inject } from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkIntlCache, mkResolveLocale, mkToNumber } from './intl-utils';\n\n/**\n * Options accepted by {@link MkCurrencyPipe}. They map onto\n * `Intl.NumberFormat` currency options; `locale` overrides the i18n /\n * runtime locale for this call only.\n */\nexport interface MkCurrencyOptions {\n /** BCP 47 locale for this call; defaults to `provideMkI18n({ locale })`, then the runtime locale. */\n locale?: string;\n /** How the currency is shown. Default `'symbol'` (`€`, `$`, `zł`). */\n display?: 'symbol' | 'narrowSymbol' | 'code' | 'name';\n /** Fraction digits; both default to the currency's own (2 for EUR, 0 for JPY). */\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n /** Sign display, e.g. `'always'` for `+€10.00` or `'exceptZero'`. */\n signDisplay?: 'auto' | 'never' | 'always' | 'exceptZero';\n /** Compact notation for dashboards (`$1.2M`). Default `'standard'`. */\n notation?: 'standard' | 'compact';\n /** Thousands grouping; default `true`. */\n useGrouping?: boolean;\n}\n\nconst formatters = new MkIntlCache<Intl.NumberFormat>(\n (locale, options) => new Intl.NumberFormat(locale, options as Intl.NumberFormatOptions),\n);\n\n/**\n * `mkCurrency` — format a number as money with `Intl.NumberFormat`, honouring\n * the locale and default currency from `provideMkI18n({ locale, currency })`.\n * No Angular locale data is needed. Pure: `null`, `undefined`, `''` and\n * non-numeric input render as `''`.\n *\n * ```html\n * {{ 1234.5 | mkCurrency }} <!-- $1,234.50 (i18n currency, default USD) -->\n * {{ 1234.5 | mkCurrency:'EUR' }} <!-- €1,234.50 -->\n * {{ 1234.5 | mkCurrency:'PLN':{ locale: 'pl-PL' } }} <!-- 1234,50 zł -->\n * {{ 1234567 | mkCurrency:'USD':{ notation: 'compact' } }} <!-- $1.2M -->\n * {{ total() | mkCurrency:'GBP':{ signDisplay: 'always' } }} <!-- signals work as-is -->\n * ```\n */\n@Pipe({ name: 'mkCurrency', pure: true })\nexport class MkCurrencyPipe implements PipeTransform {\n private readonly i18n = inject(MK_I18N);\n\n /**\n * @param value Amount in major units (`12.5` → `$12.50`).\n * @param currency ISO 4217 code; defaults to `provideMkI18n({ currency })`, then `'USD'`.\n * @param options Locale and `Intl.NumberFormat` currency options.\n */\n transform(\n value: number | string | null | undefined,\n currency?: string | null,\n options: MkCurrencyOptions = {},\n ): string {\n const amount = mkToNumber(value);\n if (amount === null) return '';\n const { locale, display, ...rest } = options;\n const intlOptions: Intl.NumberFormatOptions = {\n style: 'currency',\n currency: (currency || this.i18n.currency || 'USD').toUpperCase(),\n currencyDisplay: display ?? 'symbol',\n ...rest,\n };\n return formatters\n .get(mkResolveLocale(this.i18n, locale), intlOptions as Record<string, unknown>)\n .format(amount);\n }\n}\n","import { Pipe, type PipeTransform, inject } from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkIntlCache, mkResolveLocale, mkToTimestamp } from './intl-utils';\n\n/** Options accepted by {@link MkRelativeTimePipe}. */\nexport interface MkRelativeTimeOptions {\n /** BCP 47 locale for this call; defaults to `provideMkI18n({ locale })`, then the runtime locale. */\n locale?: string;\n /**\n * `'auto'` (default) uses phrases like \"yesterday\" / \"now\" where the locale\n * has them; `'always'` sticks to \"1 day ago\" / \"in 0 seconds\".\n */\n numeric?: 'always' | 'auto';\n /** Length of the unit word: `'long'` (default, \"minutes\"), `'short'` (\"min.\"), `'narrow'` (\"m\"). */\n style?: 'long' | 'short' | 'narrow';\n /**\n * Largest unit to use. Default `'year'`; e.g. `'day'` keeps \"45 days ago\"\n * instead of \"1 month ago\".\n */\n maxUnit?: Intl.RelativeTimeFormatUnit;\n}\n\n/** Unit ladder: `[unit, milliseconds per unit]`, smallest first. */\nconst UNITS: ReadonlyArray<readonly [Intl.RelativeTimeFormatUnit, number]> = [\n ['second', 1_000],\n ['minute', 60_000],\n ['hour', 3_600_000],\n ['day', 86_400_000],\n ['week', 604_800_000],\n ['month', 2_629_800_000], // 365.25 / 12 days\n ['year', 31_557_600_000], // 365.25 days\n];\n\nconst formatters = new MkIntlCache<Intl.RelativeTimeFormat>(\n (locale, options) =>\n new Intl.RelativeTimeFormat(locale, options as Intl.RelativeTimeFormatOptions),\n);\n\n/**\n * `mkRelativeTime` — \"3 minutes ago\" / \"in 2 days\" / \"yesterday\" from a\n * `Date`, timestamp or ISO string, via `Intl.RelativeTimeFormat` in the\n * `provideMkI18n` locale (no Angular locale data). Pure: `null`, `undefined`\n * and unparsable input render as `''`.\n *\n * The pipe picks the largest unit whose magnitude is at least 1 (seconds →\n * minutes → hours → days → weeks → months → years) and rounds. Pass `now`\n * for deterministic output in tests, or bind a ticking signal to keep a\n * list live — a pure pipe only re-runs when an argument changes:\n *\n * ```html\n * {{ comment.createdAt | mkRelativeTime }} <!-- 3 minutes ago -->\n * {{ due | mkRelativeTime:now() }} <!-- in 2 days (now() ticks) -->\n * {{ due | mkRelativeTime:null:{ style: 'short' } }} <!-- in 2 days -->\n * {{ ts | mkRelativeTime:null:{ locale: 'pl', numeric: 'always' } }} <!-- 3 minuty temu -->\n * ```\n */\n@Pipe({ name: 'mkRelativeTime', pure: true })\nexport class MkRelativeTimePipe implements PipeTransform {\n private readonly i18n = inject(MK_I18N);\n\n /**\n * @param value The instant to describe.\n * @param now Reference instant; defaults to `Date.now()` at call time.\n * @param options Locale, numeric mode, style and unit cap.\n */\n transform(\n value: Date | number | string | null | undefined,\n now?: Date | number | string | null,\n options: MkRelativeTimeOptions = {},\n ): string {\n const target = mkToTimestamp(value);\n if (target === null) return '';\n const reference = mkToTimestamp(now) ?? Date.now();\n const diff = target - reference;\n const [unit, amount] = pickUnit(diff, options.maxUnit ?? 'year');\n const { locale, maxUnit: _maxUnit, ...rest } = options;\n return formatters\n .get(mkResolveLocale(this.i18n, locale), {\n numeric: 'auto',\n style: 'long',\n ...rest,\n })\n .format(amount, unit);\n }\n}\n\n/** Choose the largest unit (≤ `maxUnit`) whose rounded magnitude is ≥ 1; seconds otherwise. */\nfunction pickUnit(\n diffMs: number,\n maxUnit: Intl.RelativeTimeFormatUnit,\n): [Intl.RelativeTimeFormatUnit, number] {\n const cap = UNITS.findIndex(([u]) => u === maxUnit || `${u}s` === maxUnit);\n const last = cap === -1 ? UNITS.length - 1 : cap;\n const abs = Math.abs(diffMs);\n for (let i = last; i > 0; i--) {\n const [unit, ms] = UNITS[i];\n if (abs >= ms) return [unit, Math.round(diffMs / ms)];\n }\n const value = Math.round(diffMs / 1000);\n // Avoid \"-0 seconds\": normalise negative zero so 'auto' can render \"now\".\n return ['second', value === 0 ? 0 : value];\n}\n","import { Pipe, type PipeTransform, inject } from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkIntlCache, mkResolveLocale, mkToNumber } from './intl-utils';\n\n/** Options accepted by {@link MkFileSizePipe}. */\nexport interface MkFileSizeOptions {\n /** BCP 47 locale for the number part (decimal separator); defaults to the i18n / runtime locale. */\n locale?: string;\n /**\n * `'decimal'` (default) divides by 1000 and labels `kB MB GB …` (what\n * operating systems and file dialogs show); `'binary'` divides by 1024\n * and labels `KiB MiB GiB …`.\n */\n base?: 'decimal' | 'binary';\n /** Maximum fraction digits. Default `1`; bytes never get fractions. */\n digits?: number;\n}\n\nconst DECIMAL_UNITS = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB'] as const;\nconst BINARY_UNITS = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB'] as const;\n\nconst numbers = new MkIntlCache<Intl.NumberFormat>(\n (locale, options) => new Intl.NumberFormat(locale, options as Intl.NumberFormatOptions),\n);\n\n/**\n * `mkFileSize` — bytes → a human-readable size such as `1.2 MB`, with the\n * number formatted by `Intl.NumberFormat` in the `provideMkI18n` locale.\n * Pure: `null`, `undefined`, `''` and non-numeric input render as `''`.\n *\n * ```html\n * {{ 1_234_567 | mkFileSize }} <!-- 1.2 MB -->\n * {{ 1_234_567 | mkFileSize:{ base: 'binary' } }} <!-- 1.2 MiB -->\n * {{ 1_234_567 | mkFileSize:{ digits: 2, locale: 'de' } }} <!-- 1,23 MB -->\n * {{ 512 | mkFileSize }} <!-- 512 B -->\n * ```\n */\n@Pipe({ name: 'mkFileSize', pure: true })\nexport class MkFileSizePipe implements PipeTransform {\n private readonly i18n = inject(MK_I18N);\n\n transform(\n value: number | string | null | undefined,\n options: MkFileSizeOptions = {},\n ): string {\n const bytes = mkToNumber(value);\n if (bytes === null) return '';\n const binary = options.base === 'binary';\n const divisor = binary ? 1024 : 1000;\n const units = binary ? BINARY_UNITS : DECIMAL_UNITS;\n const negative = bytes < 0;\n let amount = Math.abs(bytes);\n let index = 0;\n while (amount >= divisor && index < units.length - 1) {\n amount /= divisor;\n index++;\n }\n let digits = index === 0 ? 0 : Math.max(0, options.digits ?? 1);\n // 999.96 kB would round to \"1000 kB\": promote to the next unit instead.\n if (index < units.length - 1 && Number(amount.toFixed(digits)) >= divisor) {\n amount /= divisor;\n index++;\n digits = Math.max(0, options.digits ?? 1);\n }\n const number = numbers\n .get(mkResolveLocale(this.i18n, options.locale), { maximumFractionDigits: digits })\n .format(negative ? -amount : amount);\n return `${number} ${units[index]}`;\n }\n}\n","import { Pipe, type PipeTransform } from '@angular/core';\n\n/**\n * `mkInitials` — \"Ada Lovelace\" → \"AL\", the same rule `mk-avatar` uses for\n * its fallback: first letter of the first and last word, upper-cased. A\n * single word yields its first `max` letters (\"Ada\" → \"AD\"); more than two\n * words with `max` > 2 take one letter per word from the start (\"Jean\n * Luc Picard\" with `max: 3` → \"JLP\"). Leading/trailing/duplicate whitespace\n * is ignored, and grapheme-aware slicing keeps emoji and accents intact.\n * Pure: `null`, `undefined` and blank input render as `''`.\n *\n * ```html\n * {{ user.name | mkInitials }} <!-- Grace Hopper → GH -->\n * {{ user.name | mkInitials:1 }} <!-- Grace Hopper → G -->\n * {{ 'Jean Luc Picard' | mkInitials:3 }} <!-- JLP -->\n * ```\n */\n@Pipe({ name: 'mkInitials', pure: true })\nexport class MkInitialsPipe implements PipeTransform {\n /**\n * @param value Full name.\n * @param max Maximum number of letters; default `2`, minimum `1`.\n */\n transform(value: string | null | undefined, max = 2): string {\n if (value === null || value === undefined) return '';\n const words = String(value).trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) return '';\n const limit = Math.max(1, Math.floor(max) || 1);\n let letters: string[];\n if (words.length === 1) {\n letters = graphemes(words[0]).slice(0, limit);\n } else if (limit >= words.length) {\n letters = words.map((w) => graphemes(w)[0]);\n } else if (limit === 1) {\n letters = [graphemes(words[0])[0]];\n } else {\n // First (limit - 1) words plus the last word: \"Ada King Lovelace\" → \"AL\".\n letters = [\n ...words.slice(0, limit - 1).map((w) => graphemes(w)[0]),\n graphemes(words[words.length - 1])[0],\n ];\n }\n return letters.join('').toLocaleUpperCase();\n }\n}\n\n/** Split into user-perceived characters (code points as a fallback). */\nfunction graphemes(word: string): string[] {\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n return [...new Intl.Segmenter().segment(word)].map((s) => s.segment);\n }\n return Array.from(word);\n}\n","import { Pipe, type PipeTransform } from '@angular/core';\n\n/** Options accepted by {@link MkTruncatePipe}. */\nexport interface MkTruncateOptions {\n /** Suffix appended when text is cut. Default `'…'` (a single ellipsis character). */\n ellipsis?: string;\n /**\n * Cut at the last whitespace before the limit instead of mid-word\n * (falls back to a hard cut when the first word alone is longer).\n * Default `false`.\n */\n wordBoundary?: boolean;\n}\n\n/**\n * `mkTruncate` — shorten text to `length` characters and append an ellipsis.\n * The ellipsis counts toward the limit, so the output never exceeds\n * `length` characters; counting is grapheme-aware (emoji and accented\n * letters are one character). Text that already fits is returned as-is.\n * Pure: `null` and `undefined` render as `''`.\n *\n * ```html\n * {{ post.body | mkTruncate:80 }} <!-- hard cut at 80 -->\n * {{ post.body | mkTruncate:80:{ wordBoundary: true } }} <!-- cut at the last space -->\n * {{ hash | mkTruncate:12:{ ellipsis: '...' } }}\n * ```\n */\n@Pipe({ name: 'mkTruncate', pure: true })\nexport class MkTruncatePipe implements PipeTransform {\n /**\n * @param value Text to shorten.\n * @param length Maximum characters in the output, ellipsis included. Default `50`.\n * @param options Ellipsis string and word-boundary mode.\n */\n transform(\n value: string | null | undefined,\n length = 50,\n options: MkTruncateOptions = {},\n ): string {\n if (value === null || value === undefined) return '';\n const text = String(value);\n const limit = Math.max(0, Math.floor(length) || 0);\n const chars = graphemes(text);\n if (chars.length <= limit) return text;\n const ellipsis = options.ellipsis ?? '…';\n const budget = Math.max(0, limit - graphemes(ellipsis).length);\n let cut = chars.slice(0, budget).join('');\n if (options.wordBoundary) {\n // Only back up to a boundary when the cut lands inside a word.\n const next = chars[budget] ?? '';\n if (next && !/\\s/.test(next)) {\n const at = cut.search(/\\s+\\S*$/);\n if (at > 0) cut = cut.slice(0, at);\n }\n }\n return cut.replace(/\\s+$/, '') + ellipsis;\n }\n}\n\n/** Split into user-perceived characters (code points as a fallback). */\nfunction graphemes(text: string): string[] {\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n return [...new Intl.Segmenter().segment(text)].map((s) => s.segment);\n }\n return Array.from(text);\n}\n","import { Pipe, type PipeTransform, inject } from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkIntlCache, mkResolveLocale, mkToNumber } from './intl-utils';\n\n/**\n * Per-category word forms for {@link MkPluralizePipe}, keyed by the CLDR\n * plural categories `Intl.PluralRules` returns. `other` is required; the\n * pipe falls back to it for any category you leave out.\n *\n * ```ts\n * const files: MkPluralForms = { one: 'plik', few: 'pliki', many: 'plików', other: 'pliku' };\n * ```\n */\nexport type MkPluralForms = { other: string } & Partial<Record<Intl.LDMLPluralRule, string>>;\n\n/** Options accepted by {@link MkPluralizePipe}. */\nexport interface MkPluralizeOptions {\n /** BCP 47 locale for the plural rules and number; defaults to the i18n / runtime locale. */\n locale?: string;\n /** Prefix the formatted count (`\"3 items\"`); `false` gives just the word. Default `true`. */\n withCount?: boolean;\n}\n\nconst rules = new MkIntlCache<Intl.PluralRules>(\n (locale, options) => new Intl.PluralRules(locale, options as Intl.PluralRulesOptions),\n);\nconst numbers = new MkIntlCache<Intl.NumberFormat>(\n (locale, options) => new Intl.NumberFormat(locale, options as Intl.NumberFormatOptions),\n);\n\n/**\n * `mkPluralize` — pick the right word for a count using the locale's plural\n * rules (`Intl.PluralRules`), optionally prefixed with the formatted count.\n * The English shorthand takes a singular and an optional plural (default\n * `singular + 's'`); other languages pass a {@link MkPluralForms} map.\n * Pure: `null`, `undefined`, `''` and non-numeric counts render as `''`.\n *\n * ```html\n * {{ count | mkPluralize:'item' }} <!-- 1 item / 3 items -->\n * {{ count | mkPluralize:'entry':'entries' }} <!-- 1 entry / 2 entries -->\n * {{ count | mkPluralize:'file':null:{ withCount: false } }} <!-- files -->\n * {{ n | mkPluralize:{ one: 'plik', few: 'pliki', many: 'plików', other: 'pliku' }:null:{ locale: 'pl' } }}\n * ```\n */\n@Pipe({ name: 'mkPluralize', pure: true })\nexport class MkPluralizePipe implements PipeTransform {\n private readonly i18n = inject(MK_I18N);\n\n /**\n * @param value The count.\n * @param singular Singular word, or a full {@link MkPluralForms} map.\n * @param plural Plural word for the shorthand form; default `singular + 's'`. Ignored with a map.\n * @param options Locale and whether to prefix the count.\n */\n transform(\n value: number | string | null | undefined,\n singular: string | MkPluralForms,\n plural?: string | null,\n options: MkPluralizeOptions = {},\n ): string {\n const count = mkToNumber(value);\n if (count === null) return '';\n const locale = mkResolveLocale(this.i18n, options.locale);\n const category = rules.get(locale).select(count);\n let word: string;\n if (typeof singular === 'string') {\n word = category === 'one' ? singular : (plural ?? `${singular}s`);\n } else {\n word = singular[category] ?? singular.other;\n }\n if (options.withCount === false) return word;\n return `${numbers.get(locale).format(count)} ${word}`;\n }\n}\n","/**\n * DIRECTIVES / utilities group barrel for @mk-kit/ui.\n */\nexport * from './directives';\nexport * from './history';\nexport * from './hotkeys';\nexport * from './permissions';\nexport * from './pipes';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["formatters","numbers","graphemes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mk-kit-ui-directives.mjs","sources":["../../../projects/mk-kit/directives/directives/click-outside.ts","../../../projects/mk-kit/directives/directives/copy-to-clipboard.ts","../../../projects/mk-kit/directives/directives/autosize.ts","../../../projects/mk-kit/directives/directives/autofocus.ts","../../../projects/mk-kit/directives/directives/scrollspy.ts","../../../projects/mk-kit/directives/directives/intersect.ts","../../../projects/mk-kit/directives/directives/infinite-scroll.ts","../../../projects/mk-kit/directives/directives/ripple.ts","../../../projects/mk-kit/directives/directives/mask.ts","../../../projects/mk-kit/directives/directives/field.ts","../../../projects/mk-kit/directives/history/history.service.ts","../../../projects/mk-kit/directives/hotkeys/hotkeys.service.ts","../../../projects/mk-kit/directives/history/history-hotkeys.ts","../../../projects/mk-kit/directives/hotkeys/hotkey.directive.ts","../../../projects/mk-kit/directives/permissions/permission-policy.ts","../../../projects/mk-kit/directives/permissions/can.ts","../../../projects/mk-kit/directives/permissions/can-disable.ts","../../../projects/mk-kit/directives/pipes/intl-utils.ts","../../../projects/mk-kit/directives/pipes/currency.pipe.ts","../../../projects/mk-kit/directives/pipes/relative-time.pipe.ts","../../../projects/mk-kit/directives/pipes/file-size.pipe.ts","../../../projects/mk-kit/directives/pipes/initials.pipe.ts","../../../projects/mk-kit/directives/pipes/truncate.pipe.ts","../../../projects/mk-kit/directives/pipes/pluralize.pipe.ts","../../../projects/mk-kit/directives/index.ts","../../../projects/mk-kit/directives/mk-kit-ui-directives.ts"],"sourcesContent":["import {\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n booleanAttribute,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Emits when a pointer press lands outside the host element — the building block\n * for dismissing menus, popovers and custom dropdowns. Listens on the document\n * in the capture phase so it fires before the target handles the event.\n *\n * ```html\n * <div class=\"panel\" (mkClickOutside)=\"close()\">…</div>\n * ```\n */\n@Directive({\n selector: '[mkClickOutside]',\n exportAs: 'mkClickOutside',\n})\nexport class MkClickOutside {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Disable the listener without removing the directive. */\n readonly enabled = input(true, {\n alias: 'mkClickOutsideEnabled',\n transform: booleanAttribute,\n });\n\n /** Emits the originating event when a pointerdown occurs outside the host. */\n readonly mkClickOutside = output<PointerEvent>();\n\n private readonly onPointerdown = (event: Event): void => {\n // Defensive: the listener detaches on the effect flush after `enabled`\n // flips false, so also ignore any event racing in before that.\n if (!this.enabled()) return;\n const target = event.target as Node | null;\n if (target && !this.host.nativeElement.contains(target)) {\n this.mkClickOutside.emit(event as PointerEvent);\n }\n };\n\n constructor() {\n // The document listener exists only while `enabled()` — an idle directive\n // must not run its handler (and wake change detection) on every pointer\n // press on the page. Effect cleanup also detaches it on destroy.\n effect((onCleanup) => {\n if (!this.isBrowser || !this.enabled()) return;\n this.document.addEventListener('pointerdown', this.onPointerdown, true);\n onCleanup(() =>\n this.document.removeEventListener('pointerdown', this.onPointerdown, true),\n );\n });\n }\n}\n","import {\n DOCUMENT,\n Directive,\n PLATFORM_ID,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Copies text to the clipboard when the host is clicked. Emits `(copied)` on\n * success and `(copyFailed)` on error, and exposes a transient `copied` signal\n * (via `exportAs`) so a template can show a \"Copied!\" state without extra code.\n *\n * ```html\n * <button mkButton [mkCopyToClipboard]=\"token\" #c=\"mkCopyToClipboard\">\n * {{ c.justCopied() ? 'Copied!' : 'Copy' }}\n * </button>\n * ```\n */\n@Directive({\n selector: '[mkCopyToClipboard]',\n exportAs: 'mkCopyToClipboard',\n host: {\n '(click)': 'copy()',\n },\n})\nexport class MkCopyToClipboard {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** The text to copy. */\n readonly text = input.required<string>({ alias: 'mkCopyToClipboard' });\n /** How long (ms) the `copied` signal stays true after a successful copy. */\n readonly feedbackDuration = input(1500, {\n alias: 'mkCopyFeedbackDuration',\n transform: numberAttribute,\n });\n\n /** Emits the copied text on success. */\n readonly copied = output<string>({ alias: 'copiedText' });\n /** Emits the error on failure. */\n readonly copyFailed = output<unknown>();\n\n private readonly _copied = signal(false);\n /** True for `feedbackDuration` ms after a successful copy. */\n readonly justCopied = this._copied.asReadonly();\n\n private resetTimer?: ReturnType<typeof setTimeout>;\n\n /** Copy the text now. Bound to the host click, but callable directly too. */\n async copy(): Promise<void> {\n if (!this.isBrowser) return;\n const value = this.text();\n try {\n await this.write(value);\n this.copied.emit(value);\n this.flagCopied();\n } catch (err) {\n this.copyFailed.emit(err);\n }\n }\n\n private async write(value: string): Promise<void> {\n const clipboard = this.document.defaultView?.navigator?.clipboard;\n if (clipboard?.writeText) {\n await clipboard.writeText(value);\n return;\n }\n // Fallback for non-secure contexts: a hidden textarea + execCommand.\n const ta = this.document.createElement('textarea');\n ta.value = value;\n ta.setAttribute('readonly', '');\n ta.style.cssText = 'position:fixed;top:-9999px;opacity:0;';\n this.document.body.appendChild(ta);\n ta.select();\n const ok =\n typeof this.document.execCommand === 'function' &&\n this.document.execCommand('copy');\n ta.remove();\n if (!ok) throw new Error('Clipboard copy failed');\n }\n\n private flagCopied(): void {\n this._copied.set(true);\n if (this.resetTimer) clearTimeout(this.resetTimer);\n // Reset after the feedback window (guarded so tests without a view work).\n this.resetTimer = setTimeout(\n () => this._copied.set(false),\n this.feedbackDuration(),\n );\n }\n\n ngOnDestroy(): void {\n if (this.resetTimer) clearTimeout(this.resetTimer);\n }\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n afterNextRender,\n effect,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Grows a `<textarea>` to fit its content, between `minRows` and `maxRows`\n * (0 = unbounded). Resizes on input and when the bound value changes.\n *\n * ```html\n * <textarea mkInput mkAutosize [mkAutosizeMaxRows]=\"8\" [(ngModel)]=\"note\"></textarea>\n * ```\n */\n@Directive({\n selector: 'textarea[mkAutosize]',\n host: {\n '(input)': 'resize()',\n style: 'resize: none;',\n },\n})\nexport class MkAutosize {\n private readonly el = inject<ElementRef<HTMLTextAreaElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Minimum height in rows. */\n readonly minRows = input(1, {\n alias: 'mkAutosizeMinRows',\n transform: numberAttribute,\n });\n /** Maximum height in rows before scrolling (0 = unbounded). */\n readonly maxRows = input(0, {\n alias: 'mkAutosizeMaxRows',\n transform: numberAttribute,\n });\n /** Bind the textarea's value so programmatic changes trigger a resize. */\n readonly value = input<unknown>(undefined, { alias: 'mkAutosizeValue' });\n\n constructor() {\n afterNextRender(() => this.resize());\n // Re-fit whenever the bound value (or the row bounds) change.\n effect(() => {\n this.value();\n this.minRows();\n this.maxRows();\n if (this.isBrowser) queueMicrotask(() => this.resize());\n });\n }\n\n /** Recompute the textarea height from its content. */\n resize(): void {\n if (!this.isBrowser) return;\n const ta = this.el.nativeElement;\n const style = this.document.defaultView?.getComputedStyle(ta);\n const line = parseFloat(style?.lineHeight ?? '') || 20;\n const vPad =\n parseFloat(style?.paddingTop ?? '0') +\n parseFloat(style?.paddingBottom ?? '0') +\n parseFloat(style?.borderTopWidth ?? '0') +\n parseFloat(style?.borderBottomWidth ?? '0');\n\n ta.style.height = 'auto';\n const content = ta.scrollHeight;\n const min = this.minRows() * line + vPad;\n const max = this.maxRows() > 0 ? this.maxRows() * line + vPad : Infinity;\n const height = Math.min(max, Math.max(min, content));\n ta.style.height = `${height}px`;\n ta.style.overflowY = content > max ? 'auto' : 'hidden';\n }\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Focuses the host element once it renders. Handy for dialogs, drawers and\n * newly-revealed forms. Disable conditionally with `[mkAutofocus]=\"cond\"`.\n *\n * ```html\n * <input mkInput mkAutofocus />\n * <input mkInput [mkAutofocus]=\"isEditing()\" [mkAutofocusDelay]=\"100\" />\n * ```\n */\n@Directive({\n selector: '[mkAutofocus]',\n})\nexport class MkAutofocus {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Whether to focus. Bare `mkAutofocus` = true. */\n readonly enabled = input(true, {\n alias: 'mkAutofocus',\n transform: booleanAttribute,\n });\n /** Delay before focusing, in ms (e.g. to wait out an entrance animation). */\n readonly delay = input(0, {\n alias: 'mkAutofocusDelay',\n transform: numberAttribute,\n });\n\n private timeoutId?: number;\n\n constructor() {\n afterNextRender(() => {\n if (!this.isBrowser || !this.enabled()) return;\n if (this.delay() > 0) {\n this.timeoutId = this.document.defaultView?.setTimeout(\n () => this.focus(),\n this.delay(),\n );\n } else {\n this.focus();\n }\n });\n }\n\n private focus(): void {\n this.el.nativeElement.focus();\n }\n\n ngOnDestroy(): void {\n if (this.timeoutId != null) {\n this.document.defaultView?.clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n }\n }\n}\n","import {\n DOCUMENT,\n Directive,\n PLATFORM_ID,\n afterNextRender,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Scrollspy — tracks which section is currently in view and exposes its `id`,\n * so a table of contents / \"on this page\" nav can highlight the active link.\n *\n * Apply it to any element (typically the nav) and point `mkScrollspy` at a CSS\n * selector matching the section elements to watch (each needs an `id`). Read the\n * active id via the exported instance, or bind `(activeChange)`:\n *\n * ```html\n * <nav mkScrollspy=\"main :is(h2, h3)[id]\" #spy=\"mkScrollspy\">\n * <a href=\"#intro\" [class.is-active]=\"spy.activeId() === 'intro'\">Intro</a>\n * …\n * </nav>\n * ```\n *\n * A section activates once its top passes `offset` px below the top of the\n * scroll root (default the viewport). When scrolling through a gap between\n * sections the previous one stays active until the next crosses the line.\n */\n@Directive({\n selector: '[mkScrollspy]',\n exportAs: 'mkScrollspy',\n})\nexport class MkScrollspy {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** CSS selector for the section elements to track (queried within `root`). */\n readonly sections = input.required<string>({ alias: 'mkScrollspy' });\n /**\n * Scroll container. Sections are queried inside it and its top edge is the\n * activation reference. Defaults to the whole document / viewport.\n */\n readonly root = input<HTMLElement | null>(null);\n /**\n * Distance (px) below the scroll root's top at which a section becomes\n * active. Raise it to account for a sticky header.\n */\n readonly offset = input(96);\n\n /** The id of the currently active section (`null` before the first one). */\n readonly activeId = signal<string | null>(null);\n /** Emitted whenever the active section changes. */\n readonly activeChange = output<string | null>();\n\n private scrollSource?: EventTarget;\n\n constructor() {\n // afterNextRender runs once inputs are bound, so root()/sections() resolve\n // and the projected sections exist in the DOM.\n afterNextRender(() => {\n if (!this.isBrowser) return;\n const view = this.document.defaultView;\n this.scrollSource = this.root() ?? view ?? undefined;\n this.scrollSource?.addEventListener('scroll', this.onScroll, {\n passive: true,\n });\n view?.addEventListener('resize', this.onScroll);\n this.compute();\n });\n }\n\n /** Re-evaluate the active section (call after sections change). */\n refresh(): void {\n if (this.isBrowser) this.compute();\n }\n\n private querySections(): HTMLElement[] {\n const rootEl: ParentNode = this.root() ?? this.document;\n return Array.from(rootEl.querySelectorAll<HTMLElement>(this.sections()));\n }\n\n private computeRaf: number | null = null;\n /** rAF-coalesced — several scroll ticks per frame trigger one layout read. */\n private readonly onScroll = (): void => {\n if (this.computeRaf != null) return;\n this.computeRaf =\n this.document.defaultView?.requestAnimationFrame(() => {\n this.computeRaf = null;\n this.compute();\n }) ?? null;\n };\n\n private compute(): void {\n const sections = this.querySections();\n if (!sections.length) {\n this.setActive(null);\n return;\n }\n // At the very bottom the final section may be too short to reach the line —\n // activate it explicitly so the last nav item can still highlight.\n if (this.atBottom()) {\n this.setActive(sections[sections.length - 1].id || null);\n return;\n }\n const rootEl = this.root();\n const line = (rootEl ? rootEl.getBoundingClientRect().top : 0) + this.offset();\n\n // Active = the last section whose top has crossed the activation line.\n let active: HTMLElement | null = null;\n for (const section of sections) {\n if (section.getBoundingClientRect().top - line <= 1) active = section;\n else break;\n }\n // Nothing crossed yet (still above the first section) → highlight the first.\n this.setActive((active ?? sections[0]).id || null);\n }\n\n /** Whether the scroll root is scrolled to (or within 1px of) its bottom. */\n private atBottom(): boolean {\n const root = this.root();\n if (root) {\n return root.scrollTop + root.clientHeight >= root.scrollHeight - 1;\n }\n const view = this.document.defaultView;\n if (!view) return false;\n const doc = this.document.documentElement;\n return view.scrollY + view.innerHeight >= doc.scrollHeight - 1;\n }\n\n private setActive(id: string | null): void {\n if (this.activeId() === id) return;\n this.activeId.set(id);\n this.activeChange.emit(id);\n }\n\n ngOnDestroy(): void {\n if (this.computeRaf != null) {\n this.document.defaultView?.cancelAnimationFrame(this.computeRaf);\n this.computeRaf = null;\n }\n this.scrollSource?.removeEventListener('scroll', this.onScroll);\n this.document.defaultView?.removeEventListener('resize', this.onScroll);\n }\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n Injector,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Intersect — a thin `IntersectionObserver` wrapper. Emits `(mkIntersect)` with\n * the host's visibility whenever it enters or leaves the viewport (or `root`),\n * and exposes an `intersecting` signal via `exportAs`. Set `once` to fire a\n * single time and disconnect — the primitive for reveal-on-scroll animations\n * and lazy loading.\n *\n * ```html\n * <img [attr.src]=\"loaded() ? src : null\" mkIntersect once\n * (mkIntersect)=\"loaded.set(true)\" />\n *\n * <div mkIntersect #io=\"mkIntersect\" [class.in-view]=\"io.intersecting()\">…</div>\n * ```\n */\n@Directive({\n selector: '[mkIntersect]',\n exportAs: 'mkIntersect',\n})\nexport class MkIntersect {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Element used as the viewport for the check (defaults to the browser one). */\n readonly root = input<HTMLElement | null>(null);\n /** Margin grown/shrunk around the root before computing intersection. */\n readonly rootMargin = input('0px');\n /** Visibility ratio(s) at which the observer fires. */\n readonly threshold = input<number | number[]>(0);\n /** Emit the first time the host becomes visible, then disconnect. */\n readonly once = input(false, { transform: booleanAttribute });\n\n /** Emits the host's `isIntersecting` state on every change. */\n readonly mkIntersect = output<boolean>();\n /** The current visibility, also readable via `exportAs`. */\n readonly intersecting = signal(false);\n\n private observer?: IntersectionObserver;\n\n constructor() {\n afterNextRender(() => {\n if (!this.isBrowser || typeof IntersectionObserver === 'undefined') return;\n this.observer = new IntersectionObserver(\n (entries) => this.onEntries(entries),\n {\n root: this.root(),\n rootMargin: this.rootMargin(),\n threshold: this.threshold(),\n },\n );\n this.observer.observe(this.host.nativeElement);\n }, { injector: this.injector });\n }\n\n private onEntries(entries: IntersectionObserverEntry[]): void {\n // Ignore any callback queued before we disconnected (e.g. after `once`).\n if (!this.observer) return;\n const entry = entries[entries.length - 1];\n const visible = entry.isIntersecting;\n if (visible === this.intersecting()) return;\n this.intersecting.set(visible);\n this.mkIntersect.emit(visible);\n if (visible && this.once()) this.disconnect();\n }\n\n private disconnect(): void {\n this.observer?.disconnect();\n this.observer = undefined;\n }\n\n ngOnDestroy(): void {\n this.disconnect();\n }\n}\n","import {\n Directive,\n ElementRef,\n PLATFORM_ID,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n numberAttribute,\n output,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * InfiniteScroll — emits `(mkInfiniteScroll)` when the host scroll container is\n * scrolled within `distance` px of its bottom, so a list can load its next\n * page. Apply it to the scrollable element (`overflow: auto`). It fires once per\n * approach and re-arms after you scroll back up past the threshold, so a single\n * gesture never triggers repeated loads. Set `disabled` while a page is loading\n * or once everything is loaded.\n *\n * ```html\n * <div class=\"feed\" mkInfiniteScroll [disabled]=\"loading() || done()\"\n * (mkInfiniteScroll)=\"loadMore()\">\n * @for (item of items(); track item.id) { … }\n * </div>\n * ```\n */\n@Directive({\n selector: '[mkInfiniteScroll]',\n exportAs: 'mkInfiniteScroll',\n})\nexport class MkInfiniteScroll {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Distance (px) from the bottom at which the output fires. */\n readonly distance = input(200, { transform: numberAttribute });\n /** Pause firing (e.g. while a page is loading or all items are loaded). */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Emitted when the host is scrolled near its bottom. */\n readonly mkInfiniteScroll = output<void>();\n\n /** Whether the next bottom-approach is allowed to fire. */\n private armed = true;\n\n constructor() {\n afterNextRender(() => {\n if (!this.isBrowser) return;\n this.host.nativeElement.addEventListener('scroll', this.onScroll, {\n passive: true,\n });\n // Fire immediately if the initial content doesn't fill the container.\n this.check();\n });\n }\n\n private readonly onScroll = (): void => this.check();\n\n private check(): void {\n const el = this.host.nativeElement;\n const remaining = el.scrollHeight - el.scrollTop - el.clientHeight;\n if (remaining > this.distance()) {\n // Scrolled away from the bottom — allow the next approach to fire.\n this.armed = true;\n return;\n }\n if (!this.armed || this.disabled()) return;\n this.armed = false;\n this.mkInfiniteScroll.emit();\n }\n\n ngOnDestroy(): void {\n this.host.nativeElement.removeEventListener('scroll', this.onScroll);\n }\n}\n","import {\n DOCUMENT,\n Directive,\n ElementRef,\n PLATFORM_ID,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Ripple — a Material-style touch ripple that expands from the pointer on press.\n * Apply it to any pressable surface (button, list item, card). The directive\n * makes the host a positioned, clipping container and paints a short-lived wave;\n * it respects `prefers-reduced-motion`.\n *\n * ```html\n * <button mkRipple>Save</button>\n * <li mkRipple mkRippleColor=\"var(--mk-primary)\">Item</li>\n * ```\n */\n@Directive({\n selector: '[mkRipple]',\n host: {\n '(pointerdown)': 'spawn($event)',\n },\n})\nexport class MkRipple {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /** Wave colour (any CSS colour). Defaults to the host's `currentColor`. */\n readonly color = input<string>('', { alias: 'mkRippleColor' });\n /** Start every ripple from the centre instead of the pointer. */\n readonly centered = input(false, {\n alias: 'mkRippleCentered',\n transform: booleanAttribute,\n });\n /** Turn the effect off. */\n readonly disabled = input(false, {\n alias: 'mkRippleDisabled',\n transform: booleanAttribute,\n });\n\n protected spawn(event: PointerEvent): void {\n if (!this.isBrowser || this.disabled()) return;\n const el = this.host.nativeElement;\n const view = this.document.defaultView;\n if (view?.matchMedia?.('(prefers-reduced-motion: reduce)').matches) return;\n\n // Make the host a positioned, clipping container (idempotent).\n const cs = view?.getComputedStyle(el);\n if (cs && cs.position === 'static') el.style.position = 'relative';\n el.style.overflow = 'hidden';\n\n const rect = el.getBoundingClientRect();\n const x = this.centered() ? rect.width / 2 : event.clientX - rect.left;\n const y = this.centered() ? rect.height / 2 : event.clientY - rect.top;\n // Radius that reaches the farthest corner from the origin.\n const radius = Math.hypot(\n Math.max(x, rect.width - x),\n Math.max(y, rect.height - y),\n );\n\n const wave = this.document.createElement('span');\n wave.className = 'mk-ripple__wave';\n Object.assign(wave.style, {\n position: 'absolute',\n left: `${x - radius}px`,\n top: `${y - radius}px`,\n width: `${radius * 2}px`,\n height: `${radius * 2}px`,\n borderRadius: '50%',\n background: this.color() || 'currentColor',\n pointerEvents: 'none',\n transform: 'scale(0)',\n opacity: '0.3',\n });\n el.appendChild(wave);\n\n const cleanup = () => wave.remove();\n const anim = wave.animate?.(\n [\n { transform: 'scale(0)', opacity: 0.3 },\n { transform: 'scale(1)', opacity: 0 },\n ],\n { duration: 500, easing: 'ease-out' },\n );\n if (anim) anim.onfinish = cleanup;\n // Fallback removal in case the animation never resolves (or is unsupported).\n view?.setTimeout(cleanup, 650);\n }\n}\n","import {\n Directive,\n ElementRef,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\n\n/** Result of applying a mask: the formatted string and its raw token chars. */\nexport interface MkMaskResult {\n masked: string;\n unmasked: string;\n}\n\n/** Token → predicate for the character it accepts. */\nconst MK_MASK_TOKENS: Record<string, RegExp> = {\n '0': /[0-9]/, // digit\n A: /[A-Za-z]/, // letter\n '*': /[0-9A-Za-z]/, // alphanumeric\n};\n\nconst ALNUM = /[0-9A-Za-z]/;\n\n/**\n * Format `value` against a mask `pattern`. Pattern tokens: `0` = digit,\n * `A` = letter, `*` = alphanumeric; any other character is a literal that is\n * inserted automatically. Characters that don't fit the current token are\n * skipped, so pasted / mistyped input is coerced into shape.\n *\n * Returns the `masked` (display) string and the `unmasked` string (only the\n * token characters — the value you usually store).\n */\nexport function mkApplyMask(value: string, pattern: string): MkMaskResult {\n let masked = '';\n let unmasked = '';\n let vi = 0;\n for (let pi = 0; pi < pattern.length; pi++) {\n const pc = pattern[pi];\n const rule = MK_MASK_TOKENS[pc];\n if (rule) {\n while (vi < value.length && !rule.test(value[vi])) vi++;\n if (vi >= value.length) break;\n masked += value[vi];\n unmasked += value[vi];\n vi++;\n } else {\n // Stop rather than emit a trailing literal with no content after it.\n if (vi >= value.length) break;\n masked += pc;\n if (value[vi] === pc) vi++;\n }\n }\n return { masked, unmasked };\n}\n\n/**\n * Compute where the caret belongs after re-masking: after the same number of\n * value (alphanumeric) characters the caret used to sit behind, absorbing any\n * literal(s) that immediately follow — so typing \"1\" in \"(0)\" lands the caret\n * after the \"(\". Shared by {@link MkMask} and the masked form controls.\n */\nexport function mkMaskCaret(\n oldValue: string,\n oldCaret: number,\n masked: string,\n): number {\n const before = oldValue.slice(0, oldCaret);\n const target = (before.match(/[0-9A-Za-z]/g) ?? []).length;\n let pos = 0;\n let seen = 0;\n while (pos < masked.length && seen < target) {\n if (ALNUM.test(masked[pos])) seen++;\n pos++;\n }\n while (pos < masked.length && !ALNUM.test(masked[pos])) pos++;\n return pos;\n}\n\n/**\n * Mask — formats an `<input>` as the user types against a token pattern\n * (phone, card, date, custom). Apply it to any text input; read the raw value\n * via `(unmaskedChange)` (or the exported `unmasked` getter) and the formatted\n * value via `(maskedChange)`.\n *\n * ```html\n * <input mkInput mkMask=\"(000) 000-0000\" (unmaskedChange)=\"phone.set($event)\" />\n * <input mkInput mkMask=\"0000 0000 0000 0000\" />\n * ```\n */\n@Directive({\n selector: '[mkMask]',\n exportAs: 'mkMask',\n host: {\n '(input)': 'onInput()',\n '[attr.inputmode]': 'inputMode()',\n },\n})\nexport class MkMask {\n private readonly host = inject<ElementRef<HTMLInputElement>>(ElementRef);\n\n /** The mask pattern (token string). */\n readonly pattern = input.required<string>({ alias: 'mkMask' });\n /** Override the derived `inputmode` (`numeric` for digit-only masks). */\n readonly maskInputmode = input<string | null>(null, {\n alias: 'mkMaskInputmode',\n });\n\n /** Mobile keyboard hint: numeric for digit-only patterns unless overridden. */\n protected readonly inputMode = computed(\n () => this.maskInputmode() ?? (/[A*]/.test(this.pattern()) ? 'text' : 'numeric'),\n );\n\n /** The formatted value, on every change. */\n readonly maskedChange = output<string>();\n /** The raw value (token characters only), on every change. */\n readonly unmaskedChange = output<string>();\n\n private _masked = '';\n private _unmasked = '';\n\n /** The current formatted value. */\n get value(): string {\n return this._masked;\n }\n /** The current raw value (token characters only). */\n get unmasked(): string {\n return this._unmasked;\n }\n\n protected onInput(): void {\n const el = this.host.nativeElement;\n const oldValue = el.value;\n const oldCaret = el.selectionStart ?? oldValue.length;\n const { masked, unmasked } = mkApplyMask(oldValue, this.pattern());\n\n el.value = masked;\n this.setCaret(el, oldValue, oldCaret, masked);\n\n if (masked === this._masked) return;\n this._masked = masked;\n this._unmasked = unmasked;\n this.maskedChange.emit(masked);\n this.unmaskedChange.emit(unmasked);\n }\n\n /** Position the caret after the same number of value chars as before. */\n private setCaret(\n el: HTMLInputElement,\n oldValue: string,\n oldCaret: number,\n masked: string,\n ): void {\n const pos = mkMaskCaret(oldValue, oldCaret, masked);\n try {\n el.setSelectionRange(pos, pos);\n } catch {\n // Some input types (e.g. number, email) don't support selection.\n }\n }\n}\n","import { Directive, ElementRef, computed, inject, input } from '@angular/core';\n\n/** The attributes a field preset can control. */\nconst MK_FIELD_ATTRS = [\n 'type',\n 'inputmode',\n 'autocomplete',\n 'autocapitalize',\n 'autocorrect',\n 'spellcheck',\n 'enterkeyhint',\n] as const;\n\ntype MkFieldAttr = (typeof MK_FIELD_ATTRS)[number];\n\n/** The attribute bundle applied for one `MkFieldKind`. Omitted = not set. */\nexport type MkFieldPreset = Partial<Record<MkFieldAttr, string>>;\n\n/** Semantic field kinds understood by {@link MkField}. */\nexport type MkFieldKind =\n | 'email'\n | 'tel'\n | 'url'\n | 'search'\n | 'numeric'\n | 'given-name'\n | 'family-name'\n | 'name'\n | 'organization'\n | 'street'\n | 'address-line1'\n | 'address-line2'\n | 'city'\n | 'region'\n | 'country'\n | 'postal-code'\n | 'username'\n | 'one-time-code';\n\n/**\n * The attribute bundle per field kind. Exported so hosts can inspect what a\n * kind resolves to, or spread an entry into their own preset table.\n *\n * `autocorrect` (non-standard, honoured by iOS Safari) is set to `off`\n * wherever `spellcheck` is `false`.\n */\nexport const MK_FIELD_PRESETS: Readonly<Record<MkFieldKind, MkFieldPreset>> = {\n email: {\n type: 'email',\n inputmode: 'email',\n autocomplete: 'email',\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n },\n tel: { type: 'tel', inputmode: 'tel', autocomplete: 'tel' },\n url: {\n type: 'url',\n inputmode: 'url',\n autocomplete: 'url',\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n },\n search: {\n type: 'search',\n inputmode: 'search',\n autocomplete: 'off',\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n enterkeyhint: 'search',\n },\n numeric: { inputmode: 'numeric' },\n 'given-name': {\n type: 'text',\n autocomplete: 'given-name',\n autocapitalize: 'words',\n },\n 'family-name': {\n type: 'text',\n autocomplete: 'family-name',\n autocapitalize: 'words',\n },\n name: { type: 'text', autocomplete: 'name', autocapitalize: 'words' },\n organization: {\n type: 'text',\n autocomplete: 'organization',\n autocapitalize: 'words',\n },\n street: {\n type: 'text',\n autocomplete: 'street-address',\n autocapitalize: 'words',\n },\n 'address-line1': {\n type: 'text',\n autocomplete: 'address-line1',\n autocapitalize: 'words',\n },\n 'address-line2': {\n type: 'text',\n autocomplete: 'address-line2',\n autocapitalize: 'words',\n },\n city: {\n type: 'text',\n autocomplete: 'address-level2',\n autocapitalize: 'words',\n },\n region: {\n type: 'text',\n autocomplete: 'address-level1',\n autocapitalize: 'words',\n },\n country: {\n type: 'text',\n autocomplete: 'country-name',\n autocapitalize: 'words',\n },\n 'postal-code': {\n type: 'text',\n autocomplete: 'postal-code',\n autocapitalize: 'characters',\n autocorrect: 'off',\n spellcheck: 'false',\n },\n username: {\n type: 'text',\n autocomplete: 'username',\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n },\n 'one-time-code': {\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'one-time-code',\n autocapitalize: 'off',\n autocorrect: 'off',\n spellcheck: 'false',\n },\n};\n\n/**\n * Field — applies the semantic mobile-keyboard and autofill attribute bundle\n * for a kind of field, so you never again ship an email input that iOS\n * capitalises or an address input the browser can't autofill.\n *\n * It sets `type`, `inputmode`, `autocomplete`, `autocapitalize`, `autocorrect`,\n * `spellcheck` and `enterkeyhint` (see {@link MK_FIELD_PRESETS}) and nothing\n * else — no styling, no value handling — so it composes with `mkInput`,\n * `mk-form-field`, `[(ngModel)]` and reactive forms untouched.\n *\n * ```html\n * <input mkInput mkField=\"email\" formControlName=\"email\" />\n * <input mkInput mkField=\"street\" formControlName=\"street\" />\n * <input mkInput [mkField]=\"isCompany() ? 'organization' : 'name'\" />\n * ```\n *\n * ## Precedence\n *\n * A **static** attribute you write on the element wins: the directive reads the\n * seven attributes once at construction (before any host binding has run) and\n * keeps whatever was already there, filling in only what you left out. So\n * `<input mkField=\"username\" type=\"password\" />` stays a password field but\n * still gets `autocomplete=\"username\"`, `autocapitalize=\"off\"`, …\n *\n * A **template binding** for the same attribute (`[attr.autocomplete]=\"…\"`)\n * does *not* win — Angular applies directive host bindings after template\n * bindings, so the preset overwrites it. Use a static attribute to override, or\n * drop `mkField` and set the bundle yourself.\n */\n@Directive({\n selector: '[mkField]',\n host: {\n '[attr.type]': 'attrs().type',\n '[attr.inputmode]': 'attrs().inputmode',\n '[attr.autocomplete]': 'attrs().autocomplete',\n '[attr.autocapitalize]': 'attrs().autocapitalize',\n '[attr.autocorrect]': 'attrs().autocorrect',\n '[attr.spellcheck]': 'attrs().spellcheck',\n '[attr.enterkeyhint]': 'attrs().enterkeyhint',\n },\n})\nexport class MkField {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Which kind of field this is. */\n readonly kind = input.required<MkFieldKind>({ alias: 'mkField' });\n\n /**\n * Attributes the consumer put on the element themselves, read once before\n * any host binding has run — these always win over the preset.\n */\n private readonly authored: MkFieldPreset = Object.fromEntries(\n MK_FIELD_ATTRS.map((name) => [name, this.el.nativeElement.getAttribute(name)]).filter(\n ([, value]) => value !== null,\n ),\n );\n\n /** The resolved attribute bundle: authored value, else preset, else unset. */\n protected readonly attrs = computed<Record<MkFieldAttr, string | null>>(() => {\n const preset = MK_FIELD_PRESETS[this.kind()] ?? {};\n const resolved = {} as Record<MkFieldAttr, string | null>;\n for (const name of MK_FIELD_ATTRS) {\n resolved[name] = this.authored[name] ?? preset[name] ?? null;\n }\n return resolved;\n });\n}\n","import { Injectable, computed, signal, type Signal } from '@angular/core';\n\n/**\n * A single undoable step recorded in an {@link MkHistoryStack}.\n *\n * The **first** execution of an action is the caller's job — `push()` records\n * an action that has *already happened*. `undo()` reverts it; `redo()` applies\n * it again after an undo.\n */\nexport interface MkHistoryEntry {\n /** Human label for menus/tooltips (\"Delete row\", \"Move card\"). */\n label: string;\n /** Revert the action. */\n undo(): void;\n /** Re-apply the action after an undo. */\n redo(): void;\n}\n\n/**\n * MkHistoryStack — a pure, signal-based, linear undo/redo command stack with\n * no Angular DI involved. Instantiate it directly for a local editing session\n * (a dialog, a canvas, a form wizard), or use the app-wide singleton\n * {@link MkHistoryService}.\n *\n * ```ts\n * const stack = new MkHistoryStack();\n * deleteRow(row); // 1. do the work yourself\n * stack.push({ // 2. record how to revert/redo it\n * label: 'Delete row',\n * undo: () => insertRow(row),\n * redo: () => deleteRow(row),\n * });\n * stack.undo(); // row is back\n * ```\n *\n * ### Linear history\n * `push()` clears the redo branch — after undoing twice and pushing a new\n * entry, the two undone entries are gone (the standard editor model).\n *\n * ### ⚠️ Re-entrancy guard — the classic footgun\n * Pushes made **while** `undo()` or `redo()` is executing are **silently\n * ignored**. Naive consumers often record history from a generic change\n * handler (`(cellEdit)`, `valueChanges`, …); when an undo replays the old\n * value, that same handler fires again and would push a mirror entry,\n * corrupting the stack into an undo/redo ping-pong. The guard makes that\n * pattern safe by construction. If you need to record something new in\n * response to an undo, do it after `undo()` returns.\n */\nexport class MkHistoryStack {\n private readonly undoStack = signal<readonly MkHistoryEntry[]>([]);\n private readonly redoStack = signal<readonly MkHistoryEntry[]>([]);\n\n /** True while an entry's `undo()`/`redo()` is running (re-entrancy guard). */\n private replaying = false;\n\n /** Depth of nested `batch()` calls; > 0 while a batch is collecting. */\n private batchDepth = 0;\n private batchLabel = '';\n private batchBuffer: MkHistoryEntry[] = [];\n\n private maxSize = 100;\n\n /** True when at least one entry can be undone. */\n readonly canUndo: Signal<boolean> = computed(() => this.undoStack().length > 0);\n /** True when at least one undone entry can be redone. */\n readonly canRedo: Signal<boolean> = computed(() => this.redoStack().length > 0);\n /** Label of the entry `undo()` would revert, or `null` (\"Undo *Delete row*\"). */\n readonly undoLabel: Signal<string | null> = computed(\n () => this.undoStack().at(-1)?.label ?? null,\n );\n /** Label of the entry `redo()` would re-apply, or `null`. */\n readonly redoLabel: Signal<string | null> = computed(\n () => this.redoStack().at(-1)?.label ?? null,\n );\n /** Number of undoable entries currently on the stack. */\n readonly size: Signal<number> = computed(() => this.undoStack().length);\n\n /**\n * Maximum number of undoable entries kept (default `100`). When exceeded the\n * **oldest** entries are dropped. Settable at any time; lowering it trims\n * the stack immediately. Values below 1 are clamped to 1.\n */\n get limit(): number {\n return this.maxSize;\n }\n set limit(value: number) {\n this.maxSize = Math.max(1, Math.floor(value));\n this.undoStack.update((stack) =>\n stack.length > this.maxSize ? stack.slice(stack.length - this.maxSize) : stack,\n );\n }\n\n /**\n * Record an already-performed action. Clears the redo branch and evicts the\n * oldest entry beyond {@link limit}. Ignored while `undo()`/`redo()` is\n * executing (see the re-entrancy note on the class) — inside a `batch()` the\n * entry is collected into the composite instead.\n */\n push(entry: MkHistoryEntry): void {\n if (this.replaying) return;\n if (this.batchDepth > 0) {\n this.batchBuffer.push(entry);\n return;\n }\n this.commit(entry);\n }\n\n /** Undo the most recent entry. Returns `false` when there is nothing to undo. */\n undo(): boolean {\n const entry = this.undoStack().at(-1);\n if (!entry) return false;\n this.undoStack.update((stack) => stack.slice(0, -1));\n this.replaying = true;\n try {\n entry.undo();\n } finally {\n this.replaying = false;\n }\n this.redoStack.update((stack) => [...stack, entry]);\n return true;\n }\n\n /** Redo the most recently undone entry. Returns `false` when there is nothing to redo. */\n redo(): boolean {\n const entry = this.redoStack().at(-1);\n if (!entry) return false;\n this.redoStack.update((stack) => stack.slice(0, -1));\n this.replaying = true;\n try {\n entry.redo();\n } finally {\n this.replaying = false;\n }\n this.undoStack.update((stack) => [...stack, entry]);\n return true;\n }\n\n /** Drop all entries (both branches) and any in-flight batch collection. */\n clear(): void {\n this.undoStack.set([]);\n this.redoStack.set([]);\n this.batchBuffer = [];\n }\n\n /**\n * Group every `push()` made during `work()` into **one** undoable step.\n * Undo runs the children in reverse order; redo runs them forward. Nested\n * `batch()` calls flatten into the outermost batch (its label wins). An\n * empty batch records nothing. Returns `work()`'s result; if `work()`\n * throws, entries pushed before the throw are still committed.\n */\n batch<T>(label: string, work: () => T): T {\n if (this.replaying) return work();\n this.batchDepth++;\n if (this.batchDepth === 1) {\n this.batchLabel = label;\n this.batchBuffer = [];\n }\n try {\n return work();\n } finally {\n this.batchDepth--;\n if (this.batchDepth === 0 && this.batchBuffer.length > 0) {\n const children = this.batchBuffer;\n this.batchBuffer = [];\n this.commit({\n label: this.batchLabel,\n undo: () => {\n for (let i = children.length - 1; i >= 0; i--) children[i].undo();\n },\n redo: () => {\n for (const child of children) child.redo();\n },\n });\n }\n }\n }\n\n /**\n * Create an **independent** stack with the same API — e.g. for a dialog's\n * local editing session that should not pollute the app-wide history.\n * Discard it (or `clear()` it) when the session ends.\n */\n createScope(): MkHistoryStack {\n return new MkHistoryStack();\n }\n\n /** Append to the undo stack: clear the redo branch, evict beyond the limit. */\n private commit(entry: MkHistoryEntry): void {\n this.redoStack.set([]);\n this.undoStack.update((stack) => {\n const next = [...stack, entry];\n return next.length > this.maxSize ? next.slice(next.length - this.maxSize) : next;\n });\n }\n}\n\n/**\n * MkHistoryService — the app-wide {@link MkHistoryStack} singleton. Inject it\n * anywhere; call {@link MkHistoryStack.createScope} for an isolated local\n * stack, or wire `mod+z` / `mod+shift+z` / `mod+y` with\n * {@link registerHistoryHotkeys}.\n *\n * ### Recipe — undoable `mk-table` cell edits\n * Wire the table's `(cellEdit)` output so each saved cell becomes one\n * undoable step. Apply the edit yourself first (`push()` records an action\n * that already happened), and match rows by a stable id — the row object is\n * replaced by the immutable update:\n *\n * ```ts\n * // <mk-table [rows]=\"rows()\" [columns]=\"columns\" (cellEdit)=\"onCellEdit($event)\" />\n * private readonly history = inject(MkHistoryService);\n * readonly rows = signal<Order[]>([...]);\n *\n * onCellEdit(edit: MkCellEdit<Order>): void {\n * const previous = edit.row[edit.key as keyof Order];\n * const apply = (value: unknown) =>\n * this.rows.update((rows) =>\n * rows.map((r) => (r.id === edit.row.id ? { ...r, [edit.key]: value } : r)),\n * );\n * apply(edit.value); // first execution is the caller's job\n * this.history.push({\n * label: `Edit ${edit.key}`,\n * undo: () => apply(previous),\n * redo: () => apply(edit.value),\n * });\n * }\n * ```\n *\n * Undoing replays the old value through the same `apply` function; if your\n * change pipeline re-emits into `onCellEdit` during that replay, the\n * re-entrancy guard drops the spurious `push()` (see {@link MkHistoryStack}).\n */\n@Injectable({ providedIn: 'root' })\nexport class MkHistoryService extends MkHistoryStack {}\n","import { DOCUMENT, Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * A single hotkey combo parsed into a normalized key + modifier flags.\n * Produced by {@link mkParseHotkey}; consumed by {@link mkMatchesHotkey}.\n */\nexport interface MkParsedHotkey {\n /** The non-modifier key, lowercased and alias-normalized (e.g. `k`, `escape`, `?`). */\n key: string;\n /** `mod` — Cmd on macOS, Ctrl elsewhere. */\n mod: boolean;\n /** The Control key. */\n ctrl: boolean;\n /** The Meta / Command / Windows key. */\n meta: boolean;\n /** The Alt / Option key. */\n alt: boolean;\n /** The Shift key. */\n shift: boolean;\n}\n\n/** Options accepted by {@link MkHotkeysService.register}. */\nexport interface MkHotkeyOptions {\n /** Call `preventDefault()` on the event when the hotkey fires. Default `false`. */\n preventDefault?: boolean;\n /** Also fire while an editable field (input/textarea/select/contentEditable) is focused. Default `false`. */\n allowInInput?: boolean;\n}\n\n/** Tokens that count as modifiers rather than the trigger key. */\nconst MODIFIERS = new Set(['mod', 'ctrl', 'control', 'meta', 'cmd', 'command', 'alt', 'option', 'shift']);\n\n/** Human-friendly aliases mapped onto their `KeyboardEvent.key` (lowercased) form. */\nconst KEY_ALIASES: Record<string, string> = {\n esc: 'escape',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n down: 'arrowdown',\n left: 'arrowleft',\n right: 'arrowright',\n del: 'delete',\n return: 'enter',\n plus: '+',\n};\n\n/** Keys that are themselves modifiers — ignored as sequence/trigger keys. */\nconst MODIFIER_KEYS = new Set(['control', 'shift', 'alt', 'meta', 'os', 'altgraph']);\n\n/** True on Apple platforms, where `mod` maps to the Command (meta) key. */\nexport function mkIsMacPlatform(): boolean {\n return typeof navigator !== 'undefined' && (navigator.platform ?? '').includes('Mac');\n}\n\n/**\n * Parse a single hotkey combo (e.g. `'mod+k'`, `'ctrl+shift+p'`, `'?'`) into a\n * structured {@link MkParsedHotkey}. Tokens are joined by `+`; the last\n * non-modifier token is the trigger key. Pure and SSR-safe.\n *\n * For a chord (space-separated sequence like `'g i'`), split on whitespace and\n * parse each step — {@link MkHotkeysService} does this for you.\n */\nexport function mkParseHotkey(combo: string): MkParsedHotkey {\n const parsed: MkParsedHotkey = {\n key: '',\n mod: false,\n ctrl: false,\n meta: false,\n alt: false,\n shift: false,\n };\n const tokens = combo\n .trim()\n .split('+')\n .map((t) => t.trim().toLowerCase())\n .filter((t) => t.length > 0);\n\n for (const token of tokens) {\n switch (token) {\n case 'mod':\n parsed.mod = true;\n break;\n case 'ctrl':\n case 'control':\n parsed.ctrl = true;\n break;\n case 'meta':\n case 'cmd':\n case 'command':\n parsed.meta = true;\n break;\n case 'alt':\n case 'option':\n parsed.alt = true;\n break;\n case 'shift':\n parsed.shift = true;\n break;\n default:\n parsed.key = KEY_ALIASES[token] ?? token;\n }\n }\n return parsed;\n}\n\n/**\n * Does a `keydown` event satisfy a hotkey? `combo` may be a raw string (parsed\n * on the fly) or an already-parsed {@link MkParsedHotkey}.\n *\n * The key is compared case-insensitively; modifier flags must match exactly.\n * `mod` resolves to Meta on macOS and Ctrl elsewhere. Shift is not enforced for\n * symbol keys (e.g. `'?'`), whose shifted state varies by keyboard layout.\n */\nexport function mkMatchesHotkey(event: KeyboardEvent, combo: string | MkParsedHotkey): boolean {\n const parsed = typeof combo === 'string' ? mkParseHotkey(combo) : combo;\n if (!parsed.key) return false;\n\n if (event.key.toLowerCase() !== parsed.key) return false;\n\n const mac = mkIsMacPlatform();\n const wantCtrl = parsed.ctrl || (parsed.mod && !mac);\n const wantMeta = parsed.meta || (parsed.mod && mac);\n if (event.ctrlKey !== wantCtrl) return false;\n if (event.metaKey !== wantMeta) return false;\n if (event.altKey !== parsed.alt) return false;\n\n // Shift: enforce when requested; for symbol keys (non-alphanumeric single\n // chars) the shifted state is layout-dependent, so don't enforce its absence.\n if (parsed.shift) {\n if (!event.shiftKey) return false;\n } else {\n const symbolKey = parsed.key.length === 1 && !/[a-z0-9]/i.test(parsed.key);\n if (!symbolKey && event.shiftKey) return false;\n }\n return true;\n}\n\ninterface Registration {\n steps: MkParsedHotkey[];\n handler: (e: KeyboardEvent) => void;\n preventDefault: boolean;\n allowInInput: boolean;\n}\n\n/** Window (ms) to complete a two-step chord before the pending key is dropped. */\nconst SEQUENCE_TIMEOUT = 1000;\n\n/**\n * MkHotkeysService — app-wide keyboard shortcuts. Register a combo string and a\n * handler; a single `keydown` listener (attached lazily on the first\n * registration, browser only) dispatches to every match.\n *\n * Supports single combos (`'mod+k'`, `'ctrl+shift+p'`, `'?'`) and simple\n * two-step chords (`'g i'`). By default hotkeys are ignored while an editable\n * field is focused — pass `allowInInput` to opt in per registration.\n *\n * ```ts\n * const off = hotkeys.register('mod+k', (e) => openPalette(), { preventDefault: true });\n * // …later\n * off();\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MkHotkeysService {\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly registrations = new Set<Registration>();\n private attached = false;\n\n /** The first key of an in-progress chord, awaiting its second key. */\n private pendingEvent: KeyboardEvent | null = null;\n private pendingTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Register `combo` → `handler`. Returns a disposer that unregisters it.\n * `combo` may be a single combo or a space-separated two-step chord.\n */\n register(\n combo: string,\n handler: (e: KeyboardEvent) => void,\n options: MkHotkeyOptions = {},\n ): () => void {\n const steps = combo\n .trim()\n .split(/\\s+/)\n .filter((s) => s.length > 0)\n .map(mkParseHotkey);\n\n const registration: Registration = {\n steps,\n handler,\n preventDefault: options.preventDefault ?? false,\n allowInInput: options.allowInInput ?? false,\n };\n this.registrations.add(registration);\n this.ensureAttached();\n\n return () => {\n this.registrations.delete(registration);\n if (this.registrations.size === 0) this.detach();\n };\n }\n\n /** Remove every registration and detach the listener. */\n unregisterAll(): void {\n this.registrations.clear();\n this.clearPending();\n this.detach();\n }\n\n private ensureAttached(): void {\n if (this.attached || !this.isBrowser) return;\n this.document.addEventListener('keydown', this.onKeydown, true);\n this.attached = true;\n }\n\n private detach(): void {\n if (!this.attached) return;\n this.document.removeEventListener('keydown', this.onKeydown, true);\n this.attached = false;\n }\n\n private readonly onKeydown = (event: Event): void => {\n const e = event as KeyboardEvent;\n // Bare modifier presses neither trigger nor advance a chord.\n if (MODIFIER_KEYS.has(e.key.toLowerCase())) return;\n\n const editable = this.isEditable(e.target);\n\n // 1. Try to complete an in-progress chord.\n if (this.pendingEvent) {\n const first = this.pendingEvent;\n let completed = false;\n for (const reg of this.registrations) {\n if (reg.steps.length !== 2) continue;\n if (editable && !reg.allowInInput) continue;\n if (mkMatchesHotkey(first, reg.steps[0]) && mkMatchesHotkey(e, reg.steps[1])) {\n this.trigger(reg, e);\n completed = true;\n }\n }\n this.clearPending();\n if (completed) return;\n // Otherwise fall through: this key may fire a single hotkey or open a chord.\n }\n\n // 2. Single-combo matches.\n let matched = false;\n for (const reg of this.registrations) {\n if (reg.steps.length !== 1) continue;\n if (editable && !reg.allowInInput) continue;\n if (mkMatchesHotkey(e, reg.steps[0])) {\n this.trigger(reg, e);\n matched = true;\n }\n }\n if (matched) return;\n\n // 3. Open a chord if this key matches the first step of any two-step combo.\n for (const reg of this.registrations) {\n if (reg.steps.length !== 2) continue;\n if (editable && !reg.allowInInput) continue;\n if (mkMatchesHotkey(e, reg.steps[0])) {\n this.pendingEvent = e;\n this.pendingTimer = setTimeout(() => this.clearPending(), SEQUENCE_TIMEOUT);\n return;\n }\n }\n };\n\n private trigger(reg: Registration, e: KeyboardEvent): void {\n if (reg.preventDefault) e.preventDefault();\n reg.handler(e);\n }\n\n private clearPending(): void {\n this.pendingEvent = null;\n if (this.pendingTimer) {\n clearTimeout(this.pendingTimer);\n this.pendingTimer = undefined;\n }\n }\n\n private isEditable(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null;\n if (!el || typeof el.tagName !== 'string') return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n return el.isContentEditable === true;\n }\n}\n","import { DestroyRef, inject } from '@angular/core';\nimport { MkHotkeysService } from '../hotkeys/hotkeys.service';\nimport { MkHistoryService, type MkHistoryStack } from './history.service';\n\n/**\n * Opt-in helper wiring the standard editor shortcuts to a history stack\n * through {@link MkHotkeysService}:\n *\n * - `mod+z` → `undo()`\n * - `mod+shift+z` **and** `mod+y` → `redo()`\n *\n * Must be called in an **injection context** (constructor, field initializer,\n * or `runInInjectionContext`). Nothing is registered automatically — apps own\n * their shortcuts and call this where (and if) they want them:\n *\n * ```ts\n * export class AppShell {\n * private readonly disposeHistoryKeys = registerHistoryHotkeys();\n * }\n * ```\n *\n * Pass a specific stack (e.g. a `createScope()` stack for a dialog) to bind\n * the shortcuts to it instead of the app-wide {@link MkHistoryService}.\n *\n * Returns a dispose function that unregisters all three shortcuts; it is also\n * called automatically when the current injection context is destroyed.\n *\n * Notes:\n * - `MkHotkeysService` ignores keydowns while an editable element\n * (input/textarea/select/contentEditable) is focused, so native text-field\n * undo keeps working — no extra handling needed here.\n * - The shortcuts register with `preventDefault` so the browser's own\n * history/document undo does not fire alongside yours.\n */\nexport function registerHistoryHotkeys(\n history: MkHistoryStack = inject(MkHistoryService),\n): () => void {\n const hotkeys = inject(MkHotkeysService);\n const disposers = [\n hotkeys.register('mod+z', () => void history.undo(), { preventDefault: true }),\n hotkeys.register('mod+shift+z', () => void history.redo(), { preventDefault: true }),\n hotkeys.register('mod+y', () => void history.redo(), { preventDefault: true }),\n ];\n\n let disposed = false;\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n for (const off of disposers) off();\n };\n inject(DestroyRef, { optional: true })?.onDestroy(dispose);\n return dispose;\n}\n","import {\n Directive,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport {\n MkHotkeysService,\n type MkParsedHotkey,\n mkIsMacPlatform,\n mkParseHotkey,\n} from './hotkeys.service';\n\n/**\n * `aria-keyshortcuts` names (UI Events `KeyboardEvent.key` values) keyed by\n * the lowercase form {@link mkParseHotkey} produces. Space and plus have\n * dedicated names because they collide with the ARIA separators.\n */\nconst ARIA_KEY_NAMES: Record<string, string> = {\n ' ': 'Space',\n '+': 'Plus',\n escape: 'Escape',\n enter: 'Enter',\n tab: 'Tab',\n backspace: 'Backspace',\n delete: 'Delete',\n insert: 'Insert',\n home: 'Home',\n end: 'End',\n pageup: 'PageUp',\n pagedown: 'PageDown',\n arrowup: 'ArrowUp',\n arrowdown: 'ArrowDown',\n arrowleft: 'ArrowLeft',\n arrowright: 'ArrowRight',\n};\n\n/** Map a parsed (lowercase) key to its `aria-keyshortcuts` spelling. */\nfunction ariaKeyName(key: string): string {\n const mapped = ARIA_KEY_NAMES[key];\n if (mapped) return mapped;\n if (/^f\\d{1,2}$/.test(key)) return key.toUpperCase(); // F1 … F12\n return key.length === 1 ? key.toUpperCase() : key;\n}\n\n/**\n * One parsed combo as an ARIA `+`-joined token, e.g. `Control+Shift+P`.\n * `mod` resolves the same way the matcher does: Meta on macOS, Control\n * elsewhere ({@link mkIsMacPlatform}).\n */\nfunction ariaCombo(parsed: MkParsedHotkey): string {\n const mac = mkIsMacPlatform();\n const tokens: string[] = [];\n if (parsed.ctrl || (parsed.mod && !mac)) tokens.push('Control');\n if (parsed.alt) tokens.push('Alt');\n if (parsed.shift) tokens.push('Shift');\n if (parsed.meta || (parsed.mod && mac)) tokens.push('Meta');\n if (parsed.key) tokens.push(ariaKeyName(parsed.key));\n return tokens.join('+');\n}\n\n/**\n * `[mkHotkey]` — declaratively bind a keyboard shortcut to a host element.\n *\n * When the combo fires, a `<button>` or `<a>` host is `click()`ed; any other\n * host emits `(mkHotkeyPressed)`. Registration is scoped to the element's\n * lifetime (auto-unregistered on destroy) via {@link MkHotkeysService}.\n *\n * ```html\n * <button mkHotkey=\"mod+s\" (click)=\"save()\">Save</button>\n * <div mkHotkey=\"?\" (mkHotkeyPressed)=\"showHelp()\">…</div>\n * ```\n */\n@Directive({\n selector: '[mkHotkey]',\n exportAs: 'mkHotkey',\n host: {\n '[attr.aria-keyshortcuts]': 'ariaKeyshortcuts()',\n },\n})\nexport class MkHotkey {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly hotkeys = inject(MkHotkeysService);\n\n /** The combo (or space-separated chord) to bind, e.g. `mod+k`, `g i`, `?`. */\n readonly mkHotkey = input.required<string>();\n /** Fire even while an editable field is focused. */\n readonly mkHotkeyAllowInInput = input(false, { transform: booleanAttribute });\n /** Call `preventDefault()` when the hotkey fires. Defaults to `true`. */\n readonly mkHotkeyPreventDefault = input(true, { transform: booleanAttribute });\n\n /** Emitted when the hotkey fires and the host is not a button/link. */\n readonly mkHotkeyPressed = output<KeyboardEvent>();\n\n /**\n * The combo in `aria-keyshortcuts` syntax — per-step tokens `+`-joined\n * (`Control+K`), chord steps space-separated (`G I`). Exposed on the host.\n */\n protected readonly ariaKeyshortcuts = computed(() => {\n const combos = this.mkHotkey()\n .trim()\n .split(/\\s+/)\n .filter((s) => s.length > 0)\n .map((step) => ariaCombo(mkParseHotkey(step)))\n .filter((s) => s.length > 0);\n return combos.length ? combos.join(' ') : null;\n });\n\n private dispose?: () => void;\n\n constructor() {\n afterNextRender(() => {\n this.dispose = this.hotkeys.register(this.mkHotkey(), (e) => this.onTrigger(e), {\n allowInInput: this.mkHotkeyAllowInInput(),\n preventDefault: this.mkHotkeyPreventDefault(),\n });\n });\n }\n\n private onTrigger(e: KeyboardEvent): void {\n const el = this.host.nativeElement;\n const tag = el.tagName;\n if (tag === 'BUTTON' || tag === 'A') {\n el.click();\n return;\n }\n this.mkHotkeyPressed.emit(e);\n }\n\n ngOnDestroy(): void {\n this.dispose?.();\n }\n}\n","import type { Signal } from '@angular/core';\n\n/**\n * Permission policy — the contract the permission directives (`*mkCan`,\n * `*mkCannot`, `[mkCanDisable]`) check against. Provide an implementation\n * once at bootstrap; the directives inject it optionally and, when no policy\n * is provided at all, treat every permission as **granted** — an app that\n * never wires permissions must not have its whole UI hidden.\n *\n * `can` may return a plain `boolean` (static role checks) or a\n * `Signal<boolean>` (live permissions). The directives normalise both, and a\n * signal-returning policy re-evaluates reactively: views appear/disappear and\n * controls enable/disable the moment the underlying permissions change.\n *\n * ```ts\n * // A signal-based policy fed from an auth service:\n * @Injectable()\n * export class AppPermissionPolicy extends MkPermissionPolicy {\n * private readonly auth = inject(AuthService);\n *\n * can(permission: string): Signal<boolean> {\n * // auth.permissions is a Signal<string[]> that updates on login/logout.\n * return computed(() => this.auth.permissions().includes(permission));\n * }\n * }\n *\n * bootstrapApplication(App, {\n * providers: [\n * { provide: MkPermissionPolicy, useClass: AppPermissionPolicy },\n * ],\n * });\n * ```\n *\n * A static policy is just as valid:\n *\n * ```ts\n * class StaticPolicy extends MkPermissionPolicy {\n * can(permission: string): boolean {\n * return CURRENT_USER.permissions.includes(permission);\n * }\n * }\n * ```\n */\nexport abstract class MkPermissionPolicy {\n /**\n * Whether the current user holds `permission`. Return a `Signal<boolean>`\n * to make the verdict live; a plain boolean is treated as static.\n */\n abstract can(permission: string): boolean | Signal<boolean>;\n}\n\n/**\n * Resolve a policy verdict to a boolean, unwrapping signal-based results.\n * Call it inside a reactive context (`computed` / `effect`) so a\n * signal-returning policy stays live. A missing policy grants everything.\n */\nexport function mkPermissionGranted(\n policy: MkPermissionPolicy | null,\n permission: string,\n): boolean {\n if (!policy) return true;\n const verdict = policy.can(permission);\n return typeof verdict === 'boolean' ? verdict : verdict();\n}\n","import {\n Directive,\n TemplateRef,\n ViewContainerRef,\n computed,\n effect,\n inject,\n input,\n type Signal,\n} from '@angular/core';\nimport { MkPermissionPolicy, mkPermissionGranted } from './permission-policy';\n\n/**\n * Shared view management for `*mkCan` / `*mkCannot`. Must be called from the\n * directive's constructor (an injection context). Creates the embedded view\n * while the (possibly negated) verdict holds, the `else` template while it\n * does not, and destroys/recreates views when a signal-based policy flips.\n */\nfunction setupPermissionView(\n permission: Signal<string>,\n fallback: Signal<TemplateRef<unknown> | null>,\n negate: boolean,\n): void {\n const policy = inject(MkPermissionPolicy, { optional: true });\n const templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n const viewContainer = inject(ViewContainerRef);\n\n const visible = computed(() => {\n const granted = mkPermissionGranted(policy, permission());\n return negate ? !granted : granted;\n });\n\n // Tracks the currently rendered template so a change to the *other* branch\n // (e.g. the else template resolving while the view is shown) is a no-op.\n let rendered: TemplateRef<unknown> | null = null;\n effect(() => {\n const next = visible() ? templateRef : fallback();\n if (next === rendered) return;\n rendered = next;\n viewContainer.clear();\n if (next) viewContainer.createEmbeddedView(next);\n });\n}\n\n/**\n * Structural directive that renders its template only while the app's\n * {@link MkPermissionPolicy} grants the given permission. With a\n * signal-based policy the check is live — the view is created and destroyed\n * as permissions change. When no policy is provided, everything is granted.\n *\n * ```html\n * <button *mkCan=\"'posts.delete'\" (click)=\"remove()\">Delete</button>\n *\n * <!-- With a fallback template, like *ngIf's else: -->\n * <section *mkCan=\"'billing.view'; else locked\">…</section>\n * <ng-template #locked><mk-empty-state title=\"No access\" /></ng-template>\n * ```\n */\n@Directive({ selector: '[mkCan]' })\nexport class MkCan {\n /** The permission key to check, e.g. `'posts.delete'`. */\n readonly permission = input.required<string>({ alias: 'mkCan' });\n /** Template rendered while the permission is denied (`; else ref`). */\n readonly elseTemplate = input<TemplateRef<unknown> | null>(null, {\n alias: 'mkCanElse',\n });\n\n constructor() {\n setupPermissionView(this.permission, this.elseTemplate, false);\n }\n}\n\n/**\n * The negation of {@link MkCan}: renders its template only while the\n * permission is **denied** — for upsell hints, \"ask an admin\" notes and the\n * like. With no policy provided everything is granted, so `*mkCannot`\n * renders nothing.\n *\n * ```html\n * <p *mkCannot=\"'reports.export'\">Exporting requires an admin role.</p>\n * ```\n */\n@Directive({ selector: '[mkCannot]' })\nexport class MkCannot {\n /** The permission key to check. */\n readonly permission = input.required<string>({ alias: 'mkCannot' });\n /** Template rendered while the permission is granted (`; else ref`). */\n readonly elseTemplate = input<TemplateRef<unknown> | null>(null, {\n alias: 'mkCannotElse',\n });\n\n constructor() {\n setupPermissionView(this.permission, this.elseTemplate, true);\n }\n}\n","import {\n Directive,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport { MkPermissionPolicy, mkPermissionGranted } from './permission-policy';\n\n/**\n * Disables the host while the app's {@link MkPermissionPolicy} denies the\n * given permission — the \"keep it visible but inert\" alternative to `*mkCan`\n * for buttons, inputs and menu items.\n *\n * While denied, the host gets `aria-disabled=\"true\"`, and — when the element\n * supports it (button, input, select, textarea, fieldset…) — its native\n * `disabled` property is set too. Non-disableable elements (links, custom\n * menu items) get `aria-disabled` only; pair it with CSS / a click guard as\n * needed. The directive owns the disabled state: it also re-enables the host\n * when the permission is granted. With a signal-based policy the state flips\n * live; with no policy provided, everything is granted.\n *\n * ```html\n * <button [mkCanDisable]=\"'posts.delete'\" (click)=\"remove()\">Delete</button>\n * <a [mkCanDisable]=\"'billing.view'\" routerLink=\"/billing\">Billing</a>\n * ```\n */\n@Directive({\n selector: '[mkCanDisable]',\n host: {\n '[attr.aria-disabled]': \"denied() ? 'true' : null\",\n },\n})\nexport class MkCanDisable {\n private readonly policy = inject(MkPermissionPolicy, { optional: true });\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The permission key to check, e.g. `'posts.delete'`. */\n readonly permission = input.required<string>({ alias: 'mkCanDisable' });\n\n /** Whether the permission is currently denied. */\n protected readonly denied = computed(\n () => !mkPermissionGranted(this.policy, this.permission()),\n );\n\n constructor() {\n const el = this.host.nativeElement as HTMLElement & { disabled?: boolean };\n effect(() => {\n const denied = this.denied();\n // Only elements with a native `disabled` member (form controls) get the\n // property; everything else relies on `aria-disabled` alone.\n if ('disabled' in el) el.disabled = denied;\n });\n }\n}\n","import type { MkI18nStrings } from '@mk-kit/ui/core';\n\n/**\n * Resolve the locale a formatting pipe should use: an explicit per-call\n * locale wins, then `provideMkI18n({ locale })`, then the runtime default\n * (`undefined` lets `Intl` pick the environment locale).\n */\nexport function mkResolveLocale(\n i18n: Pick<MkI18nStrings, 'locale'>,\n explicit?: string | null,\n): string | undefined {\n return explicit || i18n.locale || undefined;\n}\n\n/**\n * Small bounded memo for `Intl` formatter instances — constructing them is\n * far more expensive than calling `format()`, and a pure pipe in a list\n * re-runs for every row.\n */\nexport class MkIntlCache<T> {\n private readonly map = new Map<string, T>();\n\n constructor(\n private readonly create: (locale: string | undefined, options: Record<string, unknown>) => T,\n private readonly limit = 32,\n ) {}\n\n get(locale: string | undefined, options: Record<string, unknown> = {}): T {\n const key = `${locale ?? ''}|${JSON.stringify(options)}`;\n let hit = this.map.get(key);\n if (hit === undefined) {\n hit = this.create(locale, options);\n if (this.map.size >= this.limit) {\n // Evict the oldest entry (Map iteration order is insertion order).\n this.map.delete(this.map.keys().next().value as string);\n }\n this.map.set(key, hit);\n }\n return hit;\n }\n}\n\n/** Coerce a pipe input to a finite number; `null` for anything else. */\nexport function mkToNumber(value: unknown): number | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'string' && value.trim() === '') return null;\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\n/** Coerce a `Date | number | string` to a valid timestamp; `null` for anything else. */\nexport function mkToTimestamp(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null;\n const t =\n value instanceof Date\n ? value.getTime()\n : typeof value === 'number'\n ? value\n : new Date(value as string).getTime();\n return Number.isFinite(t) ? t : null;\n}\n","import { Pipe, type PipeTransform, inject } from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkIntlCache, mkResolveLocale, mkToNumber } from './intl-utils';\n\n/**\n * Options accepted by {@link MkCurrencyPipe}. They map onto\n * `Intl.NumberFormat` currency options; `locale` overrides the i18n /\n * runtime locale for this call only.\n */\nexport interface MkCurrencyOptions {\n /** BCP 47 locale for this call; defaults to `provideMkI18n({ locale })`, then the runtime locale. */\n locale?: string;\n /** How the currency is shown. Default `'symbol'` (`€`, `$`, `zł`). */\n display?: 'symbol' | 'narrowSymbol' | 'code' | 'name';\n /** Fraction digits; both default to the currency's own (2 for EUR, 0 for JPY). */\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n /** Sign display, e.g. `'always'` for `+€10.00` or `'exceptZero'`. */\n signDisplay?: 'auto' | 'never' | 'always' | 'exceptZero';\n /** Compact notation for dashboards (`$1.2M`). Default `'standard'`. */\n notation?: 'standard' | 'compact';\n /** Thousands grouping; default `true`. */\n useGrouping?: boolean;\n}\n\nconst formatters = new MkIntlCache<Intl.NumberFormat>(\n (locale, options) => new Intl.NumberFormat(locale, options as Intl.NumberFormatOptions),\n);\n\n/**\n * `mkCurrency` — format a number as money with `Intl.NumberFormat`, honouring\n * the locale and default currency from `provideMkI18n({ locale, currency })`.\n * No Angular locale data is needed. Pure: `null`, `undefined`, `''` and\n * non-numeric input render as `''`.\n *\n * ```html\n * {{ 1234.5 | mkCurrency }} <!-- $1,234.50 (i18n currency, default USD) -->\n * {{ 1234.5 | mkCurrency:'EUR' }} <!-- €1,234.50 -->\n * {{ 1234.5 | mkCurrency:'PLN':{ locale: 'pl-PL' } }} <!-- 1234,50 zł -->\n * {{ 1234567 | mkCurrency:'USD':{ notation: 'compact' } }} <!-- $1.2M -->\n * {{ total() | mkCurrency:'GBP':{ signDisplay: 'always' } }} <!-- signals work as-is -->\n * ```\n */\n@Pipe({ name: 'mkCurrency', pure: true })\nexport class MkCurrencyPipe implements PipeTransform {\n private readonly i18n = inject(MK_I18N);\n\n /**\n * @param value Amount in major units (`12.5` → `$12.50`).\n * @param currency ISO 4217 code; defaults to `provideMkI18n({ currency })`, then `'USD'`.\n * @param options Locale and `Intl.NumberFormat` currency options.\n */\n transform(\n value: number | string | null | undefined,\n currency?: string | null,\n options: MkCurrencyOptions = {},\n ): string {\n const amount = mkToNumber(value);\n if (amount === null) return '';\n const { locale, display, ...rest } = options;\n const intlOptions: Intl.NumberFormatOptions = {\n style: 'currency',\n currency: (currency || this.i18n.currency || 'USD').toUpperCase(),\n currencyDisplay: display ?? 'symbol',\n ...rest,\n };\n return formatters\n .get(mkResolveLocale(this.i18n, locale), intlOptions as Record<string, unknown>)\n .format(amount);\n }\n}\n","import { Pipe, type PipeTransform, inject } from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkIntlCache, mkResolveLocale, mkToTimestamp } from './intl-utils';\n\n/** Options accepted by {@link MkRelativeTimePipe}. */\nexport interface MkRelativeTimeOptions {\n /** BCP 47 locale for this call; defaults to `provideMkI18n({ locale })`, then the runtime locale. */\n locale?: string;\n /**\n * `'auto'` (default) uses phrases like \"yesterday\" / \"now\" where the locale\n * has them; `'always'` sticks to \"1 day ago\" / \"in 0 seconds\".\n */\n numeric?: 'always' | 'auto';\n /** Length of the unit word: `'long'` (default, \"minutes\"), `'short'` (\"min.\"), `'narrow'` (\"m\"). */\n style?: 'long' | 'short' | 'narrow';\n /**\n * Largest unit to use. Default `'year'`; e.g. `'day'` keeps \"45 days ago\"\n * instead of \"1 month ago\".\n */\n maxUnit?: Intl.RelativeTimeFormatUnit;\n}\n\n/** Unit ladder: `[unit, milliseconds per unit]`, smallest first. */\nconst UNITS: ReadonlyArray<readonly [Intl.RelativeTimeFormatUnit, number]> = [\n ['second', 1_000],\n ['minute', 60_000],\n ['hour', 3_600_000],\n ['day', 86_400_000],\n ['week', 604_800_000],\n ['month', 2_629_800_000], // 365.25 / 12 days\n ['year', 31_557_600_000], // 365.25 days\n];\n\nconst formatters = new MkIntlCache<Intl.RelativeTimeFormat>(\n (locale, options) =>\n new Intl.RelativeTimeFormat(locale, options as Intl.RelativeTimeFormatOptions),\n);\n\n/**\n * `mkRelativeTime` — \"3 minutes ago\" / \"in 2 days\" / \"yesterday\" from a\n * `Date`, timestamp or ISO string, via `Intl.RelativeTimeFormat` in the\n * `provideMkI18n` locale (no Angular locale data). Pure: `null`, `undefined`\n * and unparsable input render as `''`.\n *\n * The pipe picks the largest unit whose magnitude is at least 1 (seconds →\n * minutes → hours → days → weeks → months → years) and rounds. Pass `now`\n * for deterministic output in tests, or bind a ticking signal to keep a\n * list live — a pure pipe only re-runs when an argument changes. The second\n * argument is either that `now` or the options object, so options alone\n * need no `null` placeholder; the three-argument form (`now`, then options)\n * works too:\n *\n * ```html\n * {{ comment.createdAt | mkRelativeTime }} <!-- 3 minutes ago -->\n * {{ due | mkRelativeTime:now() }} <!-- in 2 days (now() ticks) -->\n * {{ due | mkRelativeTime:{ style: 'short' } }} <!-- in 2 days -->\n * {{ ts | mkRelativeTime:{ locale: 'pl', numeric: 'always' } }} <!-- 3 minuty temu -->\n * {{ due | mkRelativeTime:now():{ style: 'short' } }} <!-- in 2 days (ticking) -->\n * ```\n */\n@Pipe({ name: 'mkRelativeTime', pure: true })\nexport class MkRelativeTimePipe implements PipeTransform {\n private readonly i18n = inject(MK_I18N);\n\n /**\n * @param value The instant to describe.\n * @param nowOrOptions Reference instant (defaults to `Date.now()` at call\n * time), or — when only options are wanted — the options object itself.\n * @param options Locale, numeric mode, style and unit cap (three-argument\n * form, after an explicit `now`).\n */\n transform(\n value: Date | number | string | null | undefined,\n nowOrOptions?: Date | number | string | MkRelativeTimeOptions | null,\n options?: MkRelativeTimeOptions,\n ): string {\n const target = mkToTimestamp(value);\n if (target === null) return '';\n const [now, opts] = splitArgs(nowOrOptions, options);\n const reference = mkToTimestamp(now) ?? Date.now();\n const diff = target - reference;\n const [unit, amount] = pickUnit(diff, opts.maxUnit ?? 'year');\n const { locale, maxUnit: _maxUnit, ...rest } = opts;\n return formatters\n .get(mkResolveLocale(this.i18n, locale), {\n numeric: 'auto',\n style: 'long',\n ...rest,\n })\n .format(amount, unit);\n }\n}\n\n/**\n * Resolve the overloaded second argument: a plain object (not a `Date`) is\n * the options and `now` is left to default; anything else is `now`.\n */\nfunction splitArgs(\n nowOrOptions: Date | number | string | MkRelativeTimeOptions | null | undefined,\n options: MkRelativeTimeOptions | undefined,\n): [Date | number | string | null | undefined, MkRelativeTimeOptions] {\n if (\n nowOrOptions !== null &&\n typeof nowOrOptions === 'object' &&\n !(nowOrOptions instanceof Date)\n ) {\n return [undefined, { ...nowOrOptions, ...options }];\n }\n return [nowOrOptions, options ?? {}];\n}\n\n/** Choose the largest unit (≤ `maxUnit`) whose rounded magnitude is ≥ 1; seconds otherwise. */\nfunction pickUnit(\n diffMs: number,\n maxUnit: Intl.RelativeTimeFormatUnit,\n): [Intl.RelativeTimeFormatUnit, number] {\n const cap = UNITS.findIndex(([u]) => u === maxUnit || `${u}s` === maxUnit);\n const last = cap === -1 ? UNITS.length - 1 : cap;\n const abs = Math.abs(diffMs);\n for (let i = last; i > 0; i--) {\n const [unit, ms] = UNITS[i];\n if (abs >= ms) return [unit, Math.round(diffMs / ms)];\n }\n const value = Math.round(diffMs / 1000);\n // Avoid \"-0 seconds\": normalise negative zero so 'auto' can render \"now\".\n return ['second', value === 0 ? 0 : value];\n}\n","import { Pipe, type PipeTransform, inject } from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkIntlCache, mkResolveLocale, mkToNumber } from './intl-utils';\n\n/** Options accepted by {@link MkFileSizePipe}. */\nexport interface MkFileSizeOptions {\n /** BCP 47 locale for the number part (decimal separator); defaults to the i18n / runtime locale. */\n locale?: string;\n /**\n * `'decimal'` (default) divides by 1000 and labels `kB MB GB …` (what\n * operating systems and file dialogs show); `'binary'` divides by 1024\n * and labels `KiB MiB GiB …`.\n */\n base?: 'decimal' | 'binary';\n /** Maximum fraction digits. Default `1`; bytes never get fractions. */\n digits?: number;\n}\n\nconst DECIMAL_UNITS = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB'] as const;\nconst BINARY_UNITS = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB'] as const;\n\nconst numbers = new MkIntlCache<Intl.NumberFormat>(\n (locale, options) => new Intl.NumberFormat(locale, options as Intl.NumberFormatOptions),\n);\n\n/**\n * `mkFileSize` — bytes → a human-readable size such as `1.2 MB`, with the\n * number formatted by `Intl.NumberFormat` in the `provideMkI18n` locale.\n * Pure: `null`, `undefined`, `''` and non-numeric input render as `''`.\n *\n * ```html\n * {{ 1_234_567 | mkFileSize }} <!-- 1.2 MB -->\n * {{ 1_234_567 | mkFileSize:{ base: 'binary' } }} <!-- 1.2 MiB -->\n * {{ 1_234_567 | mkFileSize:{ digits: 2, locale: 'de' } }} <!-- 1,23 MB -->\n * {{ 512 | mkFileSize }} <!-- 512 B -->\n * ```\n */\n@Pipe({ name: 'mkFileSize', pure: true })\nexport class MkFileSizePipe implements PipeTransform {\n private readonly i18n = inject(MK_I18N);\n\n transform(\n value: number | string | null | undefined,\n options: MkFileSizeOptions = {},\n ): string {\n const bytes = mkToNumber(value);\n if (bytes === null) return '';\n const binary = options.base === 'binary';\n const divisor = binary ? 1024 : 1000;\n const units = binary ? BINARY_UNITS : DECIMAL_UNITS;\n const negative = bytes < 0;\n let amount = Math.abs(bytes);\n let index = 0;\n while (amount >= divisor && index < units.length - 1) {\n amount /= divisor;\n index++;\n }\n let digits = index === 0 ? 0 : Math.max(0, options.digits ?? 1);\n // 999.96 kB would round to \"1000 kB\": promote to the next unit instead.\n if (index < units.length - 1 && Number(amount.toFixed(digits)) >= divisor) {\n amount /= divisor;\n index++;\n digits = Math.max(0, options.digits ?? 1);\n }\n const number = numbers\n .get(mkResolveLocale(this.i18n, options.locale), { maximumFractionDigits: digits })\n .format(negative ? -amount : amount);\n return `${number} ${units[index]}`;\n }\n}\n","import { Pipe, type PipeTransform } from '@angular/core';\n\n/**\n * `mkInitials` — \"Ada Lovelace\" → \"AL\", the same rule `mk-avatar` uses for\n * its fallback: first letter of the first and last word, upper-cased. A\n * single word yields its first `max` letters (\"Ada\" → \"AD\"); more than two\n * words with `max` > 2 take one letter per word from the start (\"Jean\n * Luc Picard\" with `max: 3` → \"JLP\"). Leading/trailing/duplicate whitespace\n * is ignored, and grapheme-aware slicing keeps emoji and accents intact.\n * Pure: `null`, `undefined` and blank input render as `''`.\n *\n * ```html\n * {{ user.name | mkInitials }} <!-- Grace Hopper → GH -->\n * {{ user.name | mkInitials:1 }} <!-- Grace Hopper → G -->\n * {{ 'Jean Luc Picard' | mkInitials:3 }} <!-- JLP -->\n * ```\n */\n@Pipe({ name: 'mkInitials', pure: true })\nexport class MkInitialsPipe implements PipeTransform {\n /**\n * @param value Full name.\n * @param max Maximum number of letters; default `2`, minimum `1`.\n */\n transform(value: string | null | undefined, max = 2): string {\n if (value === null || value === undefined) return '';\n const words = String(value).trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) return '';\n const limit = Math.max(1, Math.floor(max) || 1);\n let letters: string[];\n if (words.length === 1) {\n letters = graphemes(words[0]).slice(0, limit);\n } else if (limit >= words.length) {\n letters = words.map((w) => graphemes(w)[0]);\n } else if (limit === 1) {\n letters = [graphemes(words[0])[0]];\n } else {\n // First (limit - 1) words plus the last word: \"Ada King Lovelace\" → \"AL\".\n letters = [\n ...words.slice(0, limit - 1).map((w) => graphemes(w)[0]),\n graphemes(words[words.length - 1])[0],\n ];\n }\n return letters.join('').toLocaleUpperCase();\n }\n}\n\n/** Split into user-perceived characters (code points as a fallback). */\nfunction graphemes(word: string): string[] {\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n return [...new Intl.Segmenter().segment(word)].map((s) => s.segment);\n }\n return Array.from(word);\n}\n","import { Pipe, type PipeTransform } from '@angular/core';\n\n/** Options accepted by {@link MkTruncatePipe}. */\nexport interface MkTruncateOptions {\n /** Suffix appended when text is cut. Default `'…'` (a single ellipsis character). */\n ellipsis?: string;\n /**\n * Cut at the last whitespace before the limit instead of mid-word\n * (falls back to a hard cut when the first word alone is longer).\n * Default `false`.\n */\n wordBoundary?: boolean;\n}\n\n/**\n * `mkTruncate` — shorten text to `length` characters and append an ellipsis.\n * The ellipsis counts toward the limit, so the output never exceeds\n * `length` characters; counting is grapheme-aware (emoji and accented\n * letters are one character). Text that already fits is returned as-is.\n * Pure: `null` and `undefined` render as `''`.\n *\n * ```html\n * {{ post.body | mkTruncate:80 }} <!-- hard cut at 80 -->\n * {{ post.body | mkTruncate:80:{ wordBoundary: true } }} <!-- cut at the last space -->\n * {{ hash | mkTruncate:12:{ ellipsis: '...' } }}\n * ```\n */\n@Pipe({ name: 'mkTruncate', pure: true })\nexport class MkTruncatePipe implements PipeTransform {\n /**\n * @param value Text to shorten.\n * @param length Maximum characters in the output, ellipsis included. Default `50`.\n * @param options Ellipsis string and word-boundary mode.\n */\n transform(\n value: string | null | undefined,\n length = 50,\n options: MkTruncateOptions = {},\n ): string {\n if (value === null || value === undefined) return '';\n const text = String(value);\n const limit = Math.max(0, Math.floor(length) || 0);\n const chars = graphemes(text);\n if (chars.length <= limit) return text;\n const ellipsis = options.ellipsis ?? '…';\n const budget = Math.max(0, limit - graphemes(ellipsis).length);\n let cut = chars.slice(0, budget).join('');\n if (options.wordBoundary) {\n // Only back up to a boundary when the cut lands inside a word.\n const next = chars[budget] ?? '';\n if (next && !/\\s/.test(next)) {\n const at = cut.search(/\\s+\\S*$/);\n if (at > 0) cut = cut.slice(0, at);\n }\n }\n return cut.replace(/\\s+$/, '') + ellipsis;\n }\n}\n\n/** Split into user-perceived characters (code points as a fallback). */\nfunction graphemes(text: string): string[] {\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n return [...new Intl.Segmenter().segment(text)].map((s) => s.segment);\n }\n return Array.from(text);\n}\n","import { Pipe, type PipeTransform, inject } from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\nimport { MkIntlCache, mkResolveLocale, mkToNumber } from './intl-utils';\n\n/**\n * Per-category word forms for {@link MkPluralizePipe}, keyed by the CLDR\n * plural categories `Intl.PluralRules` returns. `other` is required; the\n * pipe falls back to it for any category you leave out.\n *\n * ```ts\n * const files: MkPluralForms = { one: 'plik', few: 'pliki', many: 'plików', other: 'pliku' };\n * ```\n */\nexport type MkPluralForms = { other: string } & Partial<Record<Intl.LDMLPluralRule, string>>;\n\n/** Options accepted by {@link MkPluralizePipe}. */\nexport interface MkPluralizeOptions {\n /** BCP 47 locale for the plural rules and number; defaults to the i18n / runtime locale. */\n locale?: string;\n /** Prefix the formatted count (`\"3 items\"`); `false` gives just the word. Default `true`. */\n withCount?: boolean;\n}\n\nconst rules = new MkIntlCache<Intl.PluralRules>(\n (locale, options) => new Intl.PluralRules(locale, options as Intl.PluralRulesOptions),\n);\nconst numbers = new MkIntlCache<Intl.NumberFormat>(\n (locale, options) => new Intl.NumberFormat(locale, options as Intl.NumberFormatOptions),\n);\n\n/**\n * `mkPluralize` — pick the right word for a count using the locale's plural\n * rules (`Intl.PluralRules`), optionally prefixed with the formatted count.\n * The English shorthand takes a singular and an optional plural (default\n * `singular + 's'`); other languages pass a {@link MkPluralForms} map.\n * Pure: `null`, `undefined`, `''` and non-numeric counts render as `''`.\n *\n * ```html\n * {{ count | mkPluralize:'item' }} <!-- 1 item / 3 items -->\n * {{ count | mkPluralize:'entry':'entries' }} <!-- 1 entry / 2 entries -->\n * {{ count | mkPluralize:'file':null:{ withCount: false } }} <!-- files -->\n * {{ n | mkPluralize:{ one: 'plik', few: 'pliki', many: 'plików', other: 'pliku' }:null:{ locale: 'pl' } }}\n * ```\n */\n@Pipe({ name: 'mkPluralize', pure: true })\nexport class MkPluralizePipe implements PipeTransform {\n private readonly i18n = inject(MK_I18N);\n\n /**\n * @param value The count.\n * @param singular Singular word, or a full {@link MkPluralForms} map.\n * @param plural Plural word for the shorthand form; default `singular + 's'`. Ignored with a map.\n * @param options Locale and whether to prefix the count.\n */\n transform(\n value: number | string | null | undefined,\n singular: string | MkPluralForms,\n plural?: string | null,\n options: MkPluralizeOptions = {},\n ): string {\n const count = mkToNumber(value);\n if (count === null) return '';\n const locale = mkResolveLocale(this.i18n, options.locale);\n const category = rules.get(locale).select(count);\n let word: string;\n if (typeof singular === 'string') {\n word = category === 'one' ? singular : (plural ?? `${singular}s`);\n } else {\n word = singular[category] ?? singular.other;\n }\n if (options.withCount === false) return word;\n return `${numbers.get(locale).format(count)} ${word}`;\n }\n}\n","/**\n * DIRECTIVES / utilities group barrel for @mk-kit/ui.\n */\nexport * from './directives';\nexport * from './history';\nexport * from './hotkeys';\nexport * from './permissions';\nexport * from './pipes';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["formatters","numbers","graphemes"],"mappings":"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"}
|