@mk-kit/ui 0.41.0 → 0.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, DOCUMENT, PLATFORM_ID, input, booleanAttribute, output, effect, Directive, numberAttribute, signal, afterNextRender, Injector, computed, Injectable, DestroyRef, TemplateRef, ViewContainerRef } from '@angular/core';
2
+ import { inject, ElementRef, DOCUMENT, PLATFORM_ID, input, booleanAttribute, output, effect, Directive, numberAttribute, signal, afterNextRender, Injector, computed, Injectable, DestroyRef, TemplateRef, ViewContainerRef, Pipe } from '@angular/core';
3
3
  import { isPlatformBrowser } from '@angular/common';
4
+ import { MK_I18N } from '@mk-kit/ui/core';
4
5
 
5
6
  /**
6
7
  * Emits when a pointer press lands outside the host element — the building block
@@ -1767,6 +1768,398 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
1767
1768
  }]
1768
1769
  }], ctorParameters: () => [], propDecorators: { permission: [{ type: i0.Input, args: [{ isSignal: true, alias: "mkCanDisable", required: true }] }] } });
1769
1770
 
1771
+ /**
1772
+ * Resolve the locale a formatting pipe should use: an explicit per-call
1773
+ * locale wins, then `provideMkI18n({ locale })`, then the runtime default
1774
+ * (`undefined` lets `Intl` pick the environment locale).
1775
+ */
1776
+ function mkResolveLocale(i18n, explicit) {
1777
+ return explicit || i18n.locale || undefined;
1778
+ }
1779
+ /**
1780
+ * Small bounded memo for `Intl` formatter instances — constructing them is
1781
+ * far more expensive than calling `format()`, and a pure pipe in a list
1782
+ * re-runs for every row.
1783
+ */
1784
+ class MkIntlCache {
1785
+ create;
1786
+ limit;
1787
+ map = new Map();
1788
+ constructor(create, limit = 32) {
1789
+ this.create = create;
1790
+ this.limit = limit;
1791
+ }
1792
+ get(locale, options = {}) {
1793
+ const key = `${locale ?? ''}|${JSON.stringify(options)}`;
1794
+ let hit = this.map.get(key);
1795
+ if (hit === undefined) {
1796
+ hit = this.create(locale, options);
1797
+ if (this.map.size >= this.limit) {
1798
+ // Evict the oldest entry (Map iteration order is insertion order).
1799
+ this.map.delete(this.map.keys().next().value);
1800
+ }
1801
+ this.map.set(key, hit);
1802
+ }
1803
+ return hit;
1804
+ }
1805
+ }
1806
+ /** Coerce a pipe input to a finite number; `null` for anything else. */
1807
+ function mkToNumber(value) {
1808
+ if (value === null || value === undefined)
1809
+ return null;
1810
+ if (typeof value === 'string' && value.trim() === '')
1811
+ return null;
1812
+ const n = typeof value === 'number' ? value : Number(value);
1813
+ return Number.isFinite(n) ? n : null;
1814
+ }
1815
+ /** Coerce a `Date | number | string` to a valid timestamp; `null` for anything else. */
1816
+ function mkToTimestamp(value) {
1817
+ if (value === null || value === undefined || value === '')
1818
+ return null;
1819
+ const t = value instanceof Date
1820
+ ? value.getTime()
1821
+ : typeof value === 'number'
1822
+ ? value
1823
+ : new Date(value).getTime();
1824
+ return Number.isFinite(t) ? t : null;
1825
+ }
1826
+
1827
+ const formatters$1 = new MkIntlCache((locale, options) => new Intl.NumberFormat(locale, options));
1828
+ /**
1829
+ * `mkCurrency` — format a number as money with `Intl.NumberFormat`, honouring
1830
+ * the locale and default currency from `provideMkI18n({ locale, currency })`.
1831
+ * No Angular locale data is needed. Pure: `null`, `undefined`, `''` and
1832
+ * non-numeric input render as `''`.
1833
+ *
1834
+ * ```html
1835
+ * {{ 1234.5 | mkCurrency }} <!-- $1,234.50 (i18n currency, default USD) -->
1836
+ * {{ 1234.5 | mkCurrency:'EUR' }} <!-- €1,234.50 -->
1837
+ * {{ 1234.5 | mkCurrency:'PLN':{ locale: 'pl-PL' } }} <!-- 1234,50 zł -->
1838
+ * {{ 1234567 | mkCurrency:'USD':{ notation: 'compact' } }} <!-- $1.2M -->
1839
+ * {{ total() | mkCurrency:'GBP':{ signDisplay: 'always' } }} <!-- signals work as-is -->
1840
+ * ```
1841
+ */
1842
+ class MkCurrencyPipe {
1843
+ i18n = inject(MK_I18N);
1844
+ /**
1845
+ * @param value Amount in major units (`12.5` → `$12.50`).
1846
+ * @param currency ISO 4217 code; defaults to `provideMkI18n({ currency })`, then `'USD'`.
1847
+ * @param options Locale and `Intl.NumberFormat` currency options.
1848
+ */
1849
+ transform(value, currency, options = {}) {
1850
+ const amount = mkToNumber(value);
1851
+ if (amount === null)
1852
+ return '';
1853
+ const { locale, display, ...rest } = options;
1854
+ const intlOptions = {
1855
+ style: 'currency',
1856
+ currency: (currency || this.i18n.currency || 'USD').toUpperCase(),
1857
+ currencyDisplay: display ?? 'symbol',
1858
+ ...rest,
1859
+ };
1860
+ return formatters$1
1861
+ .get(mkResolveLocale(this.i18n, locale), intlOptions)
1862
+ .format(amount);
1863
+ }
1864
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkCurrencyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
1865
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: MkCurrencyPipe, isStandalone: true, name: "mkCurrency" });
1866
+ }
1867
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkCurrencyPipe, decorators: [{
1868
+ type: Pipe,
1869
+ args: [{ name: 'mkCurrency', pure: true }]
1870
+ }] });
1871
+
1872
+ /** Unit ladder: `[unit, milliseconds per unit]`, smallest first. */
1873
+ const UNITS = [
1874
+ ['second', 1_000],
1875
+ ['minute', 60_000],
1876
+ ['hour', 3_600_000],
1877
+ ['day', 86_400_000],
1878
+ ['week', 604_800_000],
1879
+ ['month', 2_629_800_000], // 365.25 / 12 days
1880
+ ['year', 31_557_600_000], // 365.25 days
1881
+ ];
1882
+ const formatters = new MkIntlCache((locale, options) => new Intl.RelativeTimeFormat(locale, options));
1883
+ /**
1884
+ * `mkRelativeTime` — "3 minutes ago" / "in 2 days" / "yesterday" from a
1885
+ * `Date`, timestamp or ISO string, via `Intl.RelativeTimeFormat` in the
1886
+ * `provideMkI18n` locale (no Angular locale data). Pure: `null`, `undefined`
1887
+ * and unparsable input render as `''`.
1888
+ *
1889
+ * The pipe picks the largest unit whose magnitude is at least 1 (seconds →
1890
+ * minutes → hours → days → weeks → months → years) and rounds. Pass `now`
1891
+ * for deterministic output in tests, or bind a ticking signal to keep a
1892
+ * list live — a pure pipe only re-runs when an argument changes:
1893
+ *
1894
+ * ```html
1895
+ * {{ comment.createdAt | mkRelativeTime }} <!-- 3 minutes ago -->
1896
+ * {{ due | mkRelativeTime:now() }} <!-- in 2 days (now() ticks) -->
1897
+ * {{ due | mkRelativeTime:null:{ style: 'short' } }} <!-- in 2 days -->
1898
+ * {{ ts | mkRelativeTime:null:{ locale: 'pl', numeric: 'always' } }} <!-- 3 minuty temu -->
1899
+ * ```
1900
+ */
1901
+ class MkRelativeTimePipe {
1902
+ i18n = inject(MK_I18N);
1903
+ /**
1904
+ * @param value The instant to describe.
1905
+ * @param now Reference instant; defaults to `Date.now()` at call time.
1906
+ * @param options Locale, numeric mode, style and unit cap.
1907
+ */
1908
+ transform(value, now, options = {}) {
1909
+ const target = mkToTimestamp(value);
1910
+ if (target === null)
1911
+ return '';
1912
+ const reference = mkToTimestamp(now) ?? Date.now();
1913
+ const diff = target - reference;
1914
+ const [unit, amount] = pickUnit(diff, options.maxUnit ?? 'year');
1915
+ const { locale, maxUnit: _maxUnit, ...rest } = options;
1916
+ return formatters
1917
+ .get(mkResolveLocale(this.i18n, locale), {
1918
+ numeric: 'auto',
1919
+ style: 'long',
1920
+ ...rest,
1921
+ })
1922
+ .format(amount, unit);
1923
+ }
1924
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkRelativeTimePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
1925
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: MkRelativeTimePipe, isStandalone: true, name: "mkRelativeTime" });
1926
+ }
1927
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkRelativeTimePipe, decorators: [{
1928
+ type: Pipe,
1929
+ args: [{ name: 'mkRelativeTime', pure: true }]
1930
+ }] });
1931
+ /** Choose the largest unit (≤ `maxUnit`) whose rounded magnitude is ≥ 1; seconds otherwise. */
1932
+ function pickUnit(diffMs, maxUnit) {
1933
+ const cap = UNITS.findIndex(([u]) => u === maxUnit || `${u}s` === maxUnit);
1934
+ const last = cap === -1 ? UNITS.length - 1 : cap;
1935
+ const abs = Math.abs(diffMs);
1936
+ for (let i = last; i > 0; i--) {
1937
+ const [unit, ms] = UNITS[i];
1938
+ if (abs >= ms)
1939
+ return [unit, Math.round(diffMs / ms)];
1940
+ }
1941
+ const value = Math.round(diffMs / 1000);
1942
+ // Avoid "-0 seconds": normalise negative zero so 'auto' can render "now".
1943
+ return ['second', value === 0 ? 0 : value];
1944
+ }
1945
+
1946
+ const DECIMAL_UNITS = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB'];
1947
+ const BINARY_UNITS = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB'];
1948
+ const numbers$1 = new MkIntlCache((locale, options) => new Intl.NumberFormat(locale, options));
1949
+ /**
1950
+ * `mkFileSize` — bytes → a human-readable size such as `1.2 MB`, with the
1951
+ * number formatted by `Intl.NumberFormat` in the `provideMkI18n` locale.
1952
+ * Pure: `null`, `undefined`, `''` and non-numeric input render as `''`.
1953
+ *
1954
+ * ```html
1955
+ * {{ 1_234_567 | mkFileSize }} <!-- 1.2 MB -->
1956
+ * {{ 1_234_567 | mkFileSize:{ base: 'binary' } }} <!-- 1.2 MiB -->
1957
+ * {{ 1_234_567 | mkFileSize:{ digits: 2, locale: 'de' } }} <!-- 1,23 MB -->
1958
+ * {{ 512 | mkFileSize }} <!-- 512 B -->
1959
+ * ```
1960
+ */
1961
+ class MkFileSizePipe {
1962
+ i18n = inject(MK_I18N);
1963
+ transform(value, options = {}) {
1964
+ const bytes = mkToNumber(value);
1965
+ if (bytes === null)
1966
+ return '';
1967
+ const binary = options.base === 'binary';
1968
+ const divisor = binary ? 1024 : 1000;
1969
+ const units = binary ? BINARY_UNITS : DECIMAL_UNITS;
1970
+ const negative = bytes < 0;
1971
+ let amount = Math.abs(bytes);
1972
+ let index = 0;
1973
+ while (amount >= divisor && index < units.length - 1) {
1974
+ amount /= divisor;
1975
+ index++;
1976
+ }
1977
+ let digits = index === 0 ? 0 : Math.max(0, options.digits ?? 1);
1978
+ // 999.96 kB would round to "1000 kB": promote to the next unit instead.
1979
+ if (index < units.length - 1 && Number(amount.toFixed(digits)) >= divisor) {
1980
+ amount /= divisor;
1981
+ index++;
1982
+ digits = Math.max(0, options.digits ?? 1);
1983
+ }
1984
+ const number = numbers$1
1985
+ .get(mkResolveLocale(this.i18n, options.locale), { maximumFractionDigits: digits })
1986
+ .format(negative ? -amount : amount);
1987
+ return `${number} ${units[index]}`;
1988
+ }
1989
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkFileSizePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
1990
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: MkFileSizePipe, isStandalone: true, name: "mkFileSize" });
1991
+ }
1992
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkFileSizePipe, decorators: [{
1993
+ type: Pipe,
1994
+ args: [{ name: 'mkFileSize', pure: true }]
1995
+ }] });
1996
+
1997
+ /**
1998
+ * `mkInitials` — "Ada Lovelace" → "AL", the same rule `mk-avatar` uses for
1999
+ * its fallback: first letter of the first and last word, upper-cased. A
2000
+ * single word yields its first `max` letters ("Ada" → "AD"); more than two
2001
+ * words with `max` > 2 take one letter per word from the start ("Jean
2002
+ * Luc Picard" with `max: 3` → "JLP"). Leading/trailing/duplicate whitespace
2003
+ * is ignored, and grapheme-aware slicing keeps emoji and accents intact.
2004
+ * Pure: `null`, `undefined` and blank input render as `''`.
2005
+ *
2006
+ * ```html
2007
+ * {{ user.name | mkInitials }} <!-- Grace Hopper → GH -->
2008
+ * {{ user.name | mkInitials:1 }} <!-- Grace Hopper → G -->
2009
+ * {{ 'Jean Luc Picard' | mkInitials:3 }} <!-- JLP -->
2010
+ * ```
2011
+ */
2012
+ class MkInitialsPipe {
2013
+ /**
2014
+ * @param value Full name.
2015
+ * @param max Maximum number of letters; default `2`, minimum `1`.
2016
+ */
2017
+ transform(value, max = 2) {
2018
+ if (value === null || value === undefined)
2019
+ return '';
2020
+ const words = String(value).trim().split(/\s+/).filter(Boolean);
2021
+ if (words.length === 0)
2022
+ return '';
2023
+ const limit = Math.max(1, Math.floor(max) || 1);
2024
+ let letters;
2025
+ if (words.length === 1) {
2026
+ letters = graphemes$1(words[0]).slice(0, limit);
2027
+ }
2028
+ else if (limit >= words.length) {
2029
+ letters = words.map((w) => graphemes$1(w)[0]);
2030
+ }
2031
+ else if (limit === 1) {
2032
+ letters = [graphemes$1(words[0])[0]];
2033
+ }
2034
+ else {
2035
+ // First (limit - 1) words plus the last word: "Ada King Lovelace" → "AL".
2036
+ letters = [
2037
+ ...words.slice(0, limit - 1).map((w) => graphemes$1(w)[0]),
2038
+ graphemes$1(words[words.length - 1])[0],
2039
+ ];
2040
+ }
2041
+ return letters.join('').toLocaleUpperCase();
2042
+ }
2043
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkInitialsPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
2044
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: MkInitialsPipe, isStandalone: true, name: "mkInitials" });
2045
+ }
2046
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkInitialsPipe, decorators: [{
2047
+ type: Pipe,
2048
+ args: [{ name: 'mkInitials', pure: true }]
2049
+ }] });
2050
+ /** Split into user-perceived characters (code points as a fallback). */
2051
+ function graphemes$1(word) {
2052
+ if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {
2053
+ return [...new Intl.Segmenter().segment(word)].map((s) => s.segment);
2054
+ }
2055
+ return Array.from(word);
2056
+ }
2057
+
2058
+ /**
2059
+ * `mkTruncate` — shorten text to `length` characters and append an ellipsis.
2060
+ * The ellipsis counts toward the limit, so the output never exceeds
2061
+ * `length` characters; counting is grapheme-aware (emoji and accented
2062
+ * letters are one character). Text that already fits is returned as-is.
2063
+ * Pure: `null` and `undefined` render as `''`.
2064
+ *
2065
+ * ```html
2066
+ * {{ post.body | mkTruncate:80 }} <!-- hard cut at 80 -->
2067
+ * {{ post.body | mkTruncate:80:{ wordBoundary: true } }} <!-- cut at the last space -->
2068
+ * {{ hash | mkTruncate:12:{ ellipsis: '...' } }}
2069
+ * ```
2070
+ */
2071
+ class MkTruncatePipe {
2072
+ /**
2073
+ * @param value Text to shorten.
2074
+ * @param length Maximum characters in the output, ellipsis included. Default `50`.
2075
+ * @param options Ellipsis string and word-boundary mode.
2076
+ */
2077
+ transform(value, length = 50, options = {}) {
2078
+ if (value === null || value === undefined)
2079
+ return '';
2080
+ const text = String(value);
2081
+ const limit = Math.max(0, Math.floor(length) || 0);
2082
+ const chars = graphemes(text);
2083
+ if (chars.length <= limit)
2084
+ return text;
2085
+ const ellipsis = options.ellipsis ?? '…';
2086
+ const budget = Math.max(0, limit - graphemes(ellipsis).length);
2087
+ let cut = chars.slice(0, budget).join('');
2088
+ if (options.wordBoundary) {
2089
+ // Only back up to a boundary when the cut lands inside a word.
2090
+ const next = chars[budget] ?? '';
2091
+ if (next && !/\s/.test(next)) {
2092
+ const at = cut.search(/\s+\S*$/);
2093
+ if (at > 0)
2094
+ cut = cut.slice(0, at);
2095
+ }
2096
+ }
2097
+ return cut.replace(/\s+$/, '') + ellipsis;
2098
+ }
2099
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkTruncatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
2100
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: MkTruncatePipe, isStandalone: true, name: "mkTruncate" });
2101
+ }
2102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkTruncatePipe, decorators: [{
2103
+ type: Pipe,
2104
+ args: [{ name: 'mkTruncate', pure: true }]
2105
+ }] });
2106
+ /** Split into user-perceived characters (code points as a fallback). */
2107
+ function graphemes(text) {
2108
+ if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {
2109
+ return [...new Intl.Segmenter().segment(text)].map((s) => s.segment);
2110
+ }
2111
+ return Array.from(text);
2112
+ }
2113
+
2114
+ const rules = new MkIntlCache((locale, options) => new Intl.PluralRules(locale, options));
2115
+ const numbers = new MkIntlCache((locale, options) => new Intl.NumberFormat(locale, options));
2116
+ /**
2117
+ * `mkPluralize` — pick the right word for a count using the locale's plural
2118
+ * rules (`Intl.PluralRules`), optionally prefixed with the formatted count.
2119
+ * The English shorthand takes a singular and an optional plural (default
2120
+ * `singular + 's'`); other languages pass a {@link MkPluralForms} map.
2121
+ * Pure: `null`, `undefined`, `''` and non-numeric counts render as `''`.
2122
+ *
2123
+ * ```html
2124
+ * {{ count | mkPluralize:'item' }} <!-- 1 item / 3 items -->
2125
+ * {{ count | mkPluralize:'entry':'entries' }} <!-- 1 entry / 2 entries -->
2126
+ * {{ count | mkPluralize:'file':null:{ withCount: false } }} <!-- files -->
2127
+ * {{ n | mkPluralize:{ one: 'plik', few: 'pliki', many: 'plików', other: 'pliku' }:null:{ locale: 'pl' } }}
2128
+ * ```
2129
+ */
2130
+ class MkPluralizePipe {
2131
+ i18n = inject(MK_I18N);
2132
+ /**
2133
+ * @param value The count.
2134
+ * @param singular Singular word, or a full {@link MkPluralForms} map.
2135
+ * @param plural Plural word for the shorthand form; default `singular + 's'`. Ignored with a map.
2136
+ * @param options Locale and whether to prefix the count.
2137
+ */
2138
+ transform(value, singular, plural, options = {}) {
2139
+ const count = mkToNumber(value);
2140
+ if (count === null)
2141
+ return '';
2142
+ const locale = mkResolveLocale(this.i18n, options.locale);
2143
+ const category = rules.get(locale).select(count);
2144
+ let word;
2145
+ if (typeof singular === 'string') {
2146
+ word = category === 'one' ? singular : (plural ?? `${singular}s`);
2147
+ }
2148
+ else {
2149
+ word = singular[category] ?? singular.other;
2150
+ }
2151
+ if (options.withCount === false)
2152
+ return word;
2153
+ return `${numbers.get(locale).format(count)} ${word}`;
2154
+ }
2155
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkPluralizePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
2156
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: MkPluralizePipe, isStandalone: true, name: "mkPluralize" });
2157
+ }
2158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkPluralizePipe, decorators: [{
2159
+ type: Pipe,
2160
+ args: [{ name: 'mkPluralize', pure: true }]
2161
+ }] });
2162
+
1770
2163
  /**
1771
2164
  * DIRECTIVES / utilities group barrel for @mk-kit/ui.
1772
2165
  */
@@ -1775,5 +2168,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
1775
2168
  * Generated bundle index. Do not edit.
1776
2169
  */
1777
2170
 
1778
- export { MK_FIELD_PRESETS, MkAutofocus, MkAutosize, MkCan, MkCanDisable, MkCannot, MkClickOutside, MkCopyToClipboard, MkField, MkHistoryService, MkHistoryStack, MkHotkey, MkHotkeysService, MkInfiniteScroll, MkIntersect, MkMask, MkPermissionPolicy, MkRipple, MkScrollspy, mkApplyMask, mkMaskCaret, mkMatchesHotkey, mkParseHotkey, mkPermissionGranted, registerHistoryHotkeys };
2171
+ export { MK_FIELD_PRESETS, MkAutofocus, MkAutosize, MkCan, MkCanDisable, MkCannot, MkClickOutside, MkCopyToClipboard, MkCurrencyPipe, MkField, MkFileSizePipe, MkHistoryService, MkHistoryStack, MkHotkey, MkHotkeysService, MkInfiniteScroll, MkInitialsPipe, MkIntersect, MkMask, MkPermissionPolicy, MkPluralizePipe, MkRelativeTimePipe, MkRipple, MkScrollspy, MkTruncatePipe, mkApplyMask, mkMaskCaret, mkMatchesHotkey, mkParseHotkey, mkPermissionGranted, registerHistoryHotkeys };
1779
2172
  //# sourceMappingURL=mk-kit-ui-directives.mjs.map