@mk-kit/ui 0.34.1 → 0.36.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.
@@ -14,6 +14,7 @@ export * from '@mk-kit/ui/feedback';
14
14
  export * from '@mk-kit/ui/rich-text';
15
15
  export * from '@mk-kit/ui/block-editor';
16
16
  export * from '@mk-kit/ui/context-menu';
17
+ export * from '@mk-kit/ui/layout';
17
18
  export * from '@mk-kit/ui/media';
18
19
 
19
20
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"mk-kit-ui.mjs","sources":["../../../projects/mk-kit/src/public-api.ts","../../../projects/mk-kit/src/mk-kit-ui.ts"],"sourcesContent":["/*\n * Public API Surface of @mk-kit/ui.\n *\n * The library ships Material-style secondary entry points — import from the\n * group entries (`@mk-kit/ui/forms`, `@mk-kit/ui/table`, …) so a code-split\n * app only carries the groups each chunk uses. This root entry re-exports\n * everything for convenience; importing it eagerly pulls all groups into the\n * importing chunk.\n */\nexport * from '@mk-kit/ui/core';\nexport * from '@mk-kit/ui/icon';\nexport * from '@mk-kit/ui/chip';\nexport * from '@mk-kit/ui/checkbox';\nexport * from '@mk-kit/ui/button';\nexport * from '@mk-kit/ui/directives';\nexport * from '@mk-kit/ui/dnd';\nexport * from '@mk-kit/ui/navigation';\nexport * from '@mk-kit/ui/forms';\nexport * from '@mk-kit/ui/datetime';\nexport * from '@mk-kit/ui/table';\nexport * from '@mk-kit/ui/data';\nexport * from '@mk-kit/ui/feedback';\nexport * from '@mk-kit/ui/rich-text';\nexport * from '@mk-kit/ui/block-editor';\nexport * from '@mk-kit/ui/context-menu';\nexport * from '@mk-kit/ui/media';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;AAQG;;ACRH;;AAEG"}
1
+ {"version":3,"file":"mk-kit-ui.mjs","sources":["../../../projects/mk-kit/src/public-api.ts","../../../projects/mk-kit/src/mk-kit-ui.ts"],"sourcesContent":["/*\n * Public API Surface of @mk-kit/ui.\n *\n * The library ships Material-style secondary entry points — import from the\n * group entries (`@mk-kit/ui/forms`, `@mk-kit/ui/table`, …) so a code-split\n * app only carries the groups each chunk uses. This root entry re-exports\n * everything for convenience; importing it eagerly pulls all groups into the\n * importing chunk.\n */\nexport * from '@mk-kit/ui/core';\nexport * from '@mk-kit/ui/icon';\nexport * from '@mk-kit/ui/chip';\nexport * from '@mk-kit/ui/checkbox';\nexport * from '@mk-kit/ui/button';\nexport * from '@mk-kit/ui/directives';\nexport * from '@mk-kit/ui/dnd';\nexport * from '@mk-kit/ui/navigation';\nexport * from '@mk-kit/ui/forms';\nexport * from '@mk-kit/ui/datetime';\nexport * from '@mk-kit/ui/table';\nexport * from '@mk-kit/ui/data';\nexport * from '@mk-kit/ui/feedback';\nexport * from '@mk-kit/ui/rich-text';\nexport * from '@mk-kit/ui/block-editor';\nexport * from '@mk-kit/ui/context-menu';\nexport * from '@mk-kit/ui/layout';\nexport * from '@mk-kit/ui/media';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;AAQG;;ACRH;;AAEG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mk-kit/ui",
3
- "version": "0.34.1",
3
+ "version": "0.36.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -107,6 +107,10 @@
107
107
  "types": "./types/mk-kit-ui-icon.d.ts",
108
108
  "default": "./fesm2022/mk-kit-ui-icon.mjs"
109
109
  },
110
+ "./layout": {
111
+ "types": "./types/mk-kit-ui-layout.d.ts",
112
+ "default": "./fesm2022/mk-kit-ui-layout.mjs"
113
+ },
110
114
  "./media": {
111
115
  "types": "./types/mk-kit-ui-media.d.ts",
112
116
  "default": "./fesm2022/mk-kit-ui-media.mjs"
package/styles/mk-kit.css CHANGED
@@ -381,6 +381,22 @@ body.mk-app {
381
381
  border: 0;
382
382
  }
383
383
 
384
+ /* Print helpers: `.mk-print-hidden` drops page chrome (toolbars, filters)
385
+ from paper; `.mk-print-only` shows something (a title, a date) only there.
386
+ Components ship their own `@media print` rules — mk-table prints as one
387
+ unbroken sheet with repeating headers and no controls. */
388
+ .mk-print-only {
389
+ display: none;
390
+ }
391
+
392
+ @media print {
393
+ .mk-print-hidden {
394
+ display: none !important;
395
+ }
396
+ .mk-print-only {
397
+ display: revert;
398
+ }
399
+ }
384
400
  /* mk-drag-handle — the grip a pointer drag must start on. MkDragHandle is a
385
401
  * DIRECTIVE (so it composes onto any element, including other components'
386
402
  * hosts like mk-icon), and directives cannot carry styles — hence the global
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, ComponentRef, Injector, OnDestroy, Type, AfterViewInit, ElementRef, Provider, Signal } from '@angular/core';
2
+ import { InjectionToken, OnDestroy, Signal, ComponentRef, Injector, Type, AfterViewInit, ElementRef, Provider } from '@angular/core';
3
3
  import { Observable } from 'rxjs';
4
4
  import { ValidationErrors } from '@angular/forms';
5
5
 
@@ -15,7 +15,7 @@ type MkThemePreference = 'light' | 'dark' | 'system';
15
15
  /** Concrete resolved theme (never `system`). */
16
16
  type MkResolvedTheme = 'light' | 'dark';
17
17
  /** Common placement values for overlays (menus, tooltips, popovers). */
18
- type MkPlacement = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'right';
18
+ type MkPlacement = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';
19
19
 
20
20
  /**
21
21
  * Global control-density mode.
@@ -84,6 +84,67 @@ declare class MkThemeService {
84
84
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<MkThemeService>;
85
85
  }
86
86
 
87
+ /** Named viewport ranges, mobile-first: each starts at its min-width. */
88
+ type MkBreakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
89
+ /** Min-widths (px) at which each named breakpoint begins; `xs` is everything below `sm`. */
90
+ type MkBreakpoints = Record<Exclude<MkBreakpoint, 'xs'>, number>;
91
+ /** The default scale (same numbers as Tailwind, so mental models transfer). */
92
+ declare const MK_DEFAULT_BREAKPOINTS: MkBreakpoints;
93
+ /** Override the breakpoint scale app-wide: `{ provide: MK_BREAKPOINTS, useValue: { …, lg: 1100 } }`. */
94
+ declare const MK_BREAKPOINTS: InjectionToken<MkBreakpoints>;
95
+ /**
96
+ * A value that may differ per breakpoint: either the plain value or a
97
+ * mobile-first map, `{ xs: 1, md: 2, xl: 4 }`, where each key applies from
98
+ * that breakpoint up until the next key given.
99
+ */
100
+ type MkResponsive<T> = T | Partial<Record<MkBreakpoint, T>>;
101
+ /** True when `value` is a per-breakpoint map rather than a plain value. */
102
+ declare function mkIsResponsive<T>(value: MkResponsive<T>): value is Partial<Record<MkBreakpoint, T>>;
103
+ /**
104
+ * Reactive viewport breakpoints, one `matchMedia` listener per step.
105
+ *
106
+ * ```ts
107
+ * private readonly bp = inject(MkBreakpointService);
108
+ * readonly compact = this.bp.down('md'); // Signal<boolean>
109
+ * readonly columns = computed(() => this.bp.resolve({ xs: 1, md: 2, xl: 4 }));
110
+ * ```
111
+ *
112
+ * On the server (no `window`) everything reports `xs`.
113
+ */
114
+ declare class MkBreakpointService implements OnDestroy {
115
+ /** The breakpoint scale in effect (see {@link MK_BREAKPOINTS}). */
116
+ readonly breakpoints: MkBreakpoints;
117
+ private readonly document;
118
+ private readonly isBrowser;
119
+ /** `matches` per step, in scale order (`sm` first). */
120
+ private readonly steps;
121
+ private readonly cleanup;
122
+ private readonly queries;
123
+ private readonly ups;
124
+ private readonly downs;
125
+ /** The widest breakpoint the viewport currently satisfies. */
126
+ readonly current: Signal<MkBreakpoint>;
127
+ constructor();
128
+ /** True while the viewport is at least `bp` wide (`up('md')` = md, lg, xl, 2xl). */
129
+ up(bp: MkBreakpoint): Signal<boolean>;
130
+ /** True while the viewport is narrower than `bp` (`down('md')` = xs, sm). */
131
+ down(bp: MkBreakpoint): Signal<boolean>;
132
+ /** True while the viewport is at least `from` and narrower than `to`. */
133
+ between(from: MkBreakpoint, to: MkBreakpoint): Signal<boolean>;
134
+ /** Any media query as a signal, e.g. `observe('(orientation: portrait)')`. */
135
+ observe(query: string): Signal<boolean>;
136
+ /**
137
+ * Pick the entry of a responsive value for the current viewport —
138
+ * mobile-first, so `{ xs: 1, md: 2 }` gives 1 on `sm` and 2 on `xl`.
139
+ * A plain value is returned as is. Read inside a `computed` to track it.
140
+ */
141
+ resolve<T>(value: MkResponsive<T>): T | undefined;
142
+ ngOnDestroy(): void;
143
+ private watch;
144
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkBreakpointService, never>;
145
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MkBreakpointService>;
146
+ }
147
+
87
148
  type MkAriaLivePoliteness = 'polite' | 'assertive';
88
149
  /**
89
150
  * Announces messages to assistive technology via a visually-hidden
@@ -339,6 +400,12 @@ declare class MkAnchoredPanel implements AfterViewInit, OnDestroy {
339
400
  readonly flip: _angular_core.InputSignal<boolean>;
340
401
  /** Clamp the panel inside the viewport. */
341
402
  readonly clamp: _angular_core.InputSignal<boolean>;
403
+ /**
404
+ * Predicate consulted before an outside pointerdown dismisses the panel.
405
+ * Return `true` for targets that must keep it open — e.g. a nested panel
406
+ * (a submenu) that lives in the top layer outside this element.
407
+ */
408
+ readonly keepOpenWhen: _angular_core.InputSignal<((target: Node) => boolean) | null>;
342
409
  /** Emitted on an outside pointerdown or when the window loses focus. */
343
410
  readonly dismiss: _angular_core.OutputEmitterRef<void>;
344
411
  private popover;
@@ -371,7 +438,7 @@ declare class MkAnchoredPanel implements AfterViewInit, OnDestroy {
371
438
  private resolveAnchorRect;
372
439
  ngOnDestroy(): void;
373
440
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkAnchoredPanel, never>;
374
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MkAnchoredPanel, "[mkAnchoredPanel]", ["mkAnchoredPanel"], { "anchor": { "alias": "mkAnchoredPanelFor"; "required": false; "isSignal": true; }; "anchorRect": { "alias": "anchorRect"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "matchWidth": { "alias": "matchWidth"; "required": false; "isSignal": true; }; "flip": { "alias": "flip"; "required": false; "isSignal": true; }; "clamp": { "alias": "clamp"; "required": false; "isSignal": true; }; }, { "dismiss": "dismiss"; }, never, never, true, never>;
441
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MkAnchoredPanel, "[mkAnchoredPanel]", ["mkAnchoredPanel"], { "anchor": { "alias": "mkAnchoredPanelFor"; "required": false; "isSignal": true; }; "anchorRect": { "alias": "anchorRect"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "matchWidth": { "alias": "matchWidth"; "required": false; "isSignal": true; }; "flip": { "alias": "flip"; "required": false; "isSignal": true; }; "clamp": { "alias": "clamp"; "required": false; "isSignal": true; }; "keepOpenWhen": { "alias": "keepOpenWhen"; "required": false; "isSignal": true; }; }, { "dismiss": "dismiss"; }, never, never, true, never>;
375
442
  }
376
443
 
377
444
  /** Direction passed to the sort announcer. */
@@ -740,6 +807,16 @@ interface MkI18nStrings {
740
807
  chooseWeek: string;
741
808
  openCalendar: string;
742
809
  openTimeList: string;
810
+ /** Accessible name of the chevron segment of `mk-split-button`. */
811
+ moreActions: string;
812
+ /** Placeholder of `mk-datetime-picker`. */
813
+ selectDateTime: string;
814
+ /** Dialog label of the `mk-datetime-picker` panel. */
815
+ chooseDateTime: string;
816
+ /** Listbox label of the time list inside `mk-datetime-picker`. */
817
+ chooseTime: string;
818
+ /** Toggle-button label of `mk-datetime-picker`. */
819
+ openDateTimePicker: string;
743
820
  /** Mini-date segment names. */
744
821
  daySegment: string;
745
822
  monthSegment: string;
@@ -764,6 +841,9 @@ interface MkI18nStrings {
764
841
  /** Row expander toggle labels. */
765
842
  expandRow: string;
766
843
  collapseRow: string;
844
+ /** Tree-row toggle labels (`childrenKey`). */
845
+ expandTreeRow: string;
846
+ collapseTreeRow: string;
767
847
  /** aria-label of a group header's toggle when the group is collapsed. */
768
848
  expandGroup: string;
769
849
  /** aria-label of a group header's toggle when the group is expanded. */
@@ -1101,5 +1181,5 @@ type MkErrorMessages = Readonly<Record<string, string | ((err: any) => string)>>
1101
1181
  */
1102
1182
  declare function mkFirstErrorMessage(errors: ValidationErrors | null | undefined, strings: MkValidationStrings, overrides?: MkErrorMessages): string | null;
1103
1183
 
1104
- export { MK_DEFAULT_DATE_NAMES, MK_DEFAULT_I18N, MK_DEFAULT_VALIDATION, MK_I18N, MK_OVERLAY_DATA, MkAnchoredPanel, MkFieldContext, MkFocusTrap, MkLiveAnnouncer, MkOverlayRef, MkOverlayService, MkThemeService, mkComputeAnchoredPosition, mkFirstErrorMessage, mkGetFocusable, mkHighlight, mkHighlightJson, mkUniqueId, mkValidatorChange, provideMkI18n };
1105
- export type { MkAnchoredPosition, MkAnchoredPositionOptions, MkAriaLivePoliteness, MkBlockEditorStrings, MkCodeLanguage, MkDateNames, MkDensity, MkErrorMessages, MkI18nStrings, MkOverlayConfig, MkPlacement, MkResolvedTheme, MkSize$1 as MkSize, MkSortAnnounceDirection, MkThemePreference, MkTone, MkValidationStrings, MkValidatorChangeRef, MkVariant };
1184
+ export { MK_BREAKPOINTS, MK_DEFAULT_BREAKPOINTS, MK_DEFAULT_DATE_NAMES, MK_DEFAULT_I18N, MK_DEFAULT_VALIDATION, MK_I18N, MK_OVERLAY_DATA, MkAnchoredPanel, MkBreakpointService, MkFieldContext, MkFocusTrap, MkLiveAnnouncer, MkOverlayRef, MkOverlayService, MkThemeService, mkComputeAnchoredPosition, mkFirstErrorMessage, mkGetFocusable, mkHighlight, mkHighlightJson, mkIsResponsive, mkUniqueId, mkValidatorChange, provideMkI18n };
1185
+ export type { MkAnchoredPosition, MkAnchoredPositionOptions, MkAriaLivePoliteness, MkBlockEditorStrings, MkBreakpoint, MkBreakpoints, MkCodeLanguage, MkDateNames, MkDensity, MkErrorMessages, MkI18nStrings, MkOverlayConfig, MkPlacement, MkResolvedTheme, MkResponsive, MkSize$1 as MkSize, MkSortAnnounceDirection, MkThemePreference, MkTone, MkValidationStrings, MkValidatorChangeRef, MkVariant };
@@ -53,9 +53,11 @@ declare function parseISODate(value: string | null | undefined): Date | null;
53
53
  /**
54
54
  * Format `date` using a small pattern set. Supported tokens:
55
55
  * `yyyy` (4-digit year), `MMMM` (full month), `MMM` (short month),
56
- * `MM` (2-digit month), `dd` (2-digit day), `d` (day), `ddd` (short weekday).
57
- * Longer tokens are matched first so `MMMM` wins over `MM`.
58
- * Month/weekday names come from `names` when given, else English.
56
+ * `MM` (2-digit month), `dd` (2-digit day), `d` (day), `ddd` (short weekday),
57
+ * `HH` / `H` (24-hour, padded / bare), `hh` / `h` (12-hour, padded / bare),
58
+ * `mm` (2-digit minutes) and `a` (`AM` / `PM`). Longer tokens are matched
59
+ * first so `MMMM` wins over `MM`. Month/weekday names come from `names` when
60
+ * given, else English.
59
61
  */
60
62
  declare function formatDate(date: Date, pattern: string, names?: MkDateNames): string;
61
63
  /**
@@ -313,7 +315,7 @@ declare class MkDatePicker implements ControlValueAccessor, Validator {
313
315
  }
314
316
 
315
317
  /** A selectable time option. */
316
- interface MkTimeOption {
318
+ interface MkTimeOption$1 {
317
319
  /** Canonical `HH:mm` (24h) value. */
318
320
  value: string;
319
321
  /** Display label (respects `hour12`). */
@@ -401,7 +403,7 @@ declare class MkTimePicker implements ControlValueAccessor, Validator {
401
403
  protected readonly describedBy: _angular_core.Signal<string | null>;
402
404
  protected readonly showClear: _angular_core.Signal<boolean>;
403
405
  /** Generated, min/max-filtered list of selectable times. */
404
- protected readonly options: _angular_core.Signal<MkTimeOption[]>;
406
+ protected readonly options: _angular_core.Signal<MkTimeOption$1[]>;
405
407
  protected readonly selectedIndex: _angular_core.Signal<number>;
406
408
  constructor();
407
409
  protected optionId(index: number): string;
@@ -454,6 +456,161 @@ declare class MkTimePicker implements ControlValueAccessor, Validator {
454
456
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkTimePicker, "mk-time-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "hour12": { "alias": "hour12"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
455
457
  }
456
458
 
459
+ /** A selectable time-of-day option in the panel's list. */
460
+ interface MkTimeOption {
461
+ /** Minutes since midnight. */
462
+ minutes: number;
463
+ /** Display label (respects `hour12`). */
464
+ label: string;
465
+ /** Stable id for `aria-activedescendant`. */
466
+ id: string;
467
+ }
468
+ /**
469
+ * DateTimePicker — one field for a date **and** a time of day. The panel pairs
470
+ * an `mk-calendar` with a time list generated from `step`; the value is a
471
+ * single `Date` carrying both parts in local time (seconds and milliseconds
472
+ * zeroed). Implements `ControlValueAccessor` and a two-way `value` model, so it
473
+ * works with `[(ngModel)]`, reactive forms and `[(value)]`.
474
+ *
475
+ * Interaction: picking a day keeps the panel open and — when a value already
476
+ * exists — moves that value to the new day, preserving its time; picking a
477
+ * time commits and closes. With no value yet, the day is held until a time is
478
+ * chosen (so a half-picked datetime is never emitted). Typing also works:
479
+ * `2026-08-26 14:30`, `2026-08-26T09:05`, `Aug 26, 2026 2:30 pm` and a bare
480
+ * ISO date (→ midnight) are parsed on Enter/blur.
481
+ *
482
+ * `min` / `max` bound the whole instant at minute precision: the calendar
483
+ * greys out days outside the range and the time list hides times outside it
484
+ * on the boundary days. Validation reports `mkMinDate` / `mkMaxDate`.
485
+ *
486
+ * When nested in an `mk-form-field` it adopts the field's id and aria wiring.
487
+ *
488
+ * ```html
489
+ * <mk-datetime-picker [(value)]="startsAt" [step]="15" [min]="now" clearable />
490
+ * <mk-datetime-picker [(value)]="startsAt" hour12 />
491
+ * ```
492
+ */
493
+ declare class MkDateTimePicker implements ControlValueAccessor, Validator {
494
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
495
+ private readonly field;
496
+ private readonly host;
497
+ private readonly injector;
498
+ private readonly inputRef;
499
+ /** The panel — lives in the top layer once opened. */
500
+ private readonly panelRef;
501
+ private readonly timesRef;
502
+ /** Two-way selected date-time (local; seconds and ms are zero). */
503
+ readonly value: _angular_core.ModelSignal<Date | null>;
504
+ /** Earliest selectable instant (inclusive, minute precision). */
505
+ readonly min: _angular_core.InputSignal<Date | null>;
506
+ /** Latest selectable instant (inclusive, minute precision). */
507
+ readonly max: _angular_core.InputSignal<Date | null>;
508
+ /** Predicate marking individual days as disabled (threaded to the calendar). */
509
+ readonly disabledDate: _angular_core.InputSignal<((d: Date) => boolean) | null>;
510
+ /** Placeholder shown when empty. */
511
+ readonly placeholder: _angular_core.InputSignal<string>;
512
+ /**
513
+ * Pattern used to render the value in the field. Defaults to
514
+ * `'MMM d, yyyy HH:mm'`, or `'MMM d, yyyy h:mm a'` when `hour12` is set.
515
+ */
516
+ readonly displayFormat: _angular_core.InputSignal<string | null>;
517
+ /** Interval between generated time options, in minutes. */
518
+ readonly step: _angular_core.InputSignalWithTransform<number, unknown>;
519
+ /** Display 12-hour times with AM/PM (the model is a `Date` either way). */
520
+ readonly hour12: _angular_core.InputSignalWithTransform<boolean, unknown>;
521
+ /** Disable the control. */
522
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
523
+ /** Show a clear button when a value is selected. */
524
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
525
+ /** Force invalid styling + `aria-invalid`. */
526
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
527
+ /** First column of the calendar week (0 = Sunday). */
528
+ readonly firstDayOfWeek: _angular_core.InputSignalWithTransform<number, unknown>;
529
+ /** Control size. Ignored when nested in an `mk-form-field`. */
530
+ readonly size: _angular_core.InputSignal<MkSize>;
531
+ protected readonly open: _angular_core.WritableSignal<boolean>;
532
+ /** Editable text mirror of the field. */
533
+ protected readonly inputText: _angular_core.WritableSignal<string>;
534
+ /** Keyboard-active option in the time list (index into `options`). */
535
+ protected readonly activeIndex: _angular_core.WritableSignal<number>;
536
+ /** Day picked in the calendar while there is no value yet. */
537
+ private readonly pendingDay;
538
+ private readonly cvaDisabled;
539
+ private onChange;
540
+ private onTouched;
541
+ readonly inputId: string;
542
+ readonly panelId: string;
543
+ readonly listId: string;
544
+ protected readonly effectiveSize: _angular_core.Signal<MkSize>;
545
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
546
+ protected readonly isInvalid: _angular_core.Signal<boolean>;
547
+ protected readonly isRequired: _angular_core.Signal<boolean>;
548
+ protected readonly describedBy: _angular_core.Signal<string | null>;
549
+ protected readonly showClear: _angular_core.Signal<boolean>;
550
+ protected readonly effectiveFormat: _angular_core.Signal<string>;
551
+ /** The day the calendar shows as selected: the value's day, else the pending one. */
552
+ protected readonly calendarValue: _angular_core.Signal<Date | null>;
553
+ /** Day-granular bounds for the calendar (inclusive). */
554
+ protected readonly calendarMin: _angular_core.Signal<Date | null>;
555
+ protected readonly calendarMax: _angular_core.Signal<Date | null>;
556
+ /**
557
+ * Generated time options. On the `min` / `max` boundary day the list only
558
+ * offers times inside the bound; on other days every step is listed.
559
+ */
560
+ protected readonly options: _angular_core.Signal<MkTimeOption[]>;
561
+ protected readonly selectedIndex: _angular_core.Signal<number>;
562
+ constructor();
563
+ private displayTime;
564
+ /**
565
+ * Accepts `YYYY-MM-DD[ T]HH:mm[ am|pm]`, a bare ISO date (→ midnight), any
566
+ * `Date.parse`-able date followed by a time, or a full `Date.parse`-able
567
+ * string. Seconds are dropped.
568
+ */
569
+ private parse;
570
+ private clamp;
571
+ protected toggle(): void;
572
+ protected openPanel(): void;
573
+ protected close(): void;
574
+ /** Index of the first option at or after `d`'s time of day (for the initial highlight). */
575
+ private nearestIndex;
576
+ protected onCalendarPick(day: Date | null): void;
577
+ protected selectTime(index: number): void;
578
+ protected onListKeydown(event: Event): void;
579
+ private moveActive;
580
+ private scrollActiveIntoView;
581
+ protected onInput(event: Event): void;
582
+ protected onInputKeydown(event: Event): void;
583
+ protected clear(): void;
584
+ private commitInput;
585
+ private setValue;
586
+ protected onFocusOut(event: Event): void;
587
+ /**
588
+ * Escape pressed inside the (teleported) panel — close and return focus to
589
+ * the input. `preventDefault` + `stopPropagation` keep any outer Escape
590
+ * handling (e.g. a containing dialog) from also firing.
591
+ */
592
+ protected onPanelEscape(event: Event): void;
593
+ /**
594
+ * Focus left the teleported panel. The host `(focusout)` never sees this —
595
+ * the panel lives under `document.body` — so Tab-out is handled here: close
596
+ * unless focus moved back into the field or stayed inside the panel.
597
+ */
598
+ protected onPanelFocusout(event: FocusEvent): void;
599
+ writeValue(value: Date | null): void;
600
+ registerOnChange(fn: (value: Date | null) => void): void;
601
+ registerOnTouched(fn: () => void): void;
602
+ setDisabledState(isDisabled: boolean): void;
603
+ private readonly validatorChange;
604
+ /**
605
+ * Reports `mkMinDate` / `mkMaxDate` against the `[min]` and `[max]` inputs,
606
+ * comparing whole instants at minute precision.
607
+ */
608
+ validate(control: AbstractControl): ValidationErrors | null;
609
+ registerOnValidatorChange(fn: () => void): void;
610
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkDateTimePicker, never>;
611
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkDateTimePicker, "mk-datetime-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "disabledDate": { "alias": "disabledDate"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "displayFormat": { "alias": "displayFormat"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "hour12": { "alias": "hour12"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
612
+ }
613
+
457
614
  /** A selected date range. Either endpoint may be `null` while incomplete. */
458
615
  interface MkDateRange {
459
616
  start: Date | null;
@@ -1167,5 +1324,5 @@ declare class MkMiniDate implements ControlValueAccessor, Validator {
1167
1324
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkMiniDate, "mk-mini-date", ["mkMiniDate"], { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "order": { "alias": "order"; "required": false; "isSignal": true; }; "yearMin": { "alias": "yearMin"; "required": false; "isSignal": true; }; "yearMax": { "alias": "yearMax"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
1168
1325
  }
1169
1326
 
1170
- export { MkCalendar, MkDatePicker, MkDateRangePicker, MkEventCalendar, MkMiniDate, MkMonthPicker, MkTimePicker, MkWeekPicker, addDays, addMonths, buildMonthMatrix, clampDate, endOfMonth, endOfWeek, formatDate, formatISODate, getISOWeek, getMonthNames, getWeekdayFullName, getWeekdayNames, isAfter, isBefore, isSameDay, isSameMonth, parseISODate, startOfDay, startOfMonth, startOfWeek };
1327
+ export { MkCalendar, MkDatePicker, MkDateRangePicker, MkDateTimePicker, MkEventCalendar, MkMiniDate, MkMonthPicker, MkTimePicker, MkWeekPicker, addDays, addMonths, buildMonthMatrix, clampDate, endOfMonth, endOfWeek, formatDate, formatISODate, getISOWeek, getMonthNames, getWeekdayFullName, getWeekdayNames, isAfter, isBefore, isSameDay, isSameMonth, parseISODate, startOfDay, startOfMonth, startOfWeek };
1171
1328
  export type { MkCalendarEvent, MkCalendarEventEdit, MkCalendarView, MkDateRange, MkMiniDateOrder, MkMonthPickerMode, MkWeek, MkWeekday };
@@ -37,7 +37,8 @@ declare class MkIcon {
37
37
 
38
38
  /**
39
39
  * IconRegistry — the name → SVG store behind `<mk-icon name="…">`. The built-in
40
- * {@link MK_DEFAULT_ICONS} set is registered on construction; add your own SVGs
40
+ * sets — the hand-made {@link MK_DEFAULT_ICONS} and the Lucide-derived
41
+ * {@link MK_EXTENDED_ICONS} — are registered on construction; add your own SVGs
41
42
  * (from a sprite, a design export, anything) with {@link register} /
42
43
  * {@link registerIcons}.
43
44
  *
@@ -105,4 +106,7 @@ declare const MK_MATERIAL_ICON_ALIASES: Readonly<Record<string, string>>;
105
106
  */
106
107
  declare function provideMkMaterialIcons(): EnvironmentProviders;
107
108
 
108
- export { MK_DEFAULT_ICONS, MK_MATERIAL_ICON_ALIASES, MkIcon, MkIconRegistry, provideMkMaterialIcons };
109
+ /** Name SVG markup map of the Lucide-derived icons registered by default. */
110
+ declare const MK_EXTENDED_ICONS: Readonly<Record<string, string>>;
111
+
112
+ export { MK_DEFAULT_ICONS, MK_EXTENDED_ICONS, MK_MATERIAL_ICON_ALIASES, MkIcon, MkIconRegistry, provideMkMaterialIcons };