@mk-kit/ui 0.34.1 → 0.35.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.
@@ -57,7 +57,7 @@ const WEEKDAY_NAMES_SHORT = [
57
57
  ];
58
58
  /** English single-letter weekday names (narrow). */
59
59
  const WEEKDAY_NAMES_NARROW = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
60
- function pad2$1(n) {
60
+ function pad2$2(n) {
61
61
  return n < 10 ? `0${n}` : `${n}`;
62
62
  }
63
63
  /** True when both dates fall on the same calendar day (local time). */
@@ -142,7 +142,7 @@ function clampDate(date, min, max) {
142
142
  }
143
143
  /** Format `date` as an ISO calendar date `YYYY-MM-DD` (local time). */
144
144
  function formatISODate(date) {
145
- return `${date.getFullYear().toString().padStart(4, '0')}-${pad2$1(date.getMonth() + 1)}-${pad2$1(date.getDate())}`;
145
+ return `${date.getFullYear().toString().padStart(4, '0')}-${pad2$2(date.getMonth() + 1)}-${pad2$2(date.getDate())}`;
146
146
  }
147
147
  /** Parse a `YYYY-MM-DD` string into a local-time `Date`, or `null` if invalid. */
148
148
  function parseISODate(value) {
@@ -166,21 +166,29 @@ function parseISODate(value) {
166
166
  /**
167
167
  * Format `date` using a small pattern set. Supported tokens:
168
168
  * `yyyy` (4-digit year), `MMMM` (full month), `MMM` (short month),
169
- * `MM` (2-digit month), `dd` (2-digit day), `d` (day), `ddd` (short weekday).
170
- * Longer tokens are matched first so `MMMM` wins over `MM`.
171
- * Month/weekday names come from `names` when given, else English.
169
+ * `MM` (2-digit month), `dd` (2-digit day), `d` (day), `ddd` (short weekday),
170
+ * `HH` / `H` (24-hour, padded / bare), `hh` / `h` (12-hour, padded / bare),
171
+ * `mm` (2-digit minutes) and `a` (`AM` / `PM`). Longer tokens are matched
172
+ * first so `MMMM` wins over `MM`. Month/weekday names come from `names` when
173
+ * given, else English.
172
174
  */
173
175
  function formatDate(date, pattern, names) {
174
176
  const tokens = [
175
177
  ['yyyy', () => date.getFullYear().toString().padStart(4, '0')],
176
178
  ['MMMM', () => (names?.months ?? MONTH_NAMES)[date.getMonth()]],
177
179
  ['MMM', () => (names?.monthsShort ?? MONTH_NAMES_SHORT)[date.getMonth()]],
178
- ['MM', () => pad2$1(date.getMonth() + 1)],
180
+ ['MM', () => pad2$2(date.getMonth() + 1)],
179
181
  // Longest-first: 'ddd' (short weekday) must be matched before 'dd'/'d',
180
182
  // otherwise 'ddd' is consumed as 'dd' + 'd' and produces day numbers.
181
183
  ['ddd', () => (names?.weekdaysShort ?? WEEKDAY_NAMES_SHORT)[date.getDay()]],
182
- ['dd', () => pad2$1(date.getDate())],
184
+ ['dd', () => pad2$2(date.getDate())],
183
185
  ['d', () => date.getDate().toString()],
186
+ ['HH', () => pad2$2(date.getHours())],
187
+ ['H', () => date.getHours().toString()],
188
+ ['hh', () => pad2$2(date.getHours() % 12 || 12)],
189
+ ['h', () => (date.getHours() % 12 || 12).toString()],
190
+ ['mm', () => pad2$2(date.getMinutes())],
191
+ ['a', () => (date.getHours() < 12 ? 'AM' : 'PM')],
184
192
  ];
185
193
  let result = '';
186
194
  let i = 0;
@@ -777,9 +785,15 @@ class MkDatePicker {
777
785
  this.setValue(clampDate(parsed, this.min(), this.max()));
778
786
  }
779
787
  else {
780
- // Invalid entry — revert to the current model's display.
788
+ // Invalid entry — revert to the current model's display. The signal may
789
+ // already hold that string (the model did not change), so the `[value]`
790
+ // binding would not re-apply it: write the DOM value directly as well.
781
791
  const v = this.value();
782
- this.inputText.set(v ? formatDate(v, this.displayFormat(), this.i18n.dateNames) : '');
792
+ const text = v ? formatDate(v, this.displayFormat(), this.i18n.dateNames) : '';
793
+ this.inputText.set(text);
794
+ const el = this.inputRef()?.nativeElement;
795
+ if (el)
796
+ el.value = text;
783
797
  }
784
798
  }
785
799
  parse(text) {
@@ -883,7 +897,7 @@ class MkDatePicker {
883
897
  useExisting: forwardRef(() => MkDatePicker),
884
898
  multi: true,
885
899
  },
886
- ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["textInput"], descendants: true, isSignal: true }, { propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-date-picker__field\">\n <input\n #textInput\n type=\"text\"\n class=\"mk-date-picker__input\"\n [id]=\"inputId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n />\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-date-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-date-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"mk-date-picker__toggle\"\n [attr.aria-label]=\"i18n.openCalendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <svg\n class=\"mk-date-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\" />\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\n </svg>\n </button>\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-date-picker__panel\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n [id]=\"panelId\"\n role=\"dialog\"\n [attr.aria-label]=\"i18n.chooseDate\"\n (keydown.escape)=\"onPanelEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <mk-calendar\n [value]=\"value()\"\n (valueChange)=\"onCalendarPick($event)\"\n [min]=\"min()\"\n [max]=\"max()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [size]=\"effectiveSize()\"\n [disabledDate]=\"disabledDate()\"\n />\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-date-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-date-picker--sm) .mk-date-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-date-picker--lg) .mk-date-picker__field{height:var(--mk-control-height-lg)}.mk-date-picker__field:hover{border-color:var(--mk-border-strong)}.mk-date-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-date-picker--invalid) .mk-date-picker__field{border-color:var(--mk-danger)}:host(.mk-date-picker--invalid) .mk-date-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-date-picker--disabled) .mk-date-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-date-picker__input{flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);background:transparent;border:0;outline:none}:host(.mk-date-picker--sm) .mk-date-picker__input{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-date-picker--lg) .mk-date-picker__input{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-date-picker__input::placeholder{color:var(--mk-text-subtle);opacity:1}.mk-date-picker__input:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-date-picker__toggle,.mk-date-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-date-picker__toggle:hover:not(:disabled),.mk-date-picker__clear:hover{color:var(--mk-text)}.mk-date-picker__toggle:focus-visible,.mk-date-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-date-picker__toggle:disabled{cursor:not-allowed}.mk-date-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-date-picker__clear-icon:before,.mk-date-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-date-picker__clear-icon:before{transform:rotate(45deg)}.mk-date-picker__clear-icon:after{transform:rotate(-45deg)}.mk-date-picker__panel{box-shadow:var(--mk-shadow-lg);border-radius:var(--mk-radius-lg)}@media(prefers-reduced-motion:reduce){.mk-date-picker__field,.mk-date-picker__toggle,.mk-date-picker__clear{transition:none}}@media(pointer:coarse){.mk-date-picker__input{font-size:max(var(--mk-font-size-md),16px)}:host(.mk-date-picker--sm) .mk-date-picker__input{font-size:max(var(--mk-font-size-sm),16px)}}\n"], dependencies: [{ kind: "component", type: MkCalendar, selector: "mk-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "disabled", "invalid", "disabledDate", "size", "fullWidth", "rangeMode", "rangeStart", "rangeEnd"], outputs: ["valueChange", "dateSelected", "dateHovered"] }, { kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
900
+ ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["textInput"], descendants: true, isSignal: true }, { propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-date-picker__field\">\n <input\n #textInput\n type=\"text\"\n class=\"mk-date-picker__input\"\n [id]=\"inputId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n />\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-date-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-date-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"mk-date-picker__toggle\"\n [attr.aria-label]=\"i18n.openCalendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <svg\n class=\"mk-date-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\" />\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\n </svg>\n </button>\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-date-picker__panel\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n [id]=\"panelId\"\n role=\"dialog\"\n [attr.aria-label]=\"i18n.chooseDate\"\n (keydown.escape)=\"onPanelEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <mk-calendar\n [value]=\"value()\"\n (valueChange)=\"onCalendarPick($event)\"\n [min]=\"min()\"\n [max]=\"max()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [size]=\"effectiveSize()\"\n [disabledDate]=\"disabledDate()\"\n />\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-date-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-date-picker--sm) .mk-date-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-date-picker--lg) .mk-date-picker__field{height:var(--mk-control-height-lg)}.mk-date-picker__field:hover{border-color:var(--mk-border-strong)}.mk-date-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-date-picker--invalid) .mk-date-picker__field{border-color:var(--mk-danger)}:host(.mk-date-picker--invalid) .mk-date-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-date-picker--disabled) .mk-date-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-date-picker__input{flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);background:transparent;border:0;outline:none}:host(.mk-date-picker--sm) .mk-date-picker__input{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-date-picker--lg) .mk-date-picker__input{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-date-picker__input::placeholder{color:var(--mk-text-subtle);opacity:1}.mk-date-picker__input:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-date-picker__toggle,.mk-date-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-date-picker__toggle:hover:not(:disabled),.mk-date-picker__clear:hover{color:var(--mk-text)}.mk-date-picker__toggle:focus-visible,.mk-date-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-date-picker__toggle:disabled{cursor:not-allowed}.mk-date-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-date-picker__clear-icon:before,.mk-date-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-date-picker__clear-icon:before{transform:rotate(45deg)}.mk-date-picker__clear-icon:after{transform:rotate(-45deg)}.mk-date-picker__panel{box-shadow:var(--mk-shadow-lg);border-radius:var(--mk-radius-lg)}@media(prefers-reduced-motion:reduce){.mk-date-picker__field,.mk-date-picker__toggle,.mk-date-picker__clear{transition:none}}@media(pointer:coarse){.mk-date-picker__input{font-size:max(var(--mk-font-size-md),16px)}:host(.mk-date-picker--sm) .mk-date-picker__input{font-size:max(var(--mk-font-size-sm),16px)}}\n"], dependencies: [{ kind: "component", type: MkCalendar, selector: "mk-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "disabled", "invalid", "disabledDate", "size", "fullWidth", "rangeMode", "rangeStart", "rangeEnd"], outputs: ["valueChange", "dateSelected", "dateHovered"] }, { kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp", "keepOpenWhen"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
887
901
  }
888
902
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkDatePicker, decorators: [{
889
903
  type: Component,
@@ -910,7 +924,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
910
924
  ], template: "<div #field class=\"mk-date-picker__field\">\n <input\n #textInput\n type=\"text\"\n class=\"mk-date-picker__input\"\n [id]=\"inputId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n />\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-date-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-date-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"mk-date-picker__toggle\"\n [attr.aria-label]=\"i18n.openCalendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <svg\n class=\"mk-date-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\" />\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\n </svg>\n </button>\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-date-picker__panel\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n [id]=\"panelId\"\n role=\"dialog\"\n [attr.aria-label]=\"i18n.chooseDate\"\n (keydown.escape)=\"onPanelEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <mk-calendar\n [value]=\"value()\"\n (valueChange)=\"onCalendarPick($event)\"\n [min]=\"min()\"\n [max]=\"max()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [size]=\"effectiveSize()\"\n [disabledDate]=\"disabledDate()\"\n />\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-date-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-date-picker--sm) .mk-date-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-date-picker--lg) .mk-date-picker__field{height:var(--mk-control-height-lg)}.mk-date-picker__field:hover{border-color:var(--mk-border-strong)}.mk-date-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-date-picker--invalid) .mk-date-picker__field{border-color:var(--mk-danger)}:host(.mk-date-picker--invalid) .mk-date-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-date-picker--disabled) .mk-date-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-date-picker__input{flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);background:transparent;border:0;outline:none}:host(.mk-date-picker--sm) .mk-date-picker__input{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-date-picker--lg) .mk-date-picker__input{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-date-picker__input::placeholder{color:var(--mk-text-subtle);opacity:1}.mk-date-picker__input:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-date-picker__toggle,.mk-date-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-date-picker__toggle:hover:not(:disabled),.mk-date-picker__clear:hover{color:var(--mk-text)}.mk-date-picker__toggle:focus-visible,.mk-date-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-date-picker__toggle:disabled{cursor:not-allowed}.mk-date-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-date-picker__clear-icon:before,.mk-date-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-date-picker__clear-icon:before{transform:rotate(45deg)}.mk-date-picker__clear-icon:after{transform:rotate(-45deg)}.mk-date-picker__panel{box-shadow:var(--mk-shadow-lg);border-radius:var(--mk-radius-lg)}@media(prefers-reduced-motion:reduce){.mk-date-picker__field,.mk-date-picker__toggle,.mk-date-picker__clear{transition:none}}@media(pointer:coarse){.mk-date-picker__input{font-size:max(var(--mk-font-size-md),16px)}:host(.mk-date-picker--sm) .mk-date-picker__input{font-size:max(var(--mk-font-size-sm),16px)}}\n"] }]
911
925
  }], ctorParameters: () => [], propDecorators: { inputRef: [{ type: i0.ViewChild, args: ['textInput', { isSignal: true }] }], panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], disabledDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDate", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], displayFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayFormat", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
912
926
 
913
- function pad2(n) {
927
+ function pad2$1(n) {
914
928
  return n < 10 ? `0${n}` : `${n}`;
915
929
  }
916
930
  /**
@@ -1020,7 +1034,7 @@ class MkTimePicker {
1020
1034
  const max = this.max();
1021
1035
  const out = [];
1022
1036
  for (let mins = 0; mins < 24 * 60; mins += step) {
1023
- const value = `${pad2(Math.floor(mins / 60))}:${pad2(mins % 60)}`;
1037
+ const value = `${pad2$1(Math.floor(mins / 60))}:${pad2$1(mins % 60)}`;
1024
1038
  if (min && value < min)
1025
1039
  continue;
1026
1040
  if (max && value > max)
@@ -1059,9 +1073,9 @@ class MkTimePicker {
1059
1073
  if (this.hour12()) {
1060
1074
  const ap = h < 12 ? 'AM' : 'PM';
1061
1075
  const hh = h % 12 || 12;
1062
- return `${hh}:${pad2(m)} ${ap}`;
1076
+ return `${hh}:${pad2$1(m)} ${ap}`;
1063
1077
  }
1064
- return `${pad2(h)}:${pad2(m)}`;
1078
+ return `${pad2$1(h)}:${pad2$1(m)}`;
1065
1079
  }
1066
1080
  parse(text) {
1067
1081
  const m = /^\s*(\d{1,2})(?::(\d{2}))?\s*(am|pm)?\s*$/i.exec(text);
@@ -1080,7 +1094,7 @@ class MkTimePicker {
1080
1094
  }
1081
1095
  if (h > 23 || min > 59)
1082
1096
  return null;
1083
- return `${pad2(h)}:${pad2(min)}`;
1097
+ return `${pad2$1(h)}:${pad2$1(min)}`;
1084
1098
  }
1085
1099
  toggle() {
1086
1100
  if (this.isDisabled())
@@ -1234,7 +1248,7 @@ class MkTimePicker {
1234
1248
  /** Normalise any accepted shape to canonical `HH:mm`, or `null`. */
1235
1249
  toHhmm(v) {
1236
1250
  if (v instanceof Date) {
1237
- return Number.isNaN(v.getTime()) ? null : `${pad2(v.getHours())}:${pad2(v.getMinutes())}`;
1251
+ return Number.isNaN(v.getTime()) ? null : `${pad2$1(v.getHours())}:${pad2$1(v.getMinutes())}`;
1238
1252
  }
1239
1253
  if (typeof v !== 'string' || !v.trim())
1240
1254
  return null;
@@ -1321,7 +1335,7 @@ class MkTimePicker {
1321
1335
  useExisting: forwardRef(() => MkTimePicker),
1322
1336
  multi: true,
1323
1337
  },
1324
- ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["textInput"], descendants: true, isSignal: true }, { propertyName: "listRef", first: true, predicate: ["list"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-time-picker__field\">\n <input\n #textInput\n type=\"text\"\n class=\"mk-time-picker__input\"\n [id]=\"inputId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"\n open() && activeIndex() >= 0 ? optionId(activeIndex()) : null\n \"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n />\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-time-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-time-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"mk-time-picker__toggle\"\n [attr.aria-label]=\"i18n.openTimeList\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <svg\n class=\"mk-time-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 7v5l3 2\" />\n </svg>\n </button>\n</div>\n\n@if (open()) {\n <ul\n #list\n class=\"mk-time-picker__list\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n [matchWidth]=\"true\"\n (dismiss)=\"close()\"\n [id]=\"listId\"\n role=\"listbox\"\n >\n @for (opt of options(); track opt.value; let i = $index) {\n <li\n class=\"mk-time-picker__option\"\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"i === selectedIndex()\"\n [class.mk-time-picker__option--active]=\"i === activeIndex()\"\n [class.mk-time-picker__option--selected]=\"i === selectedIndex()\"\n (mousedown)=\"$event.preventDefault()\"\n (mousemove)=\"activeIndex.set(i)\"\n (click)=\"selectOption(i)\"\n >\n {{ opt.label }}\n </li>\n } @empty {\n <li class=\"mk-time-picker__empty\" role=\"presentation\">\n {{ i18n.noOptions }}\n </li>\n }\n </ul>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-time-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-time-picker--sm) .mk-time-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-time-picker--lg) .mk-time-picker__field{height:var(--mk-control-height-lg)}.mk-time-picker__field:hover{border-color:var(--mk-border-strong)}.mk-time-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-time-picker--invalid) .mk-time-picker__field{border-color:var(--mk-danger)}:host(.mk-time-picker--invalid) .mk-time-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-time-picker--disabled) .mk-time-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-time-picker__input{flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);background:transparent;border:0;outline:none}:host(.mk-time-picker--sm) .mk-time-picker__input{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-time-picker--lg) .mk-time-picker__input{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-time-picker__input::placeholder{color:var(--mk-text-subtle);opacity:1}.mk-time-picker__input:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-time-picker__toggle,.mk-time-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-time-picker__toggle:hover:not(:disabled),.mk-time-picker__clear:hover{color:var(--mk-text)}.mk-time-picker__toggle:focus-visible,.mk-time-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-time-picker__toggle:disabled{cursor:not-allowed}.mk-time-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-time-picker__clear-icon:before,.mk-time-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-time-picker__clear-icon:before{transform:rotate(45deg)}.mk-time-picker__clear-icon:after{transform:rotate(-45deg)}.mk-time-picker__list{padding:var(--mk-space-1);list-style:none;max-height:15rem;overflow-y:auto;background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);box-shadow:var(--mk-shadow-lg)}.mk-time-picker__option{padding:var(--mk-space-2) var(--mk-space-3);font-size:var(--mk-font-size-md);color:var(--mk-text);border-radius:var(--mk-radius-sm);cursor:pointer;-webkit-user-select:none;user-select:none}.mk-time-picker__option--active{background-color:var(--mk-selected-bg)}.mk-time-picker__option--selected{color:var(--mk-selected-text);font-weight:var(--mk-font-weight-medium)}.mk-time-picker__empty{padding:var(--mk-space-2) var(--mk-space-3);color:var(--mk-text-subtle);font-size:var(--mk-font-size-sm)}@media(prefers-reduced-motion:reduce){.mk-time-picker__field,.mk-time-picker__toggle,.mk-time-picker__clear{transition:none}}@media(pointer:coarse){.mk-time-picker__input{font-size:max(var(--mk-font-size-md),16px)}:host(.mk-time-picker--sm) .mk-time-picker__input{font-size:max(var(--mk-font-size-sm),16px)}}\n"], dependencies: [{ kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1338
+ ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["textInput"], descendants: true, isSignal: true }, { propertyName: "listRef", first: true, predicate: ["list"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-time-picker__field\">\n <input\n #textInput\n type=\"text\"\n class=\"mk-time-picker__input\"\n [id]=\"inputId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"\n open() && activeIndex() >= 0 ? optionId(activeIndex()) : null\n \"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n />\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-time-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-time-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"mk-time-picker__toggle\"\n [attr.aria-label]=\"i18n.openTimeList\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <svg\n class=\"mk-time-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 7v5l3 2\" />\n </svg>\n </button>\n</div>\n\n@if (open()) {\n <ul\n #list\n class=\"mk-time-picker__list\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n [matchWidth]=\"true\"\n (dismiss)=\"close()\"\n [id]=\"listId\"\n role=\"listbox\"\n >\n @for (opt of options(); track opt.value; let i = $index) {\n <li\n class=\"mk-time-picker__option\"\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"i === selectedIndex()\"\n [class.mk-time-picker__option--active]=\"i === activeIndex()\"\n [class.mk-time-picker__option--selected]=\"i === selectedIndex()\"\n (mousedown)=\"$event.preventDefault()\"\n (mousemove)=\"activeIndex.set(i)\"\n (click)=\"selectOption(i)\"\n >\n {{ opt.label }}\n </li>\n } @empty {\n <li class=\"mk-time-picker__empty\" role=\"presentation\">\n {{ i18n.noOptions }}\n </li>\n }\n </ul>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-time-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-time-picker--sm) .mk-time-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-time-picker--lg) .mk-time-picker__field{height:var(--mk-control-height-lg)}.mk-time-picker__field:hover{border-color:var(--mk-border-strong)}.mk-time-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-time-picker--invalid) .mk-time-picker__field{border-color:var(--mk-danger)}:host(.mk-time-picker--invalid) .mk-time-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-time-picker--disabled) .mk-time-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-time-picker__input{flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);background:transparent;border:0;outline:none}:host(.mk-time-picker--sm) .mk-time-picker__input{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-time-picker--lg) .mk-time-picker__input{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-time-picker__input::placeholder{color:var(--mk-text-subtle);opacity:1}.mk-time-picker__input:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-time-picker__toggle,.mk-time-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-time-picker__toggle:hover:not(:disabled),.mk-time-picker__clear:hover{color:var(--mk-text)}.mk-time-picker__toggle:focus-visible,.mk-time-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-time-picker__toggle:disabled{cursor:not-allowed}.mk-time-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-time-picker__clear-icon:before,.mk-time-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-time-picker__clear-icon:before{transform:rotate(45deg)}.mk-time-picker__clear-icon:after{transform:rotate(-45deg)}.mk-time-picker__list{padding:var(--mk-space-1);list-style:none;max-height:15rem;overflow-y:auto;background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);box-shadow:var(--mk-shadow-lg)}.mk-time-picker__option{padding:var(--mk-space-2) var(--mk-space-3);font-size:var(--mk-font-size-md);color:var(--mk-text);border-radius:var(--mk-radius-sm);cursor:pointer;-webkit-user-select:none;user-select:none}.mk-time-picker__option--active{background-color:var(--mk-selected-bg)}.mk-time-picker__option--selected{color:var(--mk-selected-text);font-weight:var(--mk-font-weight-medium)}.mk-time-picker__empty{padding:var(--mk-space-2) var(--mk-space-3);color:var(--mk-text-subtle);font-size:var(--mk-font-size-sm)}@media(prefers-reduced-motion:reduce){.mk-time-picker__field,.mk-time-picker__toggle,.mk-time-picker__clear{transition:none}}@media(pointer:coarse){.mk-time-picker__input{font-size:max(var(--mk-font-size-md),16px)}:host(.mk-time-picker--sm) .mk-time-picker__input{font-size:max(var(--mk-font-size-sm),16px)}}\n"], dependencies: [{ kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp", "keepOpenWhen"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1325
1339
  }
1326
1340
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkTimePicker, decorators: [{
1327
1341
  type: Component,
@@ -1348,6 +1362,537 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
1348
1362
  ], template: "<div #field class=\"mk-time-picker__field\">\n <input\n #textInput\n type=\"text\"\n class=\"mk-time-picker__input\"\n [id]=\"inputId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"\n open() && activeIndex() >= 0 ? optionId(activeIndex()) : null\n \"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n />\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-time-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-time-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"mk-time-picker__toggle\"\n [attr.aria-label]=\"i18n.openTimeList\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <svg\n class=\"mk-time-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 7v5l3 2\" />\n </svg>\n </button>\n</div>\n\n@if (open()) {\n <ul\n #list\n class=\"mk-time-picker__list\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n [matchWidth]=\"true\"\n (dismiss)=\"close()\"\n [id]=\"listId\"\n role=\"listbox\"\n >\n @for (opt of options(); track opt.value; let i = $index) {\n <li\n class=\"mk-time-picker__option\"\n [id]=\"optionId(i)\"\n role=\"option\"\n [attr.aria-selected]=\"i === selectedIndex()\"\n [class.mk-time-picker__option--active]=\"i === activeIndex()\"\n [class.mk-time-picker__option--selected]=\"i === selectedIndex()\"\n (mousedown)=\"$event.preventDefault()\"\n (mousemove)=\"activeIndex.set(i)\"\n (click)=\"selectOption(i)\"\n >\n {{ opt.label }}\n </li>\n } @empty {\n <li class=\"mk-time-picker__empty\" role=\"presentation\">\n {{ i18n.noOptions }}\n </li>\n }\n </ul>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-time-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-time-picker--sm) .mk-time-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-time-picker--lg) .mk-time-picker__field{height:var(--mk-control-height-lg)}.mk-time-picker__field:hover{border-color:var(--mk-border-strong)}.mk-time-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-time-picker--invalid) .mk-time-picker__field{border-color:var(--mk-danger)}:host(.mk-time-picker--invalid) .mk-time-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-time-picker--disabled) .mk-time-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-time-picker__input{flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);background:transparent;border:0;outline:none}:host(.mk-time-picker--sm) .mk-time-picker__input{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-time-picker--lg) .mk-time-picker__input{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-time-picker__input::placeholder{color:var(--mk-text-subtle);opacity:1}.mk-time-picker__input:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-time-picker__toggle,.mk-time-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-time-picker__toggle:hover:not(:disabled),.mk-time-picker__clear:hover{color:var(--mk-text)}.mk-time-picker__toggle:focus-visible,.mk-time-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-time-picker__toggle:disabled{cursor:not-allowed}.mk-time-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-time-picker__clear-icon:before,.mk-time-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-time-picker__clear-icon:before{transform:rotate(45deg)}.mk-time-picker__clear-icon:after{transform:rotate(-45deg)}.mk-time-picker__list{padding:var(--mk-space-1);list-style:none;max-height:15rem;overflow-y:auto;background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);box-shadow:var(--mk-shadow-lg)}.mk-time-picker__option{padding:var(--mk-space-2) var(--mk-space-3);font-size:var(--mk-font-size-md);color:var(--mk-text);border-radius:var(--mk-radius-sm);cursor:pointer;-webkit-user-select:none;user-select:none}.mk-time-picker__option--active{background-color:var(--mk-selected-bg)}.mk-time-picker__option--selected{color:var(--mk-selected-text);font-weight:var(--mk-font-weight-medium)}.mk-time-picker__empty{padding:var(--mk-space-2) var(--mk-space-3);color:var(--mk-text-subtle);font-size:var(--mk-font-size-sm)}@media(prefers-reduced-motion:reduce){.mk-time-picker__field,.mk-time-picker__toggle,.mk-time-picker__clear{transition:none}}@media(pointer:coarse){.mk-time-picker__input{font-size:max(var(--mk-font-size-md),16px)}:host(.mk-time-picker--sm) .mk-time-picker__input{font-size:max(var(--mk-font-size-sm),16px)}}\n"] }]
1349
1363
  }], ctorParameters: () => [], propDecorators: { inputRef: [{ type: i0.ViewChild, args: ['textInput', { isSignal: true }] }], listRef: [{ type: i0.ViewChild, args: ['list', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], valueFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueFormat", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], hour12: [{ type: i0.Input, args: [{ isSignal: true, alias: "hour12", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
1350
1364
 
1365
+ function pad2(n) {
1366
+ return n < 10 ? `0${n}` : `${n}`;
1367
+ }
1368
+ /** Minutes since local midnight, ignoring seconds. */
1369
+ function minutesOfDay$1(d) {
1370
+ return d.getHours() * 60 + d.getMinutes();
1371
+ }
1372
+ /** Same instant floored to the minute — bounds compare at minute precision. */
1373
+ function toMinute(d) {
1374
+ const c = new Date(d);
1375
+ c.setSeconds(0, 0);
1376
+ return c.getTime();
1377
+ }
1378
+ /** Put `minutes` since midnight onto `day`'s local date. */
1379
+ function combine(day, minutes) {
1380
+ return new Date(day.getFullYear(), day.getMonth(), day.getDate(), Math.floor(minutes / 60), minutes % 60, 0, 0);
1381
+ }
1382
+ /** Parse `14:30`, `2:30 pm`, `9` … into minutes since midnight, or null. */
1383
+ function parseTime(text) {
1384
+ const m = /^\s*(\d{1,2})(?::(\d{2}))?\s*(am|pm)?\s*$/i.exec(text);
1385
+ if (!m)
1386
+ return null;
1387
+ let h = Number(m[1]);
1388
+ const min = m[2] ? Number(m[2]) : 0;
1389
+ const ap = m[3]?.toLowerCase();
1390
+ if (ap) {
1391
+ if (h < 1 || h > 12)
1392
+ return null;
1393
+ if (ap === 'pm' && h !== 12)
1394
+ h += 12;
1395
+ if (ap === 'am' && h === 12)
1396
+ h = 0;
1397
+ }
1398
+ if (h > 23 || min > 59)
1399
+ return null;
1400
+ return h * 60 + min;
1401
+ }
1402
+ /**
1403
+ * DateTimePicker — one field for a date **and** a time of day. The panel pairs
1404
+ * an `mk-calendar` with a time list generated from `step`; the value is a
1405
+ * single `Date` carrying both parts in local time (seconds and milliseconds
1406
+ * zeroed). Implements `ControlValueAccessor` and a two-way `value` model, so it
1407
+ * works with `[(ngModel)]`, reactive forms and `[(value)]`.
1408
+ *
1409
+ * Interaction: picking a day keeps the panel open and — when a value already
1410
+ * exists — moves that value to the new day, preserving its time; picking a
1411
+ * time commits and closes. With no value yet, the day is held until a time is
1412
+ * chosen (so a half-picked datetime is never emitted). Typing also works:
1413
+ * `2026-08-26 14:30`, `2026-08-26T09:05`, `Aug 26, 2026 2:30 pm` and a bare
1414
+ * ISO date (→ midnight) are parsed on Enter/blur.
1415
+ *
1416
+ * `min` / `max` bound the whole instant at minute precision: the calendar
1417
+ * greys out days outside the range and the time list hides times outside it
1418
+ * on the boundary days. Validation reports `mkMinDate` / `mkMaxDate`.
1419
+ *
1420
+ * When nested in an `mk-form-field` it adopts the field's id and aria wiring.
1421
+ *
1422
+ * ```html
1423
+ * <mk-datetime-picker [(value)]="startsAt" [step]="15" [min]="now" clearable />
1424
+ * <mk-datetime-picker [(value)]="startsAt" hour12 />
1425
+ * ```
1426
+ */
1427
+ class MkDateTimePicker {
1428
+ i18n = inject(MK_I18N);
1429
+ field = inject(MkFormField, { optional: true });
1430
+ host = inject(ElementRef);
1431
+ injector = inject(Injector);
1432
+ inputRef = viewChild('textInput', /* @ts-ignore */
1433
+ ...(ngDevMode ? [{ debugName: "inputRef" }] : /* istanbul ignore next */ []));
1434
+ /** The panel — lives in the top layer once opened. */
1435
+ panelRef = viewChild('panel', /* @ts-ignore */
1436
+ ...(ngDevMode ? [{ debugName: "panelRef" }] : /* istanbul ignore next */ []));
1437
+ timesRef = viewChild('times', /* @ts-ignore */
1438
+ ...(ngDevMode ? [{ debugName: "timesRef" }] : /* istanbul ignore next */ []));
1439
+ /** Two-way selected date-time (local; seconds and ms are zero). */
1440
+ value = model(null, /* @ts-ignore */
1441
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1442
+ /** Earliest selectable instant (inclusive, minute precision). */
1443
+ min = input(null, /* @ts-ignore */
1444
+ ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
1445
+ /** Latest selectable instant (inclusive, minute precision). */
1446
+ max = input(null, /* @ts-ignore */
1447
+ ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
1448
+ /** Predicate marking individual days as disabled (threaded to the calendar). */
1449
+ disabledDate = input(null, /* @ts-ignore */
1450
+ ...(ngDevMode ? [{ debugName: "disabledDate" }] : /* istanbul ignore next */ []));
1451
+ /** Placeholder shown when empty. */
1452
+ placeholder = input(this.i18n.selectDateTime, /* @ts-ignore */
1453
+ ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
1454
+ /**
1455
+ * Pattern used to render the value in the field. Defaults to
1456
+ * `'MMM d, yyyy HH:mm'`, or `'MMM d, yyyy h:mm a'` when `hour12` is set.
1457
+ */
1458
+ displayFormat = input(null, /* @ts-ignore */
1459
+ ...(ngDevMode ? [{ debugName: "displayFormat" }] : /* istanbul ignore next */ []));
1460
+ /** Interval between generated time options, in minutes. */
1461
+ step = input(30, { ...(ngDevMode ? { debugName: "step" } : /* istanbul ignore next */ {}), transform: numberAttribute });
1462
+ /** Display 12-hour times with AM/PM (the model is a `Date` either way). */
1463
+ hour12 = input(false, { ...(ngDevMode ? { debugName: "hour12" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1464
+ /** Disable the control. */
1465
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1466
+ /** Show a clear button when a value is selected. */
1467
+ clearable = input(false, { ...(ngDevMode ? { debugName: "clearable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1468
+ /** Force invalid styling + `aria-invalid`. */
1469
+ invalid = input(false, { ...(ngDevMode ? { debugName: "invalid" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1470
+ /** First column of the calendar week (0 = Sunday). */
1471
+ firstDayOfWeek = input(0, { ...(ngDevMode ? { debugName: "firstDayOfWeek" } : /* istanbul ignore next */ {}), transform: numberAttribute });
1472
+ /** Control size. Ignored when nested in an `mk-form-field`. */
1473
+ size = input('md', /* @ts-ignore */
1474
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
1475
+ open = signal(false, /* @ts-ignore */
1476
+ ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
1477
+ /** Editable text mirror of the field. */
1478
+ inputText = signal('', /* @ts-ignore */
1479
+ ...(ngDevMode ? [{ debugName: "inputText" }] : /* istanbul ignore next */ []));
1480
+ /** Keyboard-active option in the time list (index into `options`). */
1481
+ activeIndex = signal(-1, /* @ts-ignore */
1482
+ ...(ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []));
1483
+ /** Day picked in the calendar while there is no value yet. */
1484
+ pendingDay = signal(null, /* @ts-ignore */
1485
+ ...(ngDevMode ? [{ debugName: "pendingDay" }] : /* istanbul ignore next */ []));
1486
+ cvaDisabled = signal(false, /* @ts-ignore */
1487
+ ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : /* istanbul ignore next */ []));
1488
+ onChange = () => { };
1489
+ onTouched = () => { };
1490
+ inputId = this.field?.controlId ?? mkUniqueId('mk-datetime-picker');
1491
+ panelId = mkUniqueId('mk-datetime-picker-panel');
1492
+ listId = mkUniqueId('mk-datetime-picker-times');
1493
+ effectiveSize = computed(() => this.field ? this.field.size() : this.size(), /* @ts-ignore */
1494
+ ...(ngDevMode ? [{ debugName: "effectiveSize" }] : /* istanbul ignore next */ []));
1495
+ isDisabled = computed(() => this.disabled() || this.cvaDisabled(), /* @ts-ignore */
1496
+ ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
1497
+ isInvalid = computed(() => this.invalid() || (this.field?.hasError() ?? false), /* @ts-ignore */
1498
+ ...(ngDevMode ? [{ debugName: "isInvalid" }] : /* istanbul ignore next */ []));
1499
+ isRequired = computed(() => this.field?.isRequired() ?? false, /* @ts-ignore */
1500
+ ...(ngDevMode ? [{ debugName: "isRequired" }] : /* istanbul ignore next */ []));
1501
+ describedBy = computed(() => this.field?.describedBy() ?? null, /* @ts-ignore */
1502
+ ...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
1503
+ showClear = computed(() => this.clearable() && !!this.value() && !this.isDisabled(), /* @ts-ignore */
1504
+ ...(ngDevMode ? [{ debugName: "showClear" }] : /* istanbul ignore next */ []));
1505
+ effectiveFormat = computed(() => this.displayFormat() ??
1506
+ (this.hour12() ? 'MMM d, yyyy h:mm a' : 'MMM d, yyyy HH:mm'), /* @ts-ignore */
1507
+ ...(ngDevMode ? [{ debugName: "effectiveFormat" }] : /* istanbul ignore next */ []));
1508
+ /** The day the calendar shows as selected: the value's day, else the pending one. */
1509
+ calendarValue = computed(() => {
1510
+ const v = this.value();
1511
+ return v ? startOfDay(v) : this.pendingDay();
1512
+ }, /* @ts-ignore */
1513
+ ...(ngDevMode ? [{ debugName: "calendarValue" }] : /* istanbul ignore next */ []));
1514
+ /** Day-granular bounds for the calendar (inclusive). */
1515
+ calendarMin = computed(() => {
1516
+ const m = this.min();
1517
+ return m ? startOfDay(m) : null;
1518
+ }, /* @ts-ignore */
1519
+ ...(ngDevMode ? [{ debugName: "calendarMin" }] : /* istanbul ignore next */ []));
1520
+ calendarMax = computed(() => {
1521
+ const m = this.max();
1522
+ return m ? startOfDay(m) : null;
1523
+ }, /* @ts-ignore */
1524
+ ...(ngDevMode ? [{ debugName: "calendarMax" }] : /* istanbul ignore next */ []));
1525
+ /**
1526
+ * Generated time options. On the `min` / `max` boundary day the list only
1527
+ * offers times inside the bound; on other days every step is listed.
1528
+ */
1529
+ options = computed(() => {
1530
+ const step = Math.max(1, Math.floor(this.step()));
1531
+ const day = this.calendarValue();
1532
+ const min = this.min();
1533
+ const max = this.max();
1534
+ const lo = day && min && isSameDay(day, min) ? minutesOfDay$1(min) : 0;
1535
+ const hi = day && max && isSameDay(day, max) ? minutesOfDay$1(max) : 24 * 60 - 1;
1536
+ const out = [];
1537
+ for (let mins = 0; mins < 24 * 60; mins += step) {
1538
+ if (mins < lo || mins > hi)
1539
+ continue;
1540
+ out.push({
1541
+ minutes: mins,
1542
+ label: this.displayTime(mins),
1543
+ id: `${this.listId}-opt-${mins}`,
1544
+ });
1545
+ }
1546
+ return out;
1547
+ }, /* @ts-ignore */
1548
+ ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
1549
+ selectedIndex = computed(() => {
1550
+ const v = this.value();
1551
+ if (!v)
1552
+ return -1;
1553
+ const mins = minutesOfDay$1(v);
1554
+ return this.options().findIndex((o) => o.minutes === mins);
1555
+ }, /* @ts-ignore */
1556
+ ...(ngDevMode ? [{ debugName: "selectedIndex" }] : /* istanbul ignore next */ []));
1557
+ constructor() {
1558
+ // Keep the text field in sync with the model (typing does not touch value).
1559
+ effect(() => {
1560
+ const v = this.value();
1561
+ this.inputText.set(v ? formatDate(v, this.effectiveFormat(), this.i18n.dateNames) : '');
1562
+ });
1563
+ }
1564
+ // --- Display / parsing ------------------------------------------------------
1565
+ displayTime(mins) {
1566
+ const h = Math.floor(mins / 60);
1567
+ const m = mins % 60;
1568
+ if (this.hour12()) {
1569
+ const ap = h < 12 ? 'AM' : 'PM';
1570
+ return `${h % 12 || 12}:${pad2(m)} ${ap}`;
1571
+ }
1572
+ return `${pad2(h)}:${pad2(m)}`;
1573
+ }
1574
+ /**
1575
+ * Accepts `YYYY-MM-DD[ T]HH:mm[ am|pm]`, a bare ISO date (→ midnight), any
1576
+ * `Date.parse`-able date followed by a time, or a full `Date.parse`-able
1577
+ * string. Seconds are dropped.
1578
+ */
1579
+ parse(text) {
1580
+ const iso = /^(\d{4}-\d{2}-\d{2})(?:[T\s]+(.+))?$/.exec(text);
1581
+ if (iso) {
1582
+ const day = parseISODate(iso[1]);
1583
+ if (!day)
1584
+ return null;
1585
+ if (!iso[2])
1586
+ return day;
1587
+ const mins = parseTime(iso[2]);
1588
+ return mins === null ? null : combine(day, mins);
1589
+ }
1590
+ const split = /^(.*\S)[\s,]+(\d{1,2}(?::\d{2})?\s*(?:am|pm)?)$/i.exec(text);
1591
+ if (split) {
1592
+ const mins = parseTime(split[2]);
1593
+ const ms = Date.parse(split[1]);
1594
+ if (mins !== null && !Number.isNaN(ms)) {
1595
+ return combine(startOfDay(new Date(ms)), mins);
1596
+ }
1597
+ }
1598
+ const ms = Date.parse(text);
1599
+ if (Number.isNaN(ms))
1600
+ return null;
1601
+ const d = new Date(ms);
1602
+ d.setSeconds(0, 0);
1603
+ return d;
1604
+ }
1605
+ clamp(d) {
1606
+ const min = this.min();
1607
+ const max = this.max();
1608
+ if (min && toMinute(d) < toMinute(min))
1609
+ return combine(min, minutesOfDay$1(min));
1610
+ if (max && toMinute(d) > toMinute(max))
1611
+ return combine(max, minutesOfDay$1(max));
1612
+ return d;
1613
+ }
1614
+ // --- Panel ---------------------------------------------------------------
1615
+ toggle() {
1616
+ if (this.isDisabled())
1617
+ return;
1618
+ this.open() ? this.close() : this.openPanel();
1619
+ }
1620
+ openPanel() {
1621
+ if (this.isDisabled() || this.open())
1622
+ return;
1623
+ this.open.set(true);
1624
+ const sel = this.selectedIndex();
1625
+ this.activeIndex.set(sel >= 0 ? sel : this.nearestIndex(new Date()));
1626
+ afterNextRender({
1627
+ write: () => {
1628
+ const el = this.panelRef()?.nativeElement.querySelector('.mk-calendar__day[tabindex="0"]');
1629
+ el?.focus();
1630
+ this.scrollActiveIntoView();
1631
+ },
1632
+ }, { injector: this.injector });
1633
+ }
1634
+ close() {
1635
+ if (this.open()) {
1636
+ this.open.set(false);
1637
+ this.activeIndex.set(-1);
1638
+ }
1639
+ }
1640
+ /** Index of the first option at or after `d`'s time of day (for the initial highlight). */
1641
+ nearestIndex(d) {
1642
+ const mins = minutesOfDay$1(d);
1643
+ const i = this.options().findIndex((o) => o.minutes >= mins);
1644
+ return i >= 0 ? i : Math.max(0, this.options().length - 1);
1645
+ }
1646
+ onCalendarPick(day) {
1647
+ if (!day)
1648
+ return;
1649
+ const current = this.value();
1650
+ if (current) {
1651
+ this.setValue(this.clamp(combine(day, minutesOfDay$1(current))));
1652
+ }
1653
+ else {
1654
+ this.pendingDay.set(startOfDay(day));
1655
+ }
1656
+ // Hand focus to the time list so the second half of the pick is one
1657
+ // keystroke away; the highlighted option follows the (new) value.
1658
+ const sel = this.selectedIndex();
1659
+ this.activeIndex.set(sel >= 0 ? sel : this.nearestIndex(current ?? new Date()));
1660
+ afterNextRender({
1661
+ write: () => {
1662
+ this.timesRef()?.nativeElement.focus();
1663
+ this.scrollActiveIntoView();
1664
+ },
1665
+ }, { injector: this.injector });
1666
+ }
1667
+ selectTime(index) {
1668
+ const opt = this.options()[index];
1669
+ if (!opt)
1670
+ return;
1671
+ const day = this.calendarValue() ?? startOfDay(new Date());
1672
+ this.setValue(this.clamp(combine(day, opt.minutes)));
1673
+ this.close();
1674
+ this.inputRef()?.nativeElement.focus();
1675
+ }
1676
+ onListKeydown(event) {
1677
+ const e = event;
1678
+ switch (e.key) {
1679
+ case 'ArrowDown':
1680
+ e.preventDefault();
1681
+ this.moveActive(1);
1682
+ break;
1683
+ case 'ArrowUp':
1684
+ e.preventDefault();
1685
+ this.moveActive(-1);
1686
+ break;
1687
+ case 'Home':
1688
+ e.preventDefault();
1689
+ this.activeIndex.set(0);
1690
+ this.scrollActiveIntoView();
1691
+ break;
1692
+ case 'End':
1693
+ e.preventDefault();
1694
+ this.activeIndex.set(this.options().length - 1);
1695
+ this.scrollActiveIntoView();
1696
+ break;
1697
+ case 'Enter':
1698
+ case ' ':
1699
+ e.preventDefault();
1700
+ if (this.activeIndex() >= 0)
1701
+ this.selectTime(this.activeIndex());
1702
+ break;
1703
+ }
1704
+ }
1705
+ moveActive(delta) {
1706
+ const len = this.options().length;
1707
+ if (!len)
1708
+ return;
1709
+ const next = (this.activeIndex() + delta + len) % len;
1710
+ this.activeIndex.set(next);
1711
+ this.scrollActiveIntoView();
1712
+ }
1713
+ scrollActiveIntoView() {
1714
+ afterNextRender({
1715
+ write: () => {
1716
+ const el = this.timesRef()?.nativeElement.querySelector('.mk-datetime-picker__option--active');
1717
+ el?.scrollIntoView({ block: 'nearest' });
1718
+ },
1719
+ }, { injector: this.injector });
1720
+ }
1721
+ // --- Field ----------------------------------------------------------------
1722
+ onInput(event) {
1723
+ this.inputText.set(event.target.value);
1724
+ }
1725
+ onInputKeydown(event) {
1726
+ const e = event;
1727
+ if (this.isDisabled())
1728
+ return;
1729
+ switch (e.key) {
1730
+ case 'Enter':
1731
+ e.preventDefault();
1732
+ this.commitInput();
1733
+ break;
1734
+ case 'ArrowDown':
1735
+ e.preventDefault();
1736
+ this.openPanel();
1737
+ break;
1738
+ case 'Escape':
1739
+ if (this.open()) {
1740
+ e.preventDefault();
1741
+ this.close();
1742
+ }
1743
+ break;
1744
+ }
1745
+ }
1746
+ clear() {
1747
+ this.pendingDay.set(null);
1748
+ this.setValue(null);
1749
+ this.inputRef()?.nativeElement.focus();
1750
+ }
1751
+ commitInput() {
1752
+ const text = this.inputText().trim();
1753
+ if (!text) {
1754
+ this.setValue(null);
1755
+ return;
1756
+ }
1757
+ const parsed = this.parse(text);
1758
+ if (parsed) {
1759
+ this.setValue(this.clamp(parsed));
1760
+ }
1761
+ else {
1762
+ // Invalid entry — revert to the current model's display. The signal may
1763
+ // already hold that string (the model did not change), so the `[value]`
1764
+ // binding would not re-apply it: write the DOM value directly as well.
1765
+ const v = this.value();
1766
+ const text = v ? formatDate(v, this.effectiveFormat(), this.i18n.dateNames) : '';
1767
+ this.inputText.set(text);
1768
+ const el = this.inputRef()?.nativeElement;
1769
+ if (el)
1770
+ el.value = text;
1771
+ }
1772
+ }
1773
+ setValue(date) {
1774
+ if (date)
1775
+ this.pendingDay.set(null);
1776
+ this.value.set(date);
1777
+ this.onChange(date);
1778
+ }
1779
+ onFocusOut(event) {
1780
+ const related = event.relatedTarget;
1781
+ // Ignore focus moving into the field or the (top-layer) panel.
1782
+ if (related && this.host.nativeElement.contains(related))
1783
+ return;
1784
+ if (related && this.panelRef()?.nativeElement.contains(related))
1785
+ return;
1786
+ this.commitInput();
1787
+ this.close();
1788
+ this.onTouched();
1789
+ }
1790
+ /**
1791
+ * Escape pressed inside the (teleported) panel — close and return focus to
1792
+ * the input. `preventDefault` + `stopPropagation` keep any outer Escape
1793
+ * handling (e.g. a containing dialog) from also firing.
1794
+ */
1795
+ onPanelEscape(event) {
1796
+ event.preventDefault();
1797
+ event.stopPropagation();
1798
+ this.close();
1799
+ this.inputRef()?.nativeElement.focus();
1800
+ }
1801
+ /**
1802
+ * Focus left the teleported panel. The host `(focusout)` never sees this —
1803
+ * the panel lives under `document.body` — so Tab-out is handled here: close
1804
+ * unless focus moved back into the field or stayed inside the panel.
1805
+ */
1806
+ onPanelFocusout(event) {
1807
+ const related = event.relatedTarget;
1808
+ if (!related)
1809
+ return;
1810
+ if (this.host.nativeElement.contains(related))
1811
+ return;
1812
+ if (this.panelRef()?.nativeElement.contains(related))
1813
+ return;
1814
+ this.commitInput();
1815
+ this.close();
1816
+ this.onTouched();
1817
+ }
1818
+ // --- ControlValueAccessor -------------------------------------------------
1819
+ writeValue(value) {
1820
+ this.pendingDay.set(null);
1821
+ this.value.set(value ?? null);
1822
+ }
1823
+ registerOnChange(fn) {
1824
+ this.onChange = fn;
1825
+ }
1826
+ registerOnTouched(fn) {
1827
+ this.onTouched = fn;
1828
+ }
1829
+ setDisabledState(isDisabled) {
1830
+ this.cvaDisabled.set(isDisabled);
1831
+ }
1832
+ // --- Validator ------------------------------------------------------------
1833
+ validatorChange = mkValidatorChange(() => {
1834
+ this.min();
1835
+ this.max();
1836
+ });
1837
+ /**
1838
+ * Reports `mkMinDate` / `mkMaxDate` against the `[min]` and `[max]` inputs,
1839
+ * comparing whole instants at minute precision.
1840
+ */
1841
+ validate(control) {
1842
+ const v = control.value;
1843
+ if (!(v instanceof Date) || Number.isNaN(v.getTime()))
1844
+ return null;
1845
+ const t = toMinute(v);
1846
+ const min = this.min();
1847
+ if (min && t < toMinute(min))
1848
+ return { mkMinDate: { min, actual: v } };
1849
+ const max = this.max();
1850
+ if (max && t > toMinute(max))
1851
+ return { mkMaxDate: { max, actual: v } };
1852
+ return null;
1853
+ }
1854
+ registerOnValidatorChange(fn) {
1855
+ this.validatorChange.register(fn);
1856
+ }
1857
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkDateTimePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
1858
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MkDateTimePicker, isStandalone: true, selector: "mk-datetime-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, disabledDate: { classPropertyName: "disabledDate", publicName: "disabledDate", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, displayFormat: { classPropertyName: "displayFormat", publicName: "displayFormat", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, hour12: { classPropertyName: "hour12", publicName: "hour12", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "focusout": "onFocusOut($event)" }, properties: { "class.mk-datetime-picker--sm": "effectiveSize() === 'sm'", "class.mk-datetime-picker--md": "effectiveSize() === 'md'", "class.mk-datetime-picker--lg": "effectiveSize() === 'lg'", "class.mk-datetime-picker--open": "open()", "class.mk-datetime-picker--invalid": "isInvalid()", "class.mk-datetime-picker--disabled": "isDisabled()" }, classAttribute: "mk-datetime-picker" }, providers: [
1859
+ {
1860
+ provide: NG_VALUE_ACCESSOR,
1861
+ useExisting: forwardRef(() => MkDateTimePicker),
1862
+ multi: true,
1863
+ },
1864
+ {
1865
+ provide: NG_VALIDATORS,
1866
+ useExisting: forwardRef(() => MkDateTimePicker),
1867
+ multi: true,
1868
+ },
1869
+ ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["textInput"], descendants: true, isSignal: true }, { propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "timesRef", first: true, predicate: ["times"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-datetime-picker__field\">\n <input\n #textInput\n type=\"text\"\n class=\"mk-datetime-picker__input\"\n [id]=\"inputId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n />\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-datetime-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-datetime-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"mk-datetime-picker__toggle\"\n [attr.aria-label]=\"i18n.openDateTimePicker\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <svg\n class=\"mk-datetime-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\n <path d=\"M21 12V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h6\" />\n <circle cx=\"17.5\" cy=\"17.5\" r=\"4.5\" />\n <path d=\"M17.5 15.5v2l1.5 1\" />\n </svg>\n </button>\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-datetime-picker__panel\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n [id]=\"panelId\"\n role=\"dialog\"\n [attr.aria-label]=\"i18n.chooseDateTime\"\n (keydown.escape)=\"onPanelEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <mk-calendar\n [value]=\"calendarValue()\"\n (valueChange)=\"onCalendarPick($event)\"\n [min]=\"calendarMin()\"\n [max]=\"calendarMax()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [size]=\"effectiveSize()\"\n [disabledDate]=\"disabledDate()\"\n />\n\n <ul\n #times\n class=\"mk-datetime-picker__times\"\n [id]=\"listId\"\n role=\"listbox\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.chooseTime\"\n [attr.aria-activedescendant]=\"\n activeIndex() >= 0 && options()[activeIndex()] ? options()[activeIndex()].id : null\n \"\n (keydown)=\"onListKeydown($event)\"\n >\n @for (opt of options(); track opt.minutes; let i = $index) {\n <li\n class=\"mk-datetime-picker__option\"\n [id]=\"opt.id\"\n role=\"option\"\n [attr.aria-selected]=\"i === selectedIndex()\"\n [class.mk-datetime-picker__option--active]=\"i === activeIndex()\"\n [class.mk-datetime-picker__option--selected]=\"i === selectedIndex()\"\n (mousedown)=\"$event.preventDefault()\"\n (mousemove)=\"activeIndex.set(i)\"\n (click)=\"selectTime(i)\"\n >\n {{ opt.label }}\n </li>\n } @empty {\n <li class=\"mk-datetime-picker__empty\" role=\"presentation\">\n {{ i18n.noOptions }}\n </li>\n }\n </ul>\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-datetime-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-datetime-picker--sm) .mk-datetime-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-datetime-picker--lg) .mk-datetime-picker__field{height:var(--mk-control-height-lg)}.mk-datetime-picker__field:hover{border-color:var(--mk-border-strong)}.mk-datetime-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-datetime-picker--invalid) .mk-datetime-picker__field{border-color:var(--mk-danger)}:host(.mk-datetime-picker--invalid) .mk-datetime-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-datetime-picker--disabled) .mk-datetime-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-datetime-picker__input{flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);background:transparent;border:0;outline:none}:host(.mk-datetime-picker--sm) .mk-datetime-picker__input{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-datetime-picker--lg) .mk-datetime-picker__input{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-datetime-picker__input::placeholder{color:var(--mk-text-subtle);opacity:1}.mk-datetime-picker__input:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-datetime-picker__toggle,.mk-datetime-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-datetime-picker__toggle:hover:not(:disabled),.mk-datetime-picker__clear:hover{color:var(--mk-text)}.mk-datetime-picker__toggle:focus-visible,.mk-datetime-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-datetime-picker__toggle:disabled{cursor:not-allowed}.mk-datetime-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-datetime-picker__clear-icon:before,.mk-datetime-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-datetime-picker__clear-icon:before{transform:rotate(45deg)}.mk-datetime-picker__clear-icon:after{transform:rotate(-45deg)}.mk-datetime-picker__panel{display:flex;align-items:stretch;background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-lg);box-shadow:var(--mk-shadow-lg);overflow:hidden}.mk-datetime-picker__times{flex:none;width:8rem;max-height:21rem;margin:0;padding:var(--mk-space-1);overflow-y:auto;list-style:none;border-inline-start:var(--mk-border-width) solid var(--mk-border-subtle);outline:none}.mk-datetime-picker__times:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1)}.mk-datetime-picker__option{padding:var(--mk-space-2) var(--mk-space-3);font-size:var(--mk-font-size-md);color:var(--mk-text);border-radius:var(--mk-radius-sm);cursor:pointer;-webkit-user-select:none;user-select:none;font-variant-numeric:tabular-nums}.mk-datetime-picker__option--active{background-color:var(--mk-selected-bg)}.mk-datetime-picker__option--selected{color:var(--mk-selected-text);font-weight:var(--mk-font-weight-medium)}.mk-datetime-picker__empty{padding:var(--mk-space-2) var(--mk-space-3);color:var(--mk-text-subtle);font-size:var(--mk-font-size-sm)}@media(max-width:480px){.mk-datetime-picker__panel{flex-direction:column}.mk-datetime-picker__times{width:auto;max-height:10rem;border-inline-start:0;border-top:var(--mk-border-width) solid var(--mk-border-subtle)}}@media(prefers-reduced-motion:reduce){.mk-datetime-picker__field,.mk-datetime-picker__toggle,.mk-datetime-picker__clear{transition:none}}@media(pointer:coarse){.mk-datetime-picker__input{font-size:max(var(--mk-font-size-md),16px)}:host(.mk-datetime-picker--sm) .mk-datetime-picker__input{font-size:max(var(--mk-font-size-sm),16px)}}@media(pointer:coarse){.mk-datetime-picker__option{position:relative}.mk-datetime-picker__option:before{content:\"\";position:absolute;inset:min(0px,(100% - 44px) / 2)}}\n"], dependencies: [{ kind: "component", type: MkCalendar, selector: "mk-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "disabled", "invalid", "disabledDate", "size", "fullWidth", "rangeMode", "rangeStart", "rangeEnd"], outputs: ["valueChange", "dateSelected", "dateHovered"] }, { kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp", "keepOpenWhen"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1870
+ }
1871
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkDateTimePicker, decorators: [{
1872
+ type: Component,
1873
+ args: [{ selector: 'mk-datetime-picker', changeDetection: ChangeDetectionStrategy.OnPush, imports: [MkCalendar, MkAnchoredPanel], host: {
1874
+ class: 'mk-datetime-picker',
1875
+ '[class.mk-datetime-picker--sm]': "effectiveSize() === 'sm'",
1876
+ '[class.mk-datetime-picker--md]': "effectiveSize() === 'md'",
1877
+ '[class.mk-datetime-picker--lg]': "effectiveSize() === 'lg'",
1878
+ '[class.mk-datetime-picker--open]': 'open()',
1879
+ '[class.mk-datetime-picker--invalid]': 'isInvalid()',
1880
+ '[class.mk-datetime-picker--disabled]': 'isDisabled()',
1881
+ '(focusout)': 'onFocusOut($event)',
1882
+ }, providers: [
1883
+ {
1884
+ provide: NG_VALUE_ACCESSOR,
1885
+ useExisting: forwardRef(() => MkDateTimePicker),
1886
+ multi: true,
1887
+ },
1888
+ {
1889
+ provide: NG_VALIDATORS,
1890
+ useExisting: forwardRef(() => MkDateTimePicker),
1891
+ multi: true,
1892
+ },
1893
+ ], template: "<div #field class=\"mk-datetime-picker__field\">\n <input\n #textInput\n type=\"text\"\n class=\"mk-datetime-picker__input\"\n [id]=\"inputId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n />\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-datetime-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-datetime-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"mk-datetime-picker__toggle\"\n [attr.aria-label]=\"i18n.openDateTimePicker\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <svg\n class=\"mk-datetime-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\n <path d=\"M21 12V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h6\" />\n <circle cx=\"17.5\" cy=\"17.5\" r=\"4.5\" />\n <path d=\"M17.5 15.5v2l1.5 1\" />\n </svg>\n </button>\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-datetime-picker__panel\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n [id]=\"panelId\"\n role=\"dialog\"\n [attr.aria-label]=\"i18n.chooseDateTime\"\n (keydown.escape)=\"onPanelEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <mk-calendar\n [value]=\"calendarValue()\"\n (valueChange)=\"onCalendarPick($event)\"\n [min]=\"calendarMin()\"\n [max]=\"calendarMax()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [size]=\"effectiveSize()\"\n [disabledDate]=\"disabledDate()\"\n />\n\n <ul\n #times\n class=\"mk-datetime-picker__times\"\n [id]=\"listId\"\n role=\"listbox\"\n tabindex=\"0\"\n [attr.aria-label]=\"i18n.chooseTime\"\n [attr.aria-activedescendant]=\"\n activeIndex() >= 0 && options()[activeIndex()] ? options()[activeIndex()].id : null\n \"\n (keydown)=\"onListKeydown($event)\"\n >\n @for (opt of options(); track opt.minutes; let i = $index) {\n <li\n class=\"mk-datetime-picker__option\"\n [id]=\"opt.id\"\n role=\"option\"\n [attr.aria-selected]=\"i === selectedIndex()\"\n [class.mk-datetime-picker__option--active]=\"i === activeIndex()\"\n [class.mk-datetime-picker__option--selected]=\"i === selectedIndex()\"\n (mousedown)=\"$event.preventDefault()\"\n (mousemove)=\"activeIndex.set(i)\"\n (click)=\"selectTime(i)\"\n >\n {{ opt.label }}\n </li>\n } @empty {\n <li class=\"mk-datetime-picker__empty\" role=\"presentation\">\n {{ i18n.noOptions }}\n </li>\n }\n </ul>\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-datetime-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-datetime-picker--sm) .mk-datetime-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-datetime-picker--lg) .mk-datetime-picker__field{height:var(--mk-control-height-lg)}.mk-datetime-picker__field:hover{border-color:var(--mk-border-strong)}.mk-datetime-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-datetime-picker--invalid) .mk-datetime-picker__field{border-color:var(--mk-danger)}:host(.mk-datetime-picker--invalid) .mk-datetime-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-datetime-picker--disabled) .mk-datetime-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-datetime-picker__input{flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);background:transparent;border:0;outline:none}:host(.mk-datetime-picker--sm) .mk-datetime-picker__input{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-datetime-picker--lg) .mk-datetime-picker__input{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-datetime-picker__input::placeholder{color:var(--mk-text-subtle);opacity:1}.mk-datetime-picker__input:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-datetime-picker__toggle,.mk-datetime-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-datetime-picker__toggle:hover:not(:disabled),.mk-datetime-picker__clear:hover{color:var(--mk-text)}.mk-datetime-picker__toggle:focus-visible,.mk-datetime-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-datetime-picker__toggle:disabled{cursor:not-allowed}.mk-datetime-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-datetime-picker__clear-icon:before,.mk-datetime-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-datetime-picker__clear-icon:before{transform:rotate(45deg)}.mk-datetime-picker__clear-icon:after{transform:rotate(-45deg)}.mk-datetime-picker__panel{display:flex;align-items:stretch;background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-lg);box-shadow:var(--mk-shadow-lg);overflow:hidden}.mk-datetime-picker__times{flex:none;width:8rem;max-height:21rem;margin:0;padding:var(--mk-space-1);overflow-y:auto;list-style:none;border-inline-start:var(--mk-border-width) solid var(--mk-border-subtle);outline:none}.mk-datetime-picker__times:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1)}.mk-datetime-picker__option{padding:var(--mk-space-2) var(--mk-space-3);font-size:var(--mk-font-size-md);color:var(--mk-text);border-radius:var(--mk-radius-sm);cursor:pointer;-webkit-user-select:none;user-select:none;font-variant-numeric:tabular-nums}.mk-datetime-picker__option--active{background-color:var(--mk-selected-bg)}.mk-datetime-picker__option--selected{color:var(--mk-selected-text);font-weight:var(--mk-font-weight-medium)}.mk-datetime-picker__empty{padding:var(--mk-space-2) var(--mk-space-3);color:var(--mk-text-subtle);font-size:var(--mk-font-size-sm)}@media(max-width:480px){.mk-datetime-picker__panel{flex-direction:column}.mk-datetime-picker__times{width:auto;max-height:10rem;border-inline-start:0;border-top:var(--mk-border-width) solid var(--mk-border-subtle)}}@media(prefers-reduced-motion:reduce){.mk-datetime-picker__field,.mk-datetime-picker__toggle,.mk-datetime-picker__clear{transition:none}}@media(pointer:coarse){.mk-datetime-picker__input{font-size:max(var(--mk-font-size-md),16px)}:host(.mk-datetime-picker--sm) .mk-datetime-picker__input{font-size:max(var(--mk-font-size-sm),16px)}}@media(pointer:coarse){.mk-datetime-picker__option{position:relative}.mk-datetime-picker__option:before{content:\"\";position:absolute;inset:min(0px,(100% - 44px) / 2)}}\n"] }]
1894
+ }], ctorParameters: () => [], propDecorators: { inputRef: [{ type: i0.ViewChild, args: ['textInput', { isSignal: true }] }], panelRef: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], timesRef: [{ type: i0.ViewChild, args: ['times', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], disabledDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDate", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], displayFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayFormat", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], hour12: [{ type: i0.Input, args: [{ isSignal: true, alias: "hour12", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
1895
+
1351
1896
  /**
1352
1897
  * DateRangePicker — select a start + end date from a single calendar popover.
1353
1898
  * The first click sets the start, the second sets the end (endpoints are
@@ -1598,7 +2143,7 @@ class MkDateRangePicker {
1598
2143
  useExisting: forwardRef(() => MkDateRangePicker),
1599
2144
  multi: true,
1600
2145
  },
1601
- ], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-date-range-picker__field\">\n <button\n #trigger\n type=\"button\"\n class=\"mk-date-range-picker__trigger\"\n [id]=\"triggerId\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n @if (displayLabel()) {\n <span class=\"mk-date-range-picker__value\">{{ displayLabel() }}</span>\n } @else {\n <span class=\"mk-date-range-picker__value mk-date-range-picker__value--placeholder\">{{\n placeholder()\n }}</span>\n }\n </button>\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-date-range-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-date-range-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"mk-date-range-picker__toggle\"\n [attr.aria-label]=\"i18n.openCalendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <svg\n class=\"mk-date-range-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\" />\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\n </svg>\n </button>\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-date-range-picker__panel\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n [id]=\"panelId\"\n role=\"dialog\"\n [attr.aria-label]=\"i18n.chooseDateRange\"\n (keydown.escape)=\"onPanelEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <mk-calendar\n [rangeMode]=\"true\"\n [rangeStart]=\"selStart()\"\n [rangeEnd]=\"selEnd()\"\n (dateSelected)=\"onPick($event)\"\n [min]=\"min()\"\n [max]=\"max()\"\n [disabledDate]=\"disabledDate()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [size]=\"effectiveSize()\"\n />\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-date-range-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-date-range-picker--sm) .mk-date-range-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-date-range-picker--lg) .mk-date-range-picker__field{height:var(--mk-control-height-lg)}.mk-date-range-picker__field:hover{border-color:var(--mk-border-strong)}.mk-date-range-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-date-range-picker--invalid) .mk-date-range-picker__field{border-color:var(--mk-danger)}:host(.mk-date-range-picker--invalid) .mk-date-range-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-date-range-picker--disabled) .mk-date-range-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-date-range-picker__trigger{flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);text-align:start;background:transparent;border:0;outline:none;cursor:pointer}:host(.mk-date-range-picker--sm) .mk-date-range-picker__trigger{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-date-range-picker--lg) .mk-date-range-picker__trigger{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-date-range-picker__trigger:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-date-range-picker__value{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mk-date-range-picker__value--placeholder{color:var(--mk-text-subtle)}.mk-date-range-picker__toggle,.mk-date-range-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-date-range-picker__toggle:hover:not(:disabled),.mk-date-range-picker__clear:hover{color:var(--mk-text)}.mk-date-range-picker__toggle:focus-visible,.mk-date-range-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-date-range-picker__toggle:disabled{cursor:not-allowed}.mk-date-range-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-date-range-picker__clear-icon:before,.mk-date-range-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-date-range-picker__clear-icon:before{transform:rotate(45deg)}.mk-date-range-picker__clear-icon:after{transform:rotate(-45deg)}.mk-date-range-picker__panel{box-shadow:var(--mk-shadow-lg);border-radius:var(--mk-radius-lg)}@media(prefers-reduced-motion:reduce){.mk-date-range-picker__field,.mk-date-range-picker__toggle,.mk-date-range-picker__clear{transition:none}}\n"], dependencies: [{ kind: "component", type: MkCalendar, selector: "mk-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "disabled", "invalid", "disabledDate", "size", "fullWidth", "rangeMode", "rangeStart", "rangeEnd"], outputs: ["valueChange", "dateSelected", "dateHovered"] }, { kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2146
+ ], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-date-range-picker__field\">\n <button\n #trigger\n type=\"button\"\n class=\"mk-date-range-picker__trigger\"\n [id]=\"triggerId\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n @if (displayLabel()) {\n <span class=\"mk-date-range-picker__value\">{{ displayLabel() }}</span>\n } @else {\n <span class=\"mk-date-range-picker__value mk-date-range-picker__value--placeholder\">{{\n placeholder()\n }}</span>\n }\n </button>\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-date-range-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-date-range-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"mk-date-range-picker__toggle\"\n [attr.aria-label]=\"i18n.openCalendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n <svg\n class=\"mk-date-range-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\" />\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\n </svg>\n </button>\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-date-range-picker__panel\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n [id]=\"panelId\"\n role=\"dialog\"\n [attr.aria-label]=\"i18n.chooseDateRange\"\n (keydown.escape)=\"onPanelEscape($event)\"\n (focusout)=\"onPanelFocusout($event)\"\n >\n <mk-calendar\n [rangeMode]=\"true\"\n [rangeStart]=\"selStart()\"\n [rangeEnd]=\"selEnd()\"\n (dateSelected)=\"onPick($event)\"\n [min]=\"min()\"\n [max]=\"max()\"\n [disabledDate]=\"disabledDate()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [size]=\"effectiveSize()\"\n />\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-date-range-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-date-range-picker--sm) .mk-date-range-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-date-range-picker--lg) .mk-date-range-picker__field{height:var(--mk-control-height-lg)}.mk-date-range-picker__field:hover{border-color:var(--mk-border-strong)}.mk-date-range-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-date-range-picker--invalid) .mk-date-range-picker__field{border-color:var(--mk-danger)}:host(.mk-date-range-picker--invalid) .mk-date-range-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-date-range-picker--disabled) .mk-date-range-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-date-range-picker__trigger{flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);text-align:start;background:transparent;border:0;outline:none;cursor:pointer}:host(.mk-date-range-picker--sm) .mk-date-range-picker__trigger{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-date-range-picker--lg) .mk-date-range-picker__trigger{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-date-range-picker__trigger:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-date-range-picker__value{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mk-date-range-picker__value--placeholder{color:var(--mk-text-subtle)}.mk-date-range-picker__toggle,.mk-date-range-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-date-range-picker__toggle:hover:not(:disabled),.mk-date-range-picker__clear:hover{color:var(--mk-text)}.mk-date-range-picker__toggle:focus-visible,.mk-date-range-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-date-range-picker__toggle:disabled{cursor:not-allowed}.mk-date-range-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-date-range-picker__clear-icon:before,.mk-date-range-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-date-range-picker__clear-icon:before{transform:rotate(45deg)}.mk-date-range-picker__clear-icon:after{transform:rotate(-45deg)}.mk-date-range-picker__panel{box-shadow:var(--mk-shadow-lg);border-radius:var(--mk-radius-lg)}@media(prefers-reduced-motion:reduce){.mk-date-range-picker__field,.mk-date-range-picker__toggle,.mk-date-range-picker__clear{transition:none}}\n"], dependencies: [{ kind: "component", type: MkCalendar, selector: "mk-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "disabled", "invalid", "disabledDate", "size", "fullWidth", "rangeMode", "rangeStart", "rangeEnd"], outputs: ["valueChange", "dateSelected", "dateHovered"] }, { kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp", "keepOpenWhen"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1602
2147
  }
1603
2148
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkDateRangePicker, decorators: [{
1604
2149
  type: Component,
@@ -1910,7 +2455,7 @@ class MkMonthPicker {
1910
2455
  useExisting: forwardRef(() => MkMonthPicker),
1911
2456
  multi: true,
1912
2457
  },
1913
- ], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "cellRefs", predicate: ["cell"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-month-picker__field\">\n <button\n #trigger\n type=\"button\"\n class=\"mk-month-picker__trigger\"\n [id]=\"triggerId\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n @if (displayLabel()) {\n <span class=\"mk-month-picker__value\">{{ displayLabel() }}</span>\n } @else {\n <span class=\"mk-month-picker__value mk-month-picker__value--placeholder\">{{\n resolvedPlaceholder()\n }}</span>\n }\n <span class=\"mk-month-picker__icon\" aria-hidden=\"true\"></span>\n </button>\n\n @if (clearable() && value() && !isDisabled()) {\n <button\n type=\"button\"\n class=\"mk-month-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear($event)\"\n >\n <span class=\"mk-month-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-month-picker__panel\"\n role=\"dialog\"\n [id]=\"panelId\"\n [attr.aria-label]=\"mode() === 'year' ? i18n.chooseYear : i18n.chooseMonth\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n >\n <div class=\"mk-month-picker__header\">\n <button\n type=\"button\"\n class=\"mk-month-picker__nav\"\n [attr.aria-label]=\"mode() === 'year' ? i18n.previousYears : i18n.previousYear\"\n (click)=\"shiftView(-1)\"\n >\n \u2039\n </button>\n <span class=\"mk-month-picker__header-label\" aria-live=\"polite\">{{ headerLabel() }}</span>\n <button\n type=\"button\"\n class=\"mk-month-picker__nav\"\n [attr.aria-label]=\"mode() === 'year' ? i18n.nextYears : i18n.nextYear\"\n (click)=\"shiftView(1)\"\n >\n \u203A\n </button>\n </div>\n\n <div class=\"mk-month-picker__grid\" role=\"grid\" (keydown)=\"onGridKeydown($event)\">\n @for (cell of cells(); track cell.label; let i = $index) {\n <button\n #cell\n type=\"button\"\n class=\"mk-month-picker__cell\"\n [class.mk-month-picker__cell--selected]=\"cell.selected\"\n [attr.tabindex]=\"i === activeIndex() ? 0 : -1\"\n [attr.aria-selected]=\"cell.selected\"\n [disabled]=\"cell.disabled\"\n (click)=\"selectCell(cell)\"\n >\n {{ cell.label }}\n </button>\n }\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-month-picker__field{display:flex;align-items:center;position:relative}.mk-month-picker__trigger{flex:1 1 auto;display:flex;align-items:center;gap:var(--mk-space-2);width:100%;height:var(--mk-control-height-md);padding:0 var(--mk-space-3);text-align:start;font:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);cursor:pointer}:host(.mk-month-picker--sm) .mk-month-picker__trigger{height:var(--mk-control-height-sm);padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm);border-radius:var(--mk-radius-sm)}:host(.mk-month-picker--lg) .mk-month-picker__trigger{height:var(--mk-control-height-lg);padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-month-picker__trigger:hover:not(:disabled){border-color:var(--mk-border-strong)}.mk-month-picker__trigger:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-month-picker--invalid) .mk-month-picker__trigger{border-color:var(--mk-danger)}:host(.mk-month-picker--disabled) .mk-month-picker__trigger{background-color:var(--mk-surface-2);color:var(--mk-text-disabled);cursor:not-allowed;opacity:.7}.mk-month-picker__value{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mk-month-picker__value--placeholder{color:var(--mk-text-subtle)}.mk-month-picker__icon{flex:none;width:1rem;height:1rem;border:2px solid var(--mk-text-muted);border-radius:2px;position:relative}.mk-month-picker__icon:before{content:\"\";position:absolute;top:-3px;left:2px;right:2px;border-top:2px solid var(--mk-text-muted)}.mk-month-picker__clear{position:absolute;inset-inline-end:var(--mk-space-8);display:grid;place-items:center;width:1.25rem;height:1.25rem;color:var(--mk-text-muted);background:transparent;border:none;border-radius:var(--mk-radius-circle);cursor:pointer}.mk-month-picker__clear:hover{background-color:var(--mk-hover-overlay);color:var(--mk-text)}.mk-month-picker__clear-icon:before,.mk-month-picker__clear-icon:after{content:\"\";position:absolute;width:.7rem;height:2px;background-color:currentColor}.mk-month-picker__clear-icon:before{transform:rotate(45deg)}.mk-month-picker__clear-icon:after{transform:rotate(-45deg)}.mk-month-picker__panel{width:17rem;padding:var(--mk-space-2);background:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-lg);box-shadow:var(--mk-shadow-lg)}.mk-month-picker__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--mk-space-1)}.mk-month-picker__header-label{font-weight:var(--mk-font-weight-semibold);color:var(--mk-text)}.mk-month-picker__nav{display:grid;place-items:center;width:2rem;height:2rem;font-size:var(--mk-font-size-lg);color:var(--mk-text-muted);background:transparent;border:none;border-radius:var(--mk-radius-sm);cursor:pointer}.mk-month-picker__nav:hover{background-color:var(--mk-hover-overlay);color:var(--mk-text)}.mk-month-picker__nav:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-month-picker__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--mk-space-1)}.mk-month-picker__cell{padding:var(--mk-space-2) 0;font-size:var(--mk-font-size-sm);color:var(--mk-text);background:transparent;border:none;border-radius:var(--mk-radius-sm);cursor:pointer}.mk-month-picker__cell:hover:not(:disabled){background-color:var(--mk-hover-overlay)}.mk-month-picker__cell:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(-1 * var(--mk-focus-ring-width))}.mk-month-picker__cell--selected{background-color:var(--mk-primary);color:var(--mk-primary-contrast)}.mk-month-picker__cell--selected:hover:not(:disabled){background-color:var(--mk-primary)}.mk-month-picker__cell:disabled{color:var(--mk-text-disabled);cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2458
+ ], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "cellRefs", predicate: ["cell"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-month-picker__field\">\n <button\n #trigger\n type=\"button\"\n class=\"mk-month-picker__trigger\"\n [id]=\"triggerId\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n @if (displayLabel()) {\n <span class=\"mk-month-picker__value\">{{ displayLabel() }}</span>\n } @else {\n <span class=\"mk-month-picker__value mk-month-picker__value--placeholder\">{{\n resolvedPlaceholder()\n }}</span>\n }\n <span class=\"mk-month-picker__icon\" aria-hidden=\"true\"></span>\n </button>\n\n @if (clearable() && value() && !isDisabled()) {\n <button\n type=\"button\"\n class=\"mk-month-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear($event)\"\n >\n <span class=\"mk-month-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-month-picker__panel\"\n role=\"dialog\"\n [id]=\"panelId\"\n [attr.aria-label]=\"mode() === 'year' ? i18n.chooseYear : i18n.chooseMonth\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n >\n <div class=\"mk-month-picker__header\">\n <button\n type=\"button\"\n class=\"mk-month-picker__nav\"\n [attr.aria-label]=\"mode() === 'year' ? i18n.previousYears : i18n.previousYear\"\n (click)=\"shiftView(-1)\"\n >\n \u2039\n </button>\n <span class=\"mk-month-picker__header-label\" aria-live=\"polite\">{{ headerLabel() }}</span>\n <button\n type=\"button\"\n class=\"mk-month-picker__nav\"\n [attr.aria-label]=\"mode() === 'year' ? i18n.nextYears : i18n.nextYear\"\n (click)=\"shiftView(1)\"\n >\n \u203A\n </button>\n </div>\n\n <div class=\"mk-month-picker__grid\" role=\"grid\" (keydown)=\"onGridKeydown($event)\">\n @for (cell of cells(); track cell.label; let i = $index) {\n <button\n #cell\n type=\"button\"\n class=\"mk-month-picker__cell\"\n [class.mk-month-picker__cell--selected]=\"cell.selected\"\n [attr.tabindex]=\"i === activeIndex() ? 0 : -1\"\n [attr.aria-selected]=\"cell.selected\"\n [disabled]=\"cell.disabled\"\n (click)=\"selectCell(cell)\"\n >\n {{ cell.label }}\n </button>\n }\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-month-picker__field{display:flex;align-items:center;position:relative}.mk-month-picker__trigger{flex:1 1 auto;display:flex;align-items:center;gap:var(--mk-space-2);width:100%;height:var(--mk-control-height-md);padding:0 var(--mk-space-3);text-align:start;font:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);cursor:pointer}:host(.mk-month-picker--sm) .mk-month-picker__trigger{height:var(--mk-control-height-sm);padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm);border-radius:var(--mk-radius-sm)}:host(.mk-month-picker--lg) .mk-month-picker__trigger{height:var(--mk-control-height-lg);padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-month-picker__trigger:hover:not(:disabled){border-color:var(--mk-border-strong)}.mk-month-picker__trigger:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-month-picker--invalid) .mk-month-picker__trigger{border-color:var(--mk-danger)}:host(.mk-month-picker--disabled) .mk-month-picker__trigger{background-color:var(--mk-surface-2);color:var(--mk-text-disabled);cursor:not-allowed;opacity:.7}.mk-month-picker__value{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mk-month-picker__value--placeholder{color:var(--mk-text-subtle)}.mk-month-picker__icon{flex:none;width:1rem;height:1rem;border:2px solid var(--mk-text-muted);border-radius:2px;position:relative}.mk-month-picker__icon:before{content:\"\";position:absolute;top:-3px;left:2px;right:2px;border-top:2px solid var(--mk-text-muted)}.mk-month-picker__clear{position:absolute;inset-inline-end:var(--mk-space-8);display:grid;place-items:center;width:1.25rem;height:1.25rem;color:var(--mk-text-muted);background:transparent;border:none;border-radius:var(--mk-radius-circle);cursor:pointer}.mk-month-picker__clear:hover{background-color:var(--mk-hover-overlay);color:var(--mk-text)}.mk-month-picker__clear-icon:before,.mk-month-picker__clear-icon:after{content:\"\";position:absolute;width:.7rem;height:2px;background-color:currentColor}.mk-month-picker__clear-icon:before{transform:rotate(45deg)}.mk-month-picker__clear-icon:after{transform:rotate(-45deg)}.mk-month-picker__panel{width:17rem;padding:var(--mk-space-2);background:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-lg);box-shadow:var(--mk-shadow-lg)}.mk-month-picker__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--mk-space-1)}.mk-month-picker__header-label{font-weight:var(--mk-font-weight-semibold);color:var(--mk-text)}.mk-month-picker__nav{display:grid;place-items:center;width:2rem;height:2rem;font-size:var(--mk-font-size-lg);color:var(--mk-text-muted);background:transparent;border:none;border-radius:var(--mk-radius-sm);cursor:pointer}.mk-month-picker__nav:hover{background-color:var(--mk-hover-overlay);color:var(--mk-text)}.mk-month-picker__nav:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-month-picker__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--mk-space-1)}.mk-month-picker__cell{padding:var(--mk-space-2) 0;font-size:var(--mk-font-size-sm);color:var(--mk-text);background:transparent;border:none;border-radius:var(--mk-radius-sm);cursor:pointer}.mk-month-picker__cell:hover:not(:disabled){background-color:var(--mk-hover-overlay)}.mk-month-picker__cell:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(-1 * var(--mk-focus-ring-width))}.mk-month-picker__cell--selected{background-color:var(--mk-primary);color:var(--mk-primary-contrast)}.mk-month-picker__cell--selected:hover:not(:disabled){background-color:var(--mk-primary)}.mk-month-picker__cell:disabled{color:var(--mk-text-disabled);cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp", "keepOpenWhen"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1914
2459
  }
1915
2460
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkMonthPicker, decorators: [{
1916
2461
  type: Component,
@@ -2140,7 +2685,7 @@ class MkWeekPicker {
2140
2685
  useExisting: forwardRef(() => MkWeekPicker),
2141
2686
  multi: true,
2142
2687
  },
2143
- ], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-week-picker__field\">\n <button\n #trigger\n type=\"button\"\n class=\"mk-week-picker__trigger\"\n [id]=\"triggerId\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n @if (displayLabel()) {\n <span class=\"mk-week-picker__value\">{{ displayLabel() }}</span>\n } @else {\n <span class=\"mk-week-picker__value mk-week-picker__value--placeholder\">{{\n placeholder()\n }}</span>\n }\n <svg\n class=\"mk-week-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\" />\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\n </svg>\n </button>\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-week-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-week-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-week-picker__panel\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n [id]=\"panelId\"\n role=\"dialog\"\n [attr.aria-label]=\"i18n.chooseWeek\"\n >\n <mk-calendar\n [value]=\"calendarValue()\"\n [rangeMode]=\"true\"\n [rangeStart]=\"highlightStart()\"\n [rangeEnd]=\"highlightEnd()\"\n (dateSelected)=\"onPick($event)\"\n (dateHovered)=\"onHover($event)\"\n [min]=\"min()\"\n [max]=\"max()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [size]=\"effectiveSize()\"\n />\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-week-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-week-picker--sm) .mk-week-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-week-picker--lg) .mk-week-picker__field{height:var(--mk-control-height-lg)}.mk-week-picker__field:hover{border-color:var(--mk-border-strong)}.mk-week-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-week-picker--invalid) .mk-week-picker__field{border-color:var(--mk-danger)}:host(.mk-week-picker--invalid) .mk-week-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-week-picker--disabled) .mk-week-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-week-picker__trigger{display:flex;align-items:center;gap:var(--mk-space-2);flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);text-align:start;background:transparent;border:0;outline:none;cursor:pointer}:host(.mk-week-picker--sm) .mk-week-picker__trigger{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-week-picker--lg) .mk-week-picker__trigger{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-week-picker__trigger:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-week-picker__value{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mk-week-picker__value--placeholder{color:var(--mk-text-subtle)}.mk-week-picker__icon{flex:none;color:var(--mk-text-muted)}.mk-week-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-week-picker__clear:hover{color:var(--mk-text)}.mk-week-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-week-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-week-picker__clear-icon:before,.mk-week-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-week-picker__clear-icon:before{transform:rotate(45deg)}.mk-week-picker__clear-icon:after{transform:rotate(-45deg)}.mk-week-picker__panel{box-shadow:var(--mk-shadow-lg);border-radius:var(--mk-radius-lg)}@media(prefers-reduced-motion:reduce){.mk-week-picker__field,.mk-week-picker__clear{transition:none}}\n"], dependencies: [{ kind: "component", type: MkCalendar, selector: "mk-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "disabled", "invalid", "disabledDate", "size", "fullWidth", "rangeMode", "rangeStart", "rangeEnd"], outputs: ["valueChange", "dateSelected", "dateHovered"] }, { kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2688
+ ], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panelRef", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div #field class=\"mk-week-picker__field\">\n <button\n #trigger\n type=\"button\"\n class=\"mk-week-picker__trigger\"\n [id]=\"triggerId\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n >\n @if (displayLabel()) {\n <span class=\"mk-week-picker__value\">{{ displayLabel() }}</span>\n } @else {\n <span class=\"mk-week-picker__value mk-week-picker__value--placeholder\">{{\n placeholder()\n }}</span>\n }\n <svg\n class=\"mk-week-picker__icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"17\" rx=\"2\" />\n <path d=\"M3 9h18M8 2v4M16 2v4\" />\n </svg>\n </button>\n\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"mk-week-picker__clear\"\n [attr.aria-label]=\"i18n.clear\"\n (click)=\"clear()\"\n >\n <span class=\"mk-week-picker__clear-icon\" aria-hidden=\"true\"></span>\n </button>\n }\n</div>\n\n@if (open()) {\n <div\n #panel\n class=\"mk-week-picker__panel\"\n mkAnchoredPanel\n [mkAnchoredPanelFor]=\"field\"\n (dismiss)=\"close()\"\n [id]=\"panelId\"\n role=\"dialog\"\n [attr.aria-label]=\"i18n.chooseWeek\"\n >\n <mk-calendar\n [value]=\"calendarValue()\"\n [rangeMode]=\"true\"\n [rangeStart]=\"highlightStart()\"\n [rangeEnd]=\"highlightEnd()\"\n (dateSelected)=\"onPick($event)\"\n (dateHovered)=\"onHover($event)\"\n [min]=\"min()\"\n [max]=\"max()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [size]=\"effectiveSize()\"\n />\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;font-family:var(--mk-font-sans)}.mk-week-picker__field{display:flex;align-items:center;width:100%;height:var(--mk-control-height-md);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-week-picker--sm) .mk-week-picker__field{height:var(--mk-control-height-sm);border-radius:var(--mk-radius-sm)}:host(.mk-week-picker--lg) .mk-week-picker__field{height:var(--mk-control-height-lg)}.mk-week-picker__field:hover{border-color:var(--mk-border-strong)}.mk-week-picker__field:focus-within{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-color:var(--mk-primary)}:host(.mk-week-picker--invalid) .mk-week-picker__field{border-color:var(--mk-danger)}:host(.mk-week-picker--invalid) .mk-week-picker__field:focus-within{outline-color:var(--mk-danger)}:host(.mk-week-picker--disabled) .mk-week-picker__field{background-color:var(--mk-surface-2);border-color:var(--mk-border-subtle);cursor:not-allowed;opacity:.7}.mk-week-picker__trigger{display:flex;align-items:center;gap:var(--mk-space-2);flex:1 1 auto;min-width:0;height:100%;padding:0 var(--mk-space-3);font-family:inherit;font-size:var(--mk-font-size-md);color:var(--mk-text);text-align:start;background:transparent;border:0;outline:none;cursor:pointer}:host(.mk-week-picker--sm) .mk-week-picker__trigger{padding:0 var(--mk-space-2);font-size:var(--mk-font-size-sm)}:host(.mk-week-picker--lg) .mk-week-picker__trigger{padding:0 var(--mk-space-4);font-size:var(--mk-font-size-lg)}.mk-week-picker__trigger:disabled{color:var(--mk-text-disabled);cursor:not-allowed}.mk-week-picker__value{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mk-week-picker__value--placeholder{color:var(--mk-text-subtle)}.mk-week-picker__icon{flex:none;color:var(--mk-text-muted)}.mk-week-picker__clear{display:inline-flex;align-items:center;justify-content:center;flex:none;height:100%;padding:0 var(--mk-space-2);color:var(--mk-text-muted);background:transparent;border:0;cursor:pointer;transition:color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-week-picker__clear:hover{color:var(--mk-text)}.mk-week-picker__clear:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:calc(var(--mk-focus-ring-offset) * -1);border-radius:var(--mk-radius-sm)}.mk-week-picker__clear-icon{position:relative;width:.85rem;height:.85rem}.mk-week-picker__clear-icon:before,.mk-week-picker__clear-icon:after{content:\"\";position:absolute;top:50%;left:0;width:100%;height:2px;background-color:currentColor}.mk-week-picker__clear-icon:before{transform:rotate(45deg)}.mk-week-picker__clear-icon:after{transform:rotate(-45deg)}.mk-week-picker__panel{box-shadow:var(--mk-shadow-lg);border-radius:var(--mk-radius-lg)}@media(prefers-reduced-motion:reduce){.mk-week-picker__field,.mk-week-picker__clear{transition:none}}\n"], dependencies: [{ kind: "component", type: MkCalendar, selector: "mk-calendar", inputs: ["value", "min", "max", "firstDayOfWeek", "disabled", "invalid", "disabledDate", "size", "fullWidth", "rangeMode", "rangeStart", "rangeEnd"], outputs: ["valueChange", "dateSelected", "dateHovered"] }, { kind: "directive", type: MkAnchoredPanel, selector: "[mkAnchoredPanel]", inputs: ["mkAnchoredPanelFor", "anchorRect", "placement", "gap", "matchWidth", "flip", "clamp", "keepOpenWhen"], outputs: ["dismiss"], exportAs: ["mkAnchoredPanel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2144
2689
  }
2145
2690
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkWeekPicker, decorators: [{
2146
2691
  type: Component,
@@ -3405,5 +3950,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
3405
3950
  * Generated bundle index. Do not edit.
3406
3951
  */
3407
3952
 
3408
- 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 };
3953
+ 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 };
3409
3954
  //# sourceMappingURL=mk-kit-ui-datetime.mjs.map