@lifecorner/angular-ui-kit 3.25.1 → 3.27.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.
Files changed (75) hide show
  1. package/fesm2022/lifecorner-angular-ui-kit-button.mjs +18 -2
  2. package/fesm2022/lifecorner-angular-ui-kit-button.mjs.map +1 -1
  3. package/fesm2022/lifecorner-angular-ui-kit-callout.mjs +2 -2
  4. package/fesm2022/lifecorner-angular-ui-kit-callout.mjs.map +1 -1
  5. package/fesm2022/lifecorner-angular-ui-kit-chat.mjs +2 -2
  6. package/fesm2022/lifecorner-angular-ui-kit-chat.mjs.map +1 -1
  7. package/fesm2022/lifecorner-angular-ui-kit-choice-prompt.mjs +1 -0
  8. package/fesm2022/lifecorner-angular-ui-kit-choice-prompt.mjs.map +1 -1
  9. package/fesm2022/lifecorner-angular-ui-kit-color-picker.mjs +2 -2
  10. package/fesm2022/lifecorner-angular-ui-kit-color-picker.mjs.map +1 -1
  11. package/fesm2022/lifecorner-angular-ui-kit-confirm-dialog.mjs +1 -0
  12. package/fesm2022/lifecorner-angular-ui-kit-confirm-dialog.mjs.map +1 -1
  13. package/fesm2022/lifecorner-angular-ui-kit-copy-field.mjs +1 -0
  14. package/fesm2022/lifecorner-angular-ui-kit-copy-field.mjs.map +1 -1
  15. package/fesm2022/lifecorner-angular-ui-kit-date-range-picker.mjs +2 -2
  16. package/fesm2022/lifecorner-angular-ui-kit-date-range-picker.mjs.map +1 -1
  17. package/fesm2022/lifecorner-angular-ui-kit-datepicker.mjs +2 -2
  18. package/fesm2022/lifecorner-angular-ui-kit-datepicker.mjs.map +1 -1
  19. package/fesm2022/lifecorner-angular-ui-kit-dependency-viewer.mjs +47 -9
  20. package/fesm2022/lifecorner-angular-ui-kit-dependency-viewer.mjs.map +1 -1
  21. package/fesm2022/lifecorner-angular-ui-kit-description-list.mjs +2 -2
  22. package/fesm2022/lifecorner-angular-ui-kit-description-list.mjs.map +1 -1
  23. package/fesm2022/lifecorner-angular-ui-kit-document-viewer.mjs +2 -2
  24. package/fesm2022/lifecorner-angular-ui-kit-document-viewer.mjs.map +1 -1
  25. package/fesm2022/lifecorner-angular-ui-kit-file-upload.mjs +8 -4
  26. package/fesm2022/lifecorner-angular-ui-kit-file-upload.mjs.map +1 -1
  27. package/fesm2022/lifecorner-angular-ui-kit-filter-bar.mjs +2 -2
  28. package/fesm2022/lifecorner-angular-ui-kit-filter-bar.mjs.map +1 -1
  29. package/fesm2022/lifecorner-angular-ui-kit-gallery.mjs +2 -2
  30. package/fesm2022/lifecorner-angular-ui-kit-gallery.mjs.map +1 -1
  31. package/fesm2022/lifecorner-angular-ui-kit-gantt-chart.mjs +2 -2
  32. package/fesm2022/lifecorner-angular-ui-kit-gantt-chart.mjs.map +1 -1
  33. package/fesm2022/lifecorner-angular-ui-kit-header.mjs +3 -2
  34. package/fesm2022/lifecorner-angular-ui-kit-header.mjs.map +1 -1
  35. package/fesm2022/lifecorner-angular-ui-kit-input.mjs +2 -2
  36. package/fesm2022/lifecorner-angular-ui-kit-input.mjs.map +1 -1
  37. package/fesm2022/lifecorner-angular-ui-kit-kanban-board.mjs +2 -2
  38. package/fesm2022/lifecorner-angular-ui-kit-kanban-board.mjs.map +1 -1
  39. package/fesm2022/lifecorner-angular-ui-kit-list.mjs +1 -0
  40. package/fesm2022/lifecorner-angular-ui-kit-list.mjs.map +1 -1
  41. package/fesm2022/lifecorner-angular-ui-kit-log-viewer.mjs +2 -2
  42. package/fesm2022/lifecorner-angular-ui-kit-log-viewer.mjs.map +1 -1
  43. package/fesm2022/lifecorner-angular-ui-kit-next-step-card.mjs +1 -0
  44. package/fesm2022/lifecorner-angular-ui-kit-next-step-card.mjs.map +1 -1
  45. package/fesm2022/lifecorner-angular-ui-kit-notification-center.mjs +2 -2
  46. package/fesm2022/lifecorner-angular-ui-kit-notification-center.mjs.map +1 -1
  47. package/fesm2022/lifecorner-angular-ui-kit-number-input.mjs +2 -2
  48. package/fesm2022/lifecorner-angular-ui-kit-number-input.mjs.map +1 -1
  49. package/fesm2022/lifecorner-angular-ui-kit-rich-text-editor.mjs +2 -2
  50. package/fesm2022/lifecorner-angular-ui-kit-rich-text-editor.mjs.map +1 -1
  51. package/fesm2022/lifecorner-angular-ui-kit-scatter-plot.mjs +2 -2
  52. package/fesm2022/lifecorner-angular-ui-kit-scatter-plot.mjs.map +1 -1
  53. package/fesm2022/lifecorner-angular-ui-kit-search-input.mjs +2 -2
  54. package/fesm2022/lifecorner-angular-ui-kit-search-input.mjs.map +1 -1
  55. package/fesm2022/lifecorner-angular-ui-kit-select.mjs +2 -2
  56. package/fesm2022/lifecorner-angular-ui-kit-select.mjs.map +1 -1
  57. package/fesm2022/lifecorner-angular-ui-kit-split-pane.mjs +2 -2
  58. package/fesm2022/lifecorner-angular-ui-kit-split-pane.mjs.map +1 -1
  59. package/fesm2022/lifecorner-angular-ui-kit-table.mjs +3 -2
  60. package/fesm2022/lifecorner-angular-ui-kit-table.mjs.map +1 -1
  61. package/fesm2022/lifecorner-angular-ui-kit-tabs.mjs +2 -2
  62. package/fesm2022/lifecorner-angular-ui-kit-tabs.mjs.map +1 -1
  63. package/fesm2022/lifecorner-angular-ui-kit-tag-input.mjs +2 -2
  64. package/fesm2022/lifecorner-angular-ui-kit-tag-input.mjs.map +1 -1
  65. package/fesm2022/lifecorner-angular-ui-kit-textarea.mjs +2 -2
  66. package/fesm2022/lifecorner-angular-ui-kit-textarea.mjs.map +1 -1
  67. package/fesm2022/lifecorner-angular-ui-kit-toggle-group.mjs +2 -2
  68. package/fesm2022/lifecorner-angular-ui-kit-toggle-group.mjs.map +1 -1
  69. package/package.json +1 -1
  70. package/src/styles/_reset.scss +4 -2
  71. package/src/styles/focus-indicators.spec.ts +199 -0
  72. package/types/lifecorner-angular-ui-kit-button.d.ts +20 -0
  73. package/types/lifecorner-angular-ui-kit-dependency-viewer.d.ts +33 -4
  74. package/types/lifecorner-angular-ui-kit-description-list.d.ts +4 -0
  75. package/types/lifecorner-angular-ui-kit-file-upload.d.ts +11 -1
@@ -327,7 +327,7 @@ var DateRangePickerComponent = class DateRangePickerComponent {
327
327
  }],
328
328
  ngImport: i0,
329
329
  template: "@if (label()) {\n <label class=\"lc-drp__label\" [id]=\"labelId\" [for]=\"triggerId\">{{ label() }}</label>\n}\n\n<!-- The clear button must not be nested inside the trigger button, so the\n bordered \"field\" wraps both. -->\n<div class=\"lc-drp__field\" [class.lc-drp__field--disabled]=\"isDisabled()\">\n <button\n #triggerEl\n type=\"button\"\n class=\"lc-drp__trigger\"\n [id]=\"triggerId\"\n [class.lc-drp__trigger--disabled]=\"isDisabled()\"\n [disabled]=\"isDisabled()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId : null\"\n [attr.aria-labelledby]=\"label() ? labelId + ' ' + valueId : null\"\n (click)=\"toggle()\"\n >\n <lc-icon class=\"lc-drp__icon\" name=\"calendar\" size=\"sm\" [decorative]=\"true\" />\n <span class=\"lc-drp__value\" [id]=\"valueId\" [class.lc-drp__value--placeholder]=\"!displayValue()\">\n {{ displayValue() || placeholder() }}\n </span>\n </button>\n @if (displayValue() && !isDisabled()) {\n <button type=\"button\" class=\"lc-drp__clear\" (click)=\"clearRange($event)\" [attr.aria-label]=\"clearAriaLabel()\">×</button>\n }\n</div>\n\n@if (isOpen()) {\n <div\n #panelEl\n class=\"lc-drp__dropdown\"\n role=\"dialog\"\n [id]=\"panelId\"\n [attr.aria-label]=\"label() || placeholder()\"\n >\n <div class=\"lc-drp__header\">\n <button type=\"button\" class=\"lc-drp__nav\" [attr.aria-label]=\"previousMonthAriaLabel()\" (click)=\"prevMonth()\">‹</button>\n <span class=\"lc-drp__month\" aria-live=\"polite\">{{ monthLabel() }}</span>\n <button type=\"button\" class=\"lc-drp__nav\" [attr.aria-label]=\"nextMonthAriaLabel()\" (click)=\"nextMonth()\">›</button>\n </div>\n\n <div class=\"lc-drp__weekdays\" aria-hidden=\"true\">\n @for (wd of weekdays(); track $index) {\n <span class=\"lc-drp__weekday\">{{ wd }}</span>\n }\n </div>\n\n <div class=\"lc-drp__grid\">\n @for (day of calendarDays(); track day.date.getTime()) {\n <button\n type=\"button\"\n class=\"lc-drp__day\"\n [class.lc-drp__day--outside]=\"!day.inMonth\"\n [class.lc-drp__day--disabled]=\"day.disabled\"\n [class.lc-drp__day--today]=\"isToday(day.date)\"\n [class.lc-drp__day--start]=\"isStart(day.date)\"\n [class.lc-drp__day--end]=\"isEnd(day.date)\"\n [class.lc-drp__day--in-range]=\"isInRange(day.date)\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-pressed]=\"isStart(day.date) || isEnd(day.date)\"\n (click)=\"selectDate(day.date)\"\n (mouseenter)=\"onDayHover(day.date)\"\n >{{ day.date.getDate() }}</button>\n }\n </div>\n\n <div class=\"lc-drp__footer\">\n <span class=\"lc-drp__hint\" aria-live=\"polite\">\n @if (selecting() === 'start') { Select start date }\n @else { Select end date }\n </span>\n </div>\n </div>\n}\n",
330
- styles: [":host{display:block;position:relative}.lc-drp__label{display:block;margin-bottom:4px;font-size:var(--typography-font-size-sm, .875rem);font-weight:500;color:var(--color-text-secondary)}.lc-drp__field{display:flex;align-items:stretch;min-height:40px;border:1px solid var(--color-field-border);border-radius:var(--border-radius-md);background:var(--color-surface-2);transition:border-color .15s,box-shadow .15s}.lc-drp__field:hover:not(.lc-drp__field--disabled){border-color:var(--color-text-secondary)}.lc-drp__field:focus-within{border-color:var(--color-primary-500);box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary-500) 20%,transparent)}.lc-drp__field--disabled{opacity:.6;background:var(--color-surface-muted)}.lc-drp__trigger{flex:1;display:flex;align-items:center;gap:8px;min-width:0;padding:8px 12px;border:none;border-radius:inherit;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}.lc-drp__trigger:focus{outline:none}.lc-drp__trigger--disabled,.lc-drp__trigger:disabled{cursor:not-allowed}.lc-drp__icon{flex-shrink:0;color:var(--color-text-tertiary);display:inline-flex}.lc-drp__value{flex:1;min-width:0;font-size:var(--typography-font-size-sm, .875rem);color:var(--color-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lc-drp__value--placeholder{color:var(--color-text-tertiary)}.lc-drp__clear{border:none;background:none;padding:0 8px;cursor:pointer;font-size:16px;color:var(--color-text-tertiary);border-radius:inherit}.lc-drp__clear:hover{color:var(--color-text-secondary)}.lc-drp__clear:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px}.lc-drp__dropdown{position:absolute;z-index:100;top:100%;left:0;margin-top:4px;padding:12px;background-color:var(--color-surface);background-image:var(--gradient-surface);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-lg);box-shadow:var(--elevation-4);width:280px}.lc-drp__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.lc-drp__nav{width:28px;height:28px;border:none;border-radius:var(--border-radius-sm);background:transparent;cursor:pointer;font-size:18px;color:var(--color-text-secondary);display:flex;align-items:center;justify-content:center}.lc-drp__nav:hover{background:var(--color-surface-hover)}.lc-drp__nav:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:0}.lc-drp__month{font-size:var(--typography-font-size-sm, .875rem);font-weight:600;color:var(--color-text-primary)}.lc-drp__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:0;margin-bottom:4px}.lc-drp__weekday{text-align:center;font-size:.6875rem;font-weight:600;color:var(--color-text-tertiary);padding:4px}.lc-drp__grid{display:grid;grid-template-columns:repeat(7,1fr);gap:0}.lc-drp__day{width:100%;aspect-ratio:1;display:flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;font-size:.75rem;border-radius:var(--border-radius-sm);color:var(--color-text-primary);transition:all .1s}.lc-drp__day:hover:not(:disabled){background:var(--color-surface-hover)}.lc-drp__day:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px;z-index:1}.lc-drp__day--outside{color:var(--color-text-tertiary)}.lc-drp__day--disabled{color:var(--color-text-disabled);cursor:default}.lc-drp__day--today{font-weight:700;box-shadow:inset 0 -2px 0 var(--color-primary-500)}.lc-drp__day--start,.lc-drp__day--end{background:var(--color-primary-fill)!important;color:var(--color-on-primary)!important;font-weight:600}.lc-drp__day--in-range{background:var(--color-surface-selected);border-radius:0}.lc-drp__day--start{border-radius:var(--border-radius-sm) 0 0 var(--border-radius-sm)}.lc-drp__day--end{border-radius:0 var(--border-radius-sm) var(--border-radius-sm) 0}.lc-drp__footer{margin-top:8px;padding-top:8px;border-top:1px solid var(--color-divider)}.lc-drp__hint{font-size:.6875rem;color:var(--color-text-tertiary)}\n"],
330
+ styles: [":host{display:block;position:relative}.lc-drp__label{display:block;margin-bottom:4px;font-size:var(--typography-font-size-sm, .875rem);font-weight:500;color:var(--color-text-secondary)}.lc-drp__field{display:flex;align-items:stretch;min-height:40px;border:1px solid var(--color-field-border);border-radius:var(--border-radius-md);background:var(--color-surface-2);transition:border-color .15s,box-shadow .15s}.lc-drp__field:hover:not(.lc-drp__field--disabled):not(:focus-within){border-color:var(--color-text-secondary)}.lc-drp__field:focus-within{border-color:var(--color-primary-500);box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary-500) 20%,transparent)}.lc-drp__field--disabled{opacity:.6;background:var(--color-surface-muted)}.lc-drp__trigger{flex:1;display:flex;align-items:center;gap:8px;min-width:0;padding:8px 12px;border:none;border-radius:inherit;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}.lc-drp__trigger:focus{outline:none}.lc-drp__trigger--disabled,.lc-drp__trigger:disabled{cursor:not-allowed}.lc-drp__icon{flex-shrink:0;color:var(--color-text-tertiary);display:inline-flex}.lc-drp__value{flex:1;min-width:0;font-size:var(--typography-font-size-sm, .875rem);color:var(--color-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lc-drp__value--placeholder{color:var(--color-text-tertiary)}.lc-drp__clear{border:none;background:none;padding:0 8px;cursor:pointer;font-size:16px;color:var(--color-text-tertiary);border-radius:inherit}.lc-drp__clear:hover{color:var(--color-text-secondary)}.lc-drp__clear:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px}.lc-drp__dropdown{position:absolute;z-index:100;top:100%;left:0;margin-top:4px;padding:12px;background-color:var(--color-surface);background-image:var(--gradient-surface);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-lg);box-shadow:var(--elevation-4);width:280px}.lc-drp__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.lc-drp__nav{width:28px;height:28px;border:none;border-radius:var(--border-radius-sm);background:transparent;cursor:pointer;font-size:18px;color:var(--color-text-secondary);display:flex;align-items:center;justify-content:center}.lc-drp__nav:hover{background:var(--color-surface-hover)}.lc-drp__nav:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:0}.lc-drp__month{font-size:var(--typography-font-size-sm, .875rem);font-weight:600;color:var(--color-text-primary)}.lc-drp__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:0;margin-bottom:4px}.lc-drp__weekday{text-align:center;font-size:.6875rem;font-weight:600;color:var(--color-text-tertiary);padding:4px}.lc-drp__grid{display:grid;grid-template-columns:repeat(7,1fr);gap:0}.lc-drp__day{width:100%;aspect-ratio:1;display:flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;font-size:.75rem;border-radius:var(--border-radius-sm);color:var(--color-text-primary);transition:all .1s}.lc-drp__day:hover:not(:disabled){background:var(--color-surface-hover)}.lc-drp__day:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px;z-index:1}.lc-drp__day--outside{color:var(--color-text-tertiary)}.lc-drp__day--disabled{color:var(--color-text-disabled);cursor:default}.lc-drp__day--today{font-weight:700;box-shadow:inset 0 -2px 0 var(--color-primary-500)}.lc-drp__day--start,.lc-drp__day--end{background:var(--color-primary-fill)!important;color:var(--color-on-primary)!important;font-weight:600}.lc-drp__day--in-range{background:var(--color-surface-selected);border-radius:0}.lc-drp__day--start{border-radius:var(--border-radius-sm) 0 0 var(--border-radius-sm)}.lc-drp__day--end{border-radius:0 var(--border-radius-sm) var(--border-radius-sm) 0}.lc-drp__footer{margin-top:8px;padding-top:8px;border-top:1px solid var(--color-divider)}.lc-drp__hint{font-size:.6875rem;color:var(--color-text-tertiary)}\n"],
331
331
  dependencies: [{
332
332
  kind: "component",
333
333
  type: IconComponent,
@@ -365,7 +365,7 @@ i0.ɵɵngDeclareClassMetadata({
365
365
  multi: true
366
366
  }],
367
367
  template: "@if (label()) {\n <label class=\"lc-drp__label\" [id]=\"labelId\" [for]=\"triggerId\">{{ label() }}</label>\n}\n\n<!-- The clear button must not be nested inside the trigger button, so the\n bordered \"field\" wraps both. -->\n<div class=\"lc-drp__field\" [class.lc-drp__field--disabled]=\"isDisabled()\">\n <button\n #triggerEl\n type=\"button\"\n class=\"lc-drp__trigger\"\n [id]=\"triggerId\"\n [class.lc-drp__trigger--disabled]=\"isDisabled()\"\n [disabled]=\"isDisabled()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId : null\"\n [attr.aria-labelledby]=\"label() ? labelId + ' ' + valueId : null\"\n (click)=\"toggle()\"\n >\n <lc-icon class=\"lc-drp__icon\" name=\"calendar\" size=\"sm\" [decorative]=\"true\" />\n <span class=\"lc-drp__value\" [id]=\"valueId\" [class.lc-drp__value--placeholder]=\"!displayValue()\">\n {{ displayValue() || placeholder() }}\n </span>\n </button>\n @if (displayValue() && !isDisabled()) {\n <button type=\"button\" class=\"lc-drp__clear\" (click)=\"clearRange($event)\" [attr.aria-label]=\"clearAriaLabel()\">×</button>\n }\n</div>\n\n@if (isOpen()) {\n <div\n #panelEl\n class=\"lc-drp__dropdown\"\n role=\"dialog\"\n [id]=\"panelId\"\n [attr.aria-label]=\"label() || placeholder()\"\n >\n <div class=\"lc-drp__header\">\n <button type=\"button\" class=\"lc-drp__nav\" [attr.aria-label]=\"previousMonthAriaLabel()\" (click)=\"prevMonth()\">‹</button>\n <span class=\"lc-drp__month\" aria-live=\"polite\">{{ monthLabel() }}</span>\n <button type=\"button\" class=\"lc-drp__nav\" [attr.aria-label]=\"nextMonthAriaLabel()\" (click)=\"nextMonth()\">›</button>\n </div>\n\n <div class=\"lc-drp__weekdays\" aria-hidden=\"true\">\n @for (wd of weekdays(); track $index) {\n <span class=\"lc-drp__weekday\">{{ wd }}</span>\n }\n </div>\n\n <div class=\"lc-drp__grid\">\n @for (day of calendarDays(); track day.date.getTime()) {\n <button\n type=\"button\"\n class=\"lc-drp__day\"\n [class.lc-drp__day--outside]=\"!day.inMonth\"\n [class.lc-drp__day--disabled]=\"day.disabled\"\n [class.lc-drp__day--today]=\"isToday(day.date)\"\n [class.lc-drp__day--start]=\"isStart(day.date)\"\n [class.lc-drp__day--end]=\"isEnd(day.date)\"\n [class.lc-drp__day--in-range]=\"isInRange(day.date)\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-pressed]=\"isStart(day.date) || isEnd(day.date)\"\n (click)=\"selectDate(day.date)\"\n (mouseenter)=\"onDayHover(day.date)\"\n >{{ day.date.getDate() }}</button>\n }\n </div>\n\n <div class=\"lc-drp__footer\">\n <span class=\"lc-drp__hint\" aria-live=\"polite\">\n @if (selecting() === 'start') { Select start date }\n @else { Select end date }\n </span>\n </div>\n </div>\n}\n",
368
- styles: [":host{display:block;position:relative}.lc-drp__label{display:block;margin-bottom:4px;font-size:var(--typography-font-size-sm, .875rem);font-weight:500;color:var(--color-text-secondary)}.lc-drp__field{display:flex;align-items:stretch;min-height:40px;border:1px solid var(--color-field-border);border-radius:var(--border-radius-md);background:var(--color-surface-2);transition:border-color .15s,box-shadow .15s}.lc-drp__field:hover:not(.lc-drp__field--disabled){border-color:var(--color-text-secondary)}.lc-drp__field:focus-within{border-color:var(--color-primary-500);box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary-500) 20%,transparent)}.lc-drp__field--disabled{opacity:.6;background:var(--color-surface-muted)}.lc-drp__trigger{flex:1;display:flex;align-items:center;gap:8px;min-width:0;padding:8px 12px;border:none;border-radius:inherit;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}.lc-drp__trigger:focus{outline:none}.lc-drp__trigger--disabled,.lc-drp__trigger:disabled{cursor:not-allowed}.lc-drp__icon{flex-shrink:0;color:var(--color-text-tertiary);display:inline-flex}.lc-drp__value{flex:1;min-width:0;font-size:var(--typography-font-size-sm, .875rem);color:var(--color-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lc-drp__value--placeholder{color:var(--color-text-tertiary)}.lc-drp__clear{border:none;background:none;padding:0 8px;cursor:pointer;font-size:16px;color:var(--color-text-tertiary);border-radius:inherit}.lc-drp__clear:hover{color:var(--color-text-secondary)}.lc-drp__clear:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px}.lc-drp__dropdown{position:absolute;z-index:100;top:100%;left:0;margin-top:4px;padding:12px;background-color:var(--color-surface);background-image:var(--gradient-surface);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-lg);box-shadow:var(--elevation-4);width:280px}.lc-drp__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.lc-drp__nav{width:28px;height:28px;border:none;border-radius:var(--border-radius-sm);background:transparent;cursor:pointer;font-size:18px;color:var(--color-text-secondary);display:flex;align-items:center;justify-content:center}.lc-drp__nav:hover{background:var(--color-surface-hover)}.lc-drp__nav:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:0}.lc-drp__month{font-size:var(--typography-font-size-sm, .875rem);font-weight:600;color:var(--color-text-primary)}.lc-drp__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:0;margin-bottom:4px}.lc-drp__weekday{text-align:center;font-size:.6875rem;font-weight:600;color:var(--color-text-tertiary);padding:4px}.lc-drp__grid{display:grid;grid-template-columns:repeat(7,1fr);gap:0}.lc-drp__day{width:100%;aspect-ratio:1;display:flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;font-size:.75rem;border-radius:var(--border-radius-sm);color:var(--color-text-primary);transition:all .1s}.lc-drp__day:hover:not(:disabled){background:var(--color-surface-hover)}.lc-drp__day:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px;z-index:1}.lc-drp__day--outside{color:var(--color-text-tertiary)}.lc-drp__day--disabled{color:var(--color-text-disabled);cursor:default}.lc-drp__day--today{font-weight:700;box-shadow:inset 0 -2px 0 var(--color-primary-500)}.lc-drp__day--start,.lc-drp__day--end{background:var(--color-primary-fill)!important;color:var(--color-on-primary)!important;font-weight:600}.lc-drp__day--in-range{background:var(--color-surface-selected);border-radius:0}.lc-drp__day--start{border-radius:var(--border-radius-sm) 0 0 var(--border-radius-sm)}.lc-drp__day--end{border-radius:0 var(--border-radius-sm) var(--border-radius-sm) 0}.lc-drp__footer{margin-top:8px;padding-top:8px;border-top:1px solid var(--color-divider)}.lc-drp__hint{font-size:.6875rem;color:var(--color-text-tertiary)}\n"]
368
+ styles: [":host{display:block;position:relative}.lc-drp__label{display:block;margin-bottom:4px;font-size:var(--typography-font-size-sm, .875rem);font-weight:500;color:var(--color-text-secondary)}.lc-drp__field{display:flex;align-items:stretch;min-height:40px;border:1px solid var(--color-field-border);border-radius:var(--border-radius-md);background:var(--color-surface-2);transition:border-color .15s,box-shadow .15s}.lc-drp__field:hover:not(.lc-drp__field--disabled):not(:focus-within){border-color:var(--color-text-secondary)}.lc-drp__field:focus-within{border-color:var(--color-primary-500);box-shadow:0 0 0 3px color-mix(in srgb,var(--color-primary-500) 20%,transparent)}.lc-drp__field--disabled{opacity:.6;background:var(--color-surface-muted)}.lc-drp__trigger{flex:1;display:flex;align-items:center;gap:8px;min-width:0;padding:8px 12px;border:none;border-radius:inherit;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}.lc-drp__trigger:focus{outline:none}.lc-drp__trigger--disabled,.lc-drp__trigger:disabled{cursor:not-allowed}.lc-drp__icon{flex-shrink:0;color:var(--color-text-tertiary);display:inline-flex}.lc-drp__value{flex:1;min-width:0;font-size:var(--typography-font-size-sm, .875rem);color:var(--color-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lc-drp__value--placeholder{color:var(--color-text-tertiary)}.lc-drp__clear{border:none;background:none;padding:0 8px;cursor:pointer;font-size:16px;color:var(--color-text-tertiary);border-radius:inherit}.lc-drp__clear:hover{color:var(--color-text-secondary)}.lc-drp__clear:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px}.lc-drp__dropdown{position:absolute;z-index:100;top:100%;left:0;margin-top:4px;padding:12px;background-color:var(--color-surface);background-image:var(--gradient-surface);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-lg);box-shadow:var(--elevation-4);width:280px}.lc-drp__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.lc-drp__nav{width:28px;height:28px;border:none;border-radius:var(--border-radius-sm);background:transparent;cursor:pointer;font-size:18px;color:var(--color-text-secondary);display:flex;align-items:center;justify-content:center}.lc-drp__nav:hover{background:var(--color-surface-hover)}.lc-drp__nav:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:0}.lc-drp__month{font-size:var(--typography-font-size-sm, .875rem);font-weight:600;color:var(--color-text-primary)}.lc-drp__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:0;margin-bottom:4px}.lc-drp__weekday{text-align:center;font-size:.6875rem;font-weight:600;color:var(--color-text-tertiary);padding:4px}.lc-drp__grid{display:grid;grid-template-columns:repeat(7,1fr);gap:0}.lc-drp__day{width:100%;aspect-ratio:1;display:flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;font-size:.75rem;border-radius:var(--border-radius-sm);color:var(--color-text-primary);transition:all .1s}.lc-drp__day:hover:not(:disabled){background:var(--color-surface-hover)}.lc-drp__day:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:-2px;z-index:1}.lc-drp__day--outside{color:var(--color-text-tertiary)}.lc-drp__day--disabled{color:var(--color-text-disabled);cursor:default}.lc-drp__day--today{font-weight:700;box-shadow:inset 0 -2px 0 var(--color-primary-500)}.lc-drp__day--start,.lc-drp__day--end{background:var(--color-primary-fill)!important;color:var(--color-on-primary)!important;font-weight:600}.lc-drp__day--in-range{background:var(--color-surface-selected);border-radius:0}.lc-drp__day--start{border-radius:var(--border-radius-sm) 0 0 var(--border-radius-sm)}.lc-drp__day--end{border-radius:0 var(--border-radius-sm) var(--border-radius-sm) 0}.lc-drp__footer{margin-top:8px;padding-top:8px;border-top:1px solid var(--color-divider)}.lc-drp__hint{font-size:.6875rem;color:var(--color-text-tertiary)}\n"]
369
369
  }]
370
370
  }],
371
371
  ctorParameters: () => [],
@@ -1 +1 @@
1
- {"version":3,"file":"lifecorner-angular-ui-kit-date-range-picker.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/date-range-picker/date-range-picker.component.ts","../../../../libs/angular-ui-kit/src/lib/date-range-picker/date-range-picker.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n afterRenderEffect,\n computed,\n forwardRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { IconComponent, ɵprovideKitIcons } from '@lifecorner/angular-ui-kit/icon';\nimport { ICON_CALENDAR } from '@lifecorner/angular-ui-kit/icons';\n\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n}\n\n/** Monday..Sunday of a known week — only used to derive localised weekday names */\nconst REFERENCE_WEEK = Array.from({ length: 7 }, (_, i) => new Date(2024, 0, 1 + i));\n\n@Component({\n selector: 'lc-date-range-picker',\n standalone: true,\n imports: [IconComponent],\n viewProviders: [ɵprovideKitIcons([ICON_CALENDAR])],\n templateUrl: './date-range-picker.component.html',\n styleUrls: ['./date-range-picker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DateRangePickerComponent),\n multi: true,\n },\n ],\n})\nexport class DateRangePickerComponent implements ControlValueAccessor {\n private static nextId = 0;\n\n /** Per-instance ids for label ↔ trigger ↔ panel ARIA wiring */\n readonly triggerId = `lc-drp-${++DateRangePickerComponent.nextId}`;\n readonly labelId = `${this.triggerId}-label`;\n readonly valueId = `${this.triggerId}-value`;\n readonly panelId = `${this.triggerId}-panel`;\n\n private readonly elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly triggerEl = viewChild<ElementRef<HTMLButtonElement>>('triggerEl');\n private readonly panelEl = viewChild<ElementRef<HTMLElement>>('panelEl');\n\n readonly label = input('');\n readonly placeholder = input('Select date range');\n readonly disabled = input(false);\n readonly minDate = input<Date | null>(null);\n readonly maxDate = input<Date | null>(null);\n /** BCP 47 locale for the displayed dates, month title and weekday headers */\n readonly locale = input('de-DE');\n\n /** Accessible name of the clear button. */\n readonly clearAriaLabel = input('Clear');\n\n /** Accessible name of the previous-month button. */\n readonly previousMonthAriaLabel = input('Previous month');\n\n /** Accessible name of the next-month button. */\n readonly nextMonthAriaLabel = input('Next month');\n\n readonly rangeChange = output<DateRange>();\n\n protected isOpen = signal(false);\n protected range = signal<DateRange>({ start: null, end: null });\n protected selecting = signal<'start' | 'end'>('start');\n protected hoveredDate = signal<Date | null>(null);\n protected viewingMonth = signal(new Date());\n\n /** Disabled via `setDisabledState` (reactive forms) */\n private readonly formDisabled = signal(false);\n\n /** Effective disabled state: `disabled` input OR form control disabled */\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n\n private onChange: (val: DateRange) => void = () => { /* set by registerOnChange */ };\n private onTouched: () => void = () => { /* set by registerOnTouched */ };\n\n protected readonly displayValue = computed(() => {\n const r = this.range();\n if (!r.start) return '';\n const locale = this.locale();\n const fmt = (d: Date) => d.toLocaleDateString(locale, { day: '2-digit', month: '2-digit', year: 'numeric' });\n if (!r.end) return fmt(r.start) + ' – …';\n return `${fmt(r.start)} – ${fmt(r.end)}`;\n });\n\n protected readonly monthLabel = computed(() => {\n const d = this.viewingMonth();\n return d.toLocaleDateString(this.locale(), { month: 'long', year: 'numeric' });\n });\n\n /** Monday-first weekday headers in the configured locale (e.g. Mo…So / Mon…Sun) */\n protected readonly weekdays = computed(() => {\n const locale = this.locale();\n // some ICU builds abbreviate with a trailing period (\"Mo.\") — keep the compact form\n return REFERENCE_WEEK.map((d) => d.toLocaleDateString(locale, { weekday: 'short' }).replace(/\\.$/, ''));\n });\n\n protected readonly calendarDays = computed(() => {\n const viewing = this.viewingMonth();\n const locale = this.locale();\n const year = viewing.getFullYear();\n const month = viewing.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n\n let startDow = firstDay.getDay();\n if (startDow === 0) startDow = 7; // Monday = 1\n const prefixDays = startDow - 1;\n\n const days: { date: Date; inMonth: boolean; disabled: boolean; ariaLabel: string }[] = [];\n const push = (date: Date, inMonth: boolean) =>\n days.push({\n date,\n inMonth,\n disabled: this.isDateDisabled(date),\n ariaLabel: date.toLocaleDateString(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }),\n });\n\n for (let i = prefixDays; i > 0; i--) {\n push(new Date(year, month, 1 - i), false);\n }\n\n for (let d = 1; d <= lastDay.getDate(); d++) {\n push(new Date(year, month, d), true);\n }\n\n const remaining = 42 - days.length;\n for (let i = 1; i <= remaining; i++) {\n push(new Date(year, month + 1, i), false);\n }\n\n return days;\n });\n\n constructor() {\n // Move focus into the panel once it is rendered so keyboard users land on\n // the calendar instead of having to tab through the trigger's siblings.\n afterRenderEffect(() => {\n if (!this.isOpen()) return;\n untracked(() => {\n const panel = this.panelEl()?.nativeElement;\n if (!panel || panel.contains(document.activeElement)) return;\n const target =\n panel.querySelector<HTMLButtonElement>('.lc-drp__day--start:not(:disabled)') ??\n panel.querySelector<HTMLButtonElement>('.lc-drp__day--today:not(:disabled)') ??\n panel.querySelector<HTMLButtonElement>('.lc-drp__day:not(.lc-drp__day--outside):not(:disabled)');\n target?.focus();\n });\n });\n }\n\n writeValue(value: DateRange | null): void {\n this.range.set(value ?? { start: null, end: null });\n if (value?.start) {\n this.viewingMonth.set(new Date(value.start.getFullYear(), value.start.getMonth(), 1));\n }\n }\n\n registerOnChange(fn: (val: DateRange) => void): void { this.onChange = fn; }\n registerOnTouched(fn: () => void): void { this.onTouched = fn; }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n if (isDisabled) this.isOpen.set(false);\n }\n\n protected toggle(): void {\n if (this.isDisabled()) return;\n if (this.isOpen()) {\n this.close();\n return;\n }\n this.selecting.set('start');\n this.hoveredDate.set(null);\n this.isOpen.set(true);\n }\n\n protected close(): void {\n if (!this.isOpen()) return;\n this.isOpen.set(false);\n this.onTouched();\n // Return focus to the trigger when it was inside the (now removed) panel\n if (this.elRef.nativeElement.contains(document.activeElement)) {\n this.triggerEl()?.nativeElement.focus();\n }\n }\n\n /** Escape (from the trigger or anywhere in the panel) closes the picker */\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.isOpen()) {\n this.close();\n // consumed here — an enclosing modal/drawer must not close as well\n event.stopPropagation();\n event.preventDefault();\n }\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocumentClick(event: MouseEvent): void {\n if (this.isOpen() && !this.elRef.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n protected prevMonth(): void {\n this.viewingMonth.update(d => new Date(d.getFullYear(), d.getMonth() - 1, 1));\n }\n\n protected nextMonth(): void {\n this.viewingMonth.update(d => new Date(d.getFullYear(), d.getMonth() + 1, 1));\n }\n\n protected selectDate(date: Date): void {\n if (this.isDateDisabled(date)) return;\n\n const current = this.range();\n if (this.selecting() === 'start') {\n this.range.set({ start: date, end: null });\n this.selecting.set('end');\n } else {\n if (date < current.start!) {\n this.range.set({ start: date, end: current.start });\n } else {\n this.range.set({ start: current.start, end: date });\n }\n this.selecting.set('start');\n this.emitRange();\n this.close();\n }\n }\n\n protected onDayHover(date: Date): void {\n if (this.selecting() === 'end') {\n this.hoveredDate.set(date);\n }\n }\n\n protected isStart(date: Date): boolean {\n return this.sameDay(date, this.range().start);\n }\n\n protected isEnd(date: Date): boolean {\n return this.sameDay(date, this.range().end);\n }\n\n protected isInRange(date: Date): boolean {\n const r = this.range();\n if (!r.start) return false;\n const end = r.end || this.hoveredDate();\n if (!end) return false;\n const s = Math.min(r.start.getTime(), end.getTime());\n const e = Math.max(r.start.getTime(), end.getTime());\n const t = date.getTime();\n return t > s && t < e;\n }\n\n protected isToday(date: Date): boolean {\n return this.sameDay(date, new Date());\n }\n\n protected clearRange(event: Event): void {\n event.stopPropagation();\n if (this.isDisabled()) return;\n this.range.set({ start: null, end: null });\n const r = { start: null, end: null };\n this.onChange(r);\n this.rangeChange.emit(r);\n }\n\n /** min/max are compared by calendar day — `minDate = new Date()` keeps today selectable */\n private isDateDisabled(date: Date): boolean {\n const min = this.minDate();\n const max = this.maxDate();\n const day = this.dayStamp(date);\n if (min && day < this.dayStamp(min)) return true;\n if (max && day > this.dayStamp(max)) return true;\n return false;\n }\n\n private dayStamp(d: Date): number {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n }\n\n private sameDay(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n }\n\n private emitRange(): void {\n const r = this.range();\n this.onChange(r);\n this.rangeChange.emit(r);\n }\n}\n","@if (label()) {\n <label class=\"lc-drp__label\" [id]=\"labelId\" [for]=\"triggerId\">{{ label() }}</label>\n}\n\n<!-- The clear button must not be nested inside the trigger button, so the\n bordered \"field\" wraps both. -->\n<div class=\"lc-drp__field\" [class.lc-drp__field--disabled]=\"isDisabled()\">\n <button\n #triggerEl\n type=\"button\"\n class=\"lc-drp__trigger\"\n [id]=\"triggerId\"\n [class.lc-drp__trigger--disabled]=\"isDisabled()\"\n [disabled]=\"isDisabled()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId : null\"\n [attr.aria-labelledby]=\"label() ? labelId + ' ' + valueId : null\"\n (click)=\"toggle()\"\n >\n <lc-icon class=\"lc-drp__icon\" name=\"calendar\" size=\"sm\" [decorative]=\"true\" />\n <span class=\"lc-drp__value\" [id]=\"valueId\" [class.lc-drp__value--placeholder]=\"!displayValue()\">\n {{ displayValue() || placeholder() }}\n </span>\n </button>\n @if (displayValue() && !isDisabled()) {\n <button type=\"button\" class=\"lc-drp__clear\" (click)=\"clearRange($event)\" [attr.aria-label]=\"clearAriaLabel()\">×</button>\n }\n</div>\n\n@if (isOpen()) {\n <div\n #panelEl\n class=\"lc-drp__dropdown\"\n role=\"dialog\"\n [id]=\"panelId\"\n [attr.aria-label]=\"label() || placeholder()\"\n >\n <div class=\"lc-drp__header\">\n <button type=\"button\" class=\"lc-drp__nav\" [attr.aria-label]=\"previousMonthAriaLabel()\" (click)=\"prevMonth()\">‹</button>\n <span class=\"lc-drp__month\" aria-live=\"polite\">{{ monthLabel() }}</span>\n <button type=\"button\" class=\"lc-drp__nav\" [attr.aria-label]=\"nextMonthAriaLabel()\" (click)=\"nextMonth()\">›</button>\n </div>\n\n <div class=\"lc-drp__weekdays\" aria-hidden=\"true\">\n @for (wd of weekdays(); track $index) {\n <span class=\"lc-drp__weekday\">{{ wd }}</span>\n }\n </div>\n\n <div class=\"lc-drp__grid\">\n @for (day of calendarDays(); track day.date.getTime()) {\n <button\n type=\"button\"\n class=\"lc-drp__day\"\n [class.lc-drp__day--outside]=\"!day.inMonth\"\n [class.lc-drp__day--disabled]=\"day.disabled\"\n [class.lc-drp__day--today]=\"isToday(day.date)\"\n [class.lc-drp__day--start]=\"isStart(day.date)\"\n [class.lc-drp__day--end]=\"isEnd(day.date)\"\n [class.lc-drp__day--in-range]=\"isInRange(day.date)\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-pressed]=\"isStart(day.date) || isEnd(day.date)\"\n (click)=\"selectDate(day.date)\"\n (mouseenter)=\"onDayHover(day.date)\"\n >{{ day.date.getDate() }}</button>\n }\n </div>\n\n <div class=\"lc-drp__footer\">\n <span class=\"lc-drp__hint\" aria-live=\"polite\">\n @if (selecting() === 'start') { Select start date }\n @else { Select end date }\n </span>\n </div>\n </div>\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-date-range-picker.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/date-range-picker/date-range-picker.component.ts","../../../../libs/angular-ui-kit/src/lib/date-range-picker/date-range-picker.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n afterRenderEffect,\n computed,\n forwardRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { IconComponent, ɵprovideKitIcons } from '@lifecorner/angular-ui-kit/icon';\nimport { ICON_CALENDAR } from '@lifecorner/angular-ui-kit/icons';\n\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n}\n\n/** Monday..Sunday of a known week — only used to derive localised weekday names */\nconst REFERENCE_WEEK = Array.from({ length: 7 }, (_, i) => new Date(2024, 0, 1 + i));\n\n@Component({\n selector: 'lc-date-range-picker',\n standalone: true,\n imports: [IconComponent],\n viewProviders: [ɵprovideKitIcons([ICON_CALENDAR])],\n templateUrl: './date-range-picker.component.html',\n styleUrls: ['./date-range-picker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DateRangePickerComponent),\n multi: true,\n },\n ],\n})\nexport class DateRangePickerComponent implements ControlValueAccessor {\n private static nextId = 0;\n\n /** Per-instance ids for label ↔ trigger ↔ panel ARIA wiring */\n readonly triggerId = `lc-drp-${++DateRangePickerComponent.nextId}`;\n readonly labelId = `${this.triggerId}-label`;\n readonly valueId = `${this.triggerId}-value`;\n readonly panelId = `${this.triggerId}-panel`;\n\n private readonly elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly triggerEl = viewChild<ElementRef<HTMLButtonElement>>('triggerEl');\n private readonly panelEl = viewChild<ElementRef<HTMLElement>>('panelEl');\n\n readonly label = input('');\n readonly placeholder = input('Select date range');\n readonly disabled = input(false);\n readonly minDate = input<Date | null>(null);\n readonly maxDate = input<Date | null>(null);\n /** BCP 47 locale for the displayed dates, month title and weekday headers */\n readonly locale = input('de-DE');\n\n /** Accessible name of the clear button. */\n readonly clearAriaLabel = input('Clear');\n\n /** Accessible name of the previous-month button. */\n readonly previousMonthAriaLabel = input('Previous month');\n\n /** Accessible name of the next-month button. */\n readonly nextMonthAriaLabel = input('Next month');\n\n readonly rangeChange = output<DateRange>();\n\n protected isOpen = signal(false);\n protected range = signal<DateRange>({ start: null, end: null });\n protected selecting = signal<'start' | 'end'>('start');\n protected hoveredDate = signal<Date | null>(null);\n protected viewingMonth = signal(new Date());\n\n /** Disabled via `setDisabledState` (reactive forms) */\n private readonly formDisabled = signal(false);\n\n /** Effective disabled state: `disabled` input OR form control disabled */\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n\n private onChange: (val: DateRange) => void = () => { /* set by registerOnChange */ };\n private onTouched: () => void = () => { /* set by registerOnTouched */ };\n\n protected readonly displayValue = computed(() => {\n const r = this.range();\n if (!r.start) return '';\n const locale = this.locale();\n const fmt = (d: Date) => d.toLocaleDateString(locale, { day: '2-digit', month: '2-digit', year: 'numeric' });\n if (!r.end) return fmt(r.start) + ' – …';\n return `${fmt(r.start)} – ${fmt(r.end)}`;\n });\n\n protected readonly monthLabel = computed(() => {\n const d = this.viewingMonth();\n return d.toLocaleDateString(this.locale(), { month: 'long', year: 'numeric' });\n });\n\n /** Monday-first weekday headers in the configured locale (e.g. Mo…So / Mon…Sun) */\n protected readonly weekdays = computed(() => {\n const locale = this.locale();\n // some ICU builds abbreviate with a trailing period (\"Mo.\") — keep the compact form\n return REFERENCE_WEEK.map((d) => d.toLocaleDateString(locale, { weekday: 'short' }).replace(/\\.$/, ''));\n });\n\n protected readonly calendarDays = computed(() => {\n const viewing = this.viewingMonth();\n const locale = this.locale();\n const year = viewing.getFullYear();\n const month = viewing.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n\n let startDow = firstDay.getDay();\n if (startDow === 0) startDow = 7; // Monday = 1\n const prefixDays = startDow - 1;\n\n const days: { date: Date; inMonth: boolean; disabled: boolean; ariaLabel: string }[] = [];\n const push = (date: Date, inMonth: boolean) =>\n days.push({\n date,\n inMonth,\n disabled: this.isDateDisabled(date),\n ariaLabel: date.toLocaleDateString(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }),\n });\n\n for (let i = prefixDays; i > 0; i--) {\n push(new Date(year, month, 1 - i), false);\n }\n\n for (let d = 1; d <= lastDay.getDate(); d++) {\n push(new Date(year, month, d), true);\n }\n\n const remaining = 42 - days.length;\n for (let i = 1; i <= remaining; i++) {\n push(new Date(year, month + 1, i), false);\n }\n\n return days;\n });\n\n constructor() {\n // Move focus into the panel once it is rendered so keyboard users land on\n // the calendar instead of having to tab through the trigger's siblings.\n afterRenderEffect(() => {\n if (!this.isOpen()) return;\n untracked(() => {\n const panel = this.panelEl()?.nativeElement;\n if (!panel || panel.contains(document.activeElement)) return;\n const target =\n panel.querySelector<HTMLButtonElement>('.lc-drp__day--start:not(:disabled)') ??\n panel.querySelector<HTMLButtonElement>('.lc-drp__day--today:not(:disabled)') ??\n panel.querySelector<HTMLButtonElement>('.lc-drp__day:not(.lc-drp__day--outside):not(:disabled)');\n target?.focus();\n });\n });\n }\n\n writeValue(value: DateRange | null): void {\n this.range.set(value ?? { start: null, end: null });\n if (value?.start) {\n this.viewingMonth.set(new Date(value.start.getFullYear(), value.start.getMonth(), 1));\n }\n }\n\n registerOnChange(fn: (val: DateRange) => void): void { this.onChange = fn; }\n registerOnTouched(fn: () => void): void { this.onTouched = fn; }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n if (isDisabled) this.isOpen.set(false);\n }\n\n protected toggle(): void {\n if (this.isDisabled()) return;\n if (this.isOpen()) {\n this.close();\n return;\n }\n this.selecting.set('start');\n this.hoveredDate.set(null);\n this.isOpen.set(true);\n }\n\n protected close(): void {\n if (!this.isOpen()) return;\n this.isOpen.set(false);\n this.onTouched();\n // Return focus to the trigger when it was inside the (now removed) panel\n if (this.elRef.nativeElement.contains(document.activeElement)) {\n this.triggerEl()?.nativeElement.focus();\n }\n }\n\n /** Escape (from the trigger or anywhere in the panel) closes the picker */\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.isOpen()) {\n this.close();\n // consumed here — an enclosing modal/drawer must not close as well\n event.stopPropagation();\n event.preventDefault();\n }\n }\n\n @HostListener('document:click', ['$event'])\n protected onDocumentClick(event: MouseEvent): void {\n if (this.isOpen() && !this.elRef.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n protected prevMonth(): void {\n this.viewingMonth.update(d => new Date(d.getFullYear(), d.getMonth() - 1, 1));\n }\n\n protected nextMonth(): void {\n this.viewingMonth.update(d => new Date(d.getFullYear(), d.getMonth() + 1, 1));\n }\n\n protected selectDate(date: Date): void {\n if (this.isDateDisabled(date)) return;\n\n const current = this.range();\n if (this.selecting() === 'start') {\n this.range.set({ start: date, end: null });\n this.selecting.set('end');\n } else {\n if (date < current.start!) {\n this.range.set({ start: date, end: current.start });\n } else {\n this.range.set({ start: current.start, end: date });\n }\n this.selecting.set('start');\n this.emitRange();\n this.close();\n }\n }\n\n protected onDayHover(date: Date): void {\n if (this.selecting() === 'end') {\n this.hoveredDate.set(date);\n }\n }\n\n protected isStart(date: Date): boolean {\n return this.sameDay(date, this.range().start);\n }\n\n protected isEnd(date: Date): boolean {\n return this.sameDay(date, this.range().end);\n }\n\n protected isInRange(date: Date): boolean {\n const r = this.range();\n if (!r.start) return false;\n const end = r.end || this.hoveredDate();\n if (!end) return false;\n const s = Math.min(r.start.getTime(), end.getTime());\n const e = Math.max(r.start.getTime(), end.getTime());\n const t = date.getTime();\n return t > s && t < e;\n }\n\n protected isToday(date: Date): boolean {\n return this.sameDay(date, new Date());\n }\n\n protected clearRange(event: Event): void {\n event.stopPropagation();\n if (this.isDisabled()) return;\n this.range.set({ start: null, end: null });\n const r = { start: null, end: null };\n this.onChange(r);\n this.rangeChange.emit(r);\n }\n\n /** min/max are compared by calendar day — `minDate = new Date()` keeps today selectable */\n private isDateDisabled(date: Date): boolean {\n const min = this.minDate();\n const max = this.maxDate();\n const day = this.dayStamp(date);\n if (min && day < this.dayStamp(min)) return true;\n if (max && day > this.dayStamp(max)) return true;\n return false;\n }\n\n private dayStamp(d: Date): number {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n }\n\n private sameDay(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n }\n\n private emitRange(): void {\n const r = this.range();\n this.onChange(r);\n this.rangeChange.emit(r);\n }\n}\n","@if (label()) {\n <label class=\"lc-drp__label\" [id]=\"labelId\" [for]=\"triggerId\">{{ label() }}</label>\n}\n\n<!-- The clear button must not be nested inside the trigger button, so the\n bordered \"field\" wraps both. -->\n<div class=\"lc-drp__field\" [class.lc-drp__field--disabled]=\"isDisabled()\">\n <button\n #triggerEl\n type=\"button\"\n class=\"lc-drp__trigger\"\n [id]=\"triggerId\"\n [class.lc-drp__trigger--disabled]=\"isDisabled()\"\n [disabled]=\"isDisabled()\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId : null\"\n [attr.aria-labelledby]=\"label() ? labelId + ' ' + valueId : null\"\n (click)=\"toggle()\"\n >\n <lc-icon class=\"lc-drp__icon\" name=\"calendar\" size=\"sm\" [decorative]=\"true\" />\n <span class=\"lc-drp__value\" [id]=\"valueId\" [class.lc-drp__value--placeholder]=\"!displayValue()\">\n {{ displayValue() || placeholder() }}\n </span>\n </button>\n @if (displayValue() && !isDisabled()) {\n <button type=\"button\" class=\"lc-drp__clear\" (click)=\"clearRange($event)\" [attr.aria-label]=\"clearAriaLabel()\">×</button>\n }\n</div>\n\n@if (isOpen()) {\n <div\n #panelEl\n class=\"lc-drp__dropdown\"\n role=\"dialog\"\n [id]=\"panelId\"\n [attr.aria-label]=\"label() || placeholder()\"\n >\n <div class=\"lc-drp__header\">\n <button type=\"button\" class=\"lc-drp__nav\" [attr.aria-label]=\"previousMonthAriaLabel()\" (click)=\"prevMonth()\">‹</button>\n <span class=\"lc-drp__month\" aria-live=\"polite\">{{ monthLabel() }}</span>\n <button type=\"button\" class=\"lc-drp__nav\" [attr.aria-label]=\"nextMonthAriaLabel()\" (click)=\"nextMonth()\">›</button>\n </div>\n\n <div class=\"lc-drp__weekdays\" aria-hidden=\"true\">\n @for (wd of weekdays(); track $index) {\n <span class=\"lc-drp__weekday\">{{ wd }}</span>\n }\n </div>\n\n <div class=\"lc-drp__grid\">\n @for (day of calendarDays(); track day.date.getTime()) {\n <button\n type=\"button\"\n class=\"lc-drp__day\"\n [class.lc-drp__day--outside]=\"!day.inMonth\"\n [class.lc-drp__day--disabled]=\"day.disabled\"\n [class.lc-drp__day--today]=\"isToday(day.date)\"\n [class.lc-drp__day--start]=\"isStart(day.date)\"\n [class.lc-drp__day--end]=\"isEnd(day.date)\"\n [class.lc-drp__day--in-range]=\"isInRange(day.date)\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-pressed]=\"isStart(day.date) || isEnd(day.date)\"\n (click)=\"selectDate(day.date)\"\n (mouseenter)=\"onDayHover(day.date)\"\n >{{ day.date.getDate() }}</button>\n }\n </div>\n\n <div class=\"lc-drp__footer\">\n <span class=\"lc-drp__hint\" aria-live=\"polite\">\n @if (selecting() === 'start') { Select start date }\n @else { Select end date }\n </span>\n </div>\n </div>\n}\n"],"mappings":"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"}
@@ -529,7 +529,7 @@ var DatepickerComponent = class DatepickerComponent {
529
529
  }],
530
530
  ngImport: i0,
531
531
  template: "<div class=\"lc-datepicker-wrapper\">\n <div class=\"lc-datepicker-input-wrapper\">\n <input\n #datepickerInput\n type=\"text\"\n [id]=\"inputId\"\n [class]=\"datepickerClasses()\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n autocomplete=\"off\"\n [attr.aria-expanded]=\"isOpen() ? 'true' : 'false'\"\n [attr.aria-controls]=\"isOpen() ? inputId + '-calendar' : null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [placeholder]=\"placeholder()\"\n [value]=\"inputValue()\"\n (input)=\"onInputChange(getInputValue($event))\"\n (click)=\"toggle()\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onBlur()\"\n />\n <div class=\"lc-datepicker-icons\">\n @if (selectedDate() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"lc-datepicker-clear\"\n (click)=\"clear(); $event.stopPropagation()\"\n [attr.aria-label]=\"clearAriaLabel()\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\"\n />\n </svg>\n </button>\n }\n <svg\n class=\"lc-datepicker-calendar-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M5.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H6a.75.75 0 01-.75-.75V12zM6 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H6zM7.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H8a.75.75 0 01-.75-.75V12zM8 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H8zM9.25 10a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H10a.75.75 0 01-.75-.75V10zM10 11.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V12a.75.75 0 00-.75-.75H10zM9.25 14a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H10a.75.75 0 01-.75-.75V14zM12 9.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V10a.75.75 0 00-.75-.75H12zM11.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H12a.75.75 0 01-.75-.75V12zM12 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H12zM13.25 10a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H14a.75.75 0 01-.75-.75V10zM14 11.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V12a.75.75 0 00-.75-.75H14z\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M5.75 2a.75.75 0 01.75.75V4h7V2.75a.75.75 0 011.5 0V4h.25A2.75 2.75 0 0118 6.75v8.5A2.75 2.75 0 0115.25 18H4.75A2.75 2.75 0 012 15.25v-8.5A2.75 2.75 0 014.75 4H5V2.75A.75.75 0 015.75 2zm-1 5.5c-.69 0-1.25.56-1.25 1.25v6.5c0 .69.56 1.25 1.25 1.25h10.5c.69 0 1.25-.56 1.25-1.25v-6.5c0-.69-.56-1.25-1.25-1.25H4.75z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n </div>\n\n <!-- Calendar Panel -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"datepickerInput\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n (backdropClick)=\"onClickOutside()\"\n (detach)=\"close()\"\n >\n <div\n #calendarPanel\n class=\"lc-datepicker-calendar\"\n [class.lc-datepicker-calendar--open]=\"isOpen()\"\n [id]=\"inputId + '-calendar'\"\n role=\"dialog\"\n [attr.aria-label]=\"dialogAriaLabel()\"\n >\n <!-- Calendar Header -->\n <div class=\"lc-datepicker-header\">\n <button\n type=\"button\"\n class=\"lc-datepicker-nav-button\"\n (click)=\"previousMonth()\"\n [attr.aria-label]=\"previousMonthAriaLabel()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n fill-rule=\"evenodd\"\n d=\"M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n \n <div class=\"lc-datepicker-month-year\" aria-live=\"polite\">\n {{ currentMonthName() }} {{ currentYear() }}\n </div>\n \n <button\n type=\"button\"\n class=\"lc-datepicker-nav-button\"\n (click)=\"nextMonth()\"\n [attr.aria-label]=\"nextMonthAriaLabel()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n fill-rule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Quick Actions -->\n <div class=\"lc-datepicker-quick-actions\">\n <button\n type=\"button\"\n class=\"lc-datepicker-today-button\"\n (click)=\"goToToday()\"\n >\n {{ todayLabel() }}\n </button>\n </div>\n\n <!-- Weekday Headers -->\n <div class=\"lc-datepicker-weekdays\" aria-hidden=\"true\">\n @for (day of weekdayLabels(); track $index) {\n <div class=\"lc-datepicker-weekday\">{{ day }}</div>\n }\n </div>\n\n <!-- Calendar Days -->\n <div class=\"lc-datepicker-days\">\n @for (date of generateCalendarDays(); track date.getTime()) {\n <button\n type=\"button\"\n class=\"lc-datepicker-day\"\n [class.lc-datepicker-day--other-month]=\"!isCurrentMonth(date)\"\n [class.lc-datepicker-day--today]=\"isToday(date)\"\n [class.lc-datepicker-day--selected]=\"isSelectedDate(date)\"\n [class.lc-datepicker-day--disabled]=\"isDateDisabled(date)\"\n [disabled]=\"isDateDisabled(date)\"\n [attr.aria-current]=\"isToday(date) ? 'date' : null\"\n [attr.aria-label]=\"dayAriaLabel(date)\"\n (click)=\"selectDate(date)\"\n >\n {{ date.getDate() }}\n </button>\n }\n </div>\n </div>\n </ng-template>\n\n <!-- Helper/Error Text -->\n @if (error() && errorMessage()) {\n <div class=\"lc-datepicker__error\" [id]=\"inputId + '-error'\" role=\"alert\">\n {{ errorMessage() }}\n </div>\n } @else if (helperText()) {\n <div class=\"lc-datepicker__helper\" [id]=\"inputId + '-helper'\">\n {{ helperText() }}\n </div>\n }\n</div>\n",
532
- styles: [".lc-datepicker-wrapper{display:flex;flex-direction:column;gap:var(--lc-density-gap-xs, var(--spacing-1));width:100%;position:relative}.lc-datepicker-input-wrapper{position:relative;width:100%}.lc-datepicker{width:100%;font-family:var(--font-family-sans);font-weight:var(--font-weight-regular);line-height:var(--line-height-normal);color:var(--color-text-primary);background-color:var(--color-surface);border:1px solid var(--color-field-border);border-radius:var(--border-radius-md);transition:all var(--animation-duration-base) var(--animation-timing-ease);cursor:text}.lc-datepicker::placeholder{color:var(--color-text-secondary)}.lc-datepicker:hover:not(:disabled):not([readonly]){border-color:var(--color-primary-400)}.lc-datepicker:focus{outline:2px solid var(--color-primary-500);outline-offset:0px;border-color:var(--color-primary-500)}.lc-datepicker:disabled{background-color:var(--color-surface-muted);border-color:var(--color-border);cursor:not-allowed;opacity:.6}.lc-datepicker[readonly]{background-color:var(--color-surface-muted);cursor:default}.lc-datepicker.lc-datepicker--error{border-color:var(--color-error-600)}.lc-datepicker.lc-datepicker--error:focus{outline-color:var(--color-error-600);border-color:var(--color-error-600)}.lc-datepicker.lc-datepicker--xs{height:var(--size-interactive-xs-height);padding:var(--size-interactive-xs-padding);padding-right:var(--spacing-10);font-size:var(--size-interactive-xs-font-size)}.lc-datepicker.lc-datepicker--sm{height:var(--size-interactive-sm-height);padding:var(--size-interactive-sm-padding);padding-right:var(--spacing-12);font-size:var(--size-interactive-sm-font-size)}.lc-datepicker.lc-datepicker--md{height:var(--size-interactive-md-height);padding:var(--size-interactive-md-padding);padding-right:var(--spacing-14);font-size:var(--size-interactive-md-font-size)}.lc-datepicker.lc-datepicker--lg{height:var(--size-interactive-lg-height);padding:var(--size-interactive-lg-padding);padding-right:var(--spacing-16);font-size:var(--size-interactive-lg-font-size)}.lc-datepicker.lc-datepicker--filled{background-color:var(--color-surface-sunken);border-color:transparent}.lc-datepicker.lc-datepicker--filled:hover:not(:disabled):not([readonly]){background-color:var(--color-surface-hover);border-color:var(--color-border)}.lc-datepicker.lc-datepicker--filled:focus{background-color:var(--color-surface);border-color:var(--color-primary-500)}.lc-datepicker.lc-datepicker--filled:disabled{background-color:var(--color-surface-muted)}.lc-datepicker-icons{position:absolute;right:var(--spacing-3);top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:var(--spacing-1);pointer-events:none}.lc-datepicker-calendar-icon{width:1.25rem;height:1.25rem;color:var(--color-text-secondary)}.lc-datepicker-clear{pointer-events:auto;display:flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;padding:0;background:none;border:none;border-radius:var(--border-radius-sm);color:var(--color-text-secondary);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-clear:hover{color:var(--color-text-primary);background-color:var(--color-surface-hover)}.lc-datepicker-clear:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-clear svg{width:1rem;height:1rem}.lc-datepicker-calendar{position:absolute;z-index:1000;margin-top:var(--spacing-1);padding:var(--lc-density-padding-md, var(--spacing-4));background-color:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--border-radius-lg);box-shadow:var(--elevation-3);min-width:280px;opacity:0;transform:translateY(-8px);transition:all var(--animation-duration-base) var(--animation-timing-ease);pointer-events:none}.lc-datepicker-calendar.lc-datepicker-calendar--open{opacity:1;transform:translateY(0);pointer-events:auto}.lc-datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--spacing-4)}.lc-datepicker-month-year{font-size:var(--font-size-base);font-weight:var(--font-weight-semibold);color:var(--color-text-primary)}.lc-datepicker-nav-button{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;background:none;border:none;border-radius:var(--border-radius-md);color:var(--color-text-secondary);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-nav-button:hover{background-color:var(--color-surface-hover);color:var(--color-text-primary)}.lc-datepicker-nav-button:active{background-color:var(--color-surface-sunken)}.lc-datepicker-nav-button:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-nav-button svg{width:1.25rem;height:1.25rem}.lc-datepicker-quick-actions{display:flex;justify-content:center;margin-bottom:var(--spacing-3)}.lc-datepicker-today-button{padding:var(--spacing-1) var(--spacing-3);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-primary-600);background:none;border:1px solid var(--color-primary-200);border-radius:var(--border-radius-md);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-today-button:hover{background-color:var(--color-primary-50);border-color:var(--color-primary-300)}.lc-datepicker-today-button:active{background-color:var(--color-primary-100)}.lc-datepicker-today-button:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--spacing-1);margin-bottom:var(--spacing-2)}.lc-datepicker-weekday{font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);color:var(--color-text-secondary);text-align:center;padding:var(--spacing-1)}.lc-datepicker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--spacing-1)}.lc-datepicker-day{display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;padding:0;font-size:var(--font-size-sm);font-weight:var(--font-weight-regular);color:var(--color-text-primary);background:none;border:none;border-radius:var(--border-radius-md);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-day:hover:not(:disabled){background-color:var(--color-surface-hover)}.lc-datepicker-day.lc-datepicker-day--other-month{color:var(--color-text-tertiary)}.lc-datepicker-day.lc-datepicker-day--today{font-weight:var(--font-weight-semibold);color:var(--color-primary-600);background-color:var(--color-primary-50)}.lc-datepicker-day.lc-datepicker-day--selected{font-weight:var(--font-weight-semibold);color:var(--color-on-primary);background-color:var(--color-primary-fill)}.lc-datepicker-day.lc-datepicker-day--selected:hover{background-color:var(--color-primary-fill-hover)}.lc-datepicker-day.lc-datepicker-day--disabled{color:var(--color-text-disabled);cursor:not-allowed;opacity:.5}.lc-datepicker-day.lc-datepicker-day--disabled:hover{background:none}.lc-datepicker-day:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px}.lc-datepicker__error{font-size:var(--font-size-xs);color:var(--color-error-600);margin-top:var(--spacing-1)}.lc-datepicker__helper{font-size:var(--font-size-xs);color:var(--color-text-secondary);margin-top:var(--spacing-1)}\n"],
532
+ styles: [".lc-datepicker-wrapper{display:flex;flex-direction:column;gap:var(--lc-density-gap-xs, var(--spacing-1));width:100%;position:relative}.lc-datepicker-input-wrapper{position:relative;width:100%}.lc-datepicker{width:100%;font-family:var(--font-family-sans);font-weight:var(--font-weight-regular);line-height:var(--line-height-normal);color:var(--color-text-primary);background-color:var(--color-surface);border:1px solid var(--color-field-border);border-radius:var(--border-radius-md);transition:all var(--animation-duration-base) var(--animation-timing-ease);cursor:text}.lc-datepicker::placeholder{color:var(--color-text-secondary)}.lc-datepicker:hover:not(:disabled):not([readonly]):not(:focus){border-color:var(--color-primary-400)}.lc-datepicker:focus{outline:2px solid var(--color-primary-500);outline-offset:0px;border-color:var(--color-primary-500)}.lc-datepicker:disabled{background-color:var(--color-surface-muted);border-color:var(--color-border);cursor:not-allowed;opacity:.6}.lc-datepicker[readonly]{background-color:var(--color-surface-muted);cursor:default}.lc-datepicker.lc-datepicker--error{border-color:var(--color-error-600)}.lc-datepicker.lc-datepicker--error:focus{outline-color:var(--color-error-600);border-color:var(--color-error-600)}.lc-datepicker.lc-datepicker--xs{height:var(--size-interactive-xs-height);padding:var(--size-interactive-xs-padding);padding-right:var(--spacing-10);font-size:var(--size-interactive-xs-font-size)}.lc-datepicker.lc-datepicker--sm{height:var(--size-interactive-sm-height);padding:var(--size-interactive-sm-padding);padding-right:var(--spacing-12);font-size:var(--size-interactive-sm-font-size)}.lc-datepicker.lc-datepicker--md{height:var(--size-interactive-md-height);padding:var(--size-interactive-md-padding);padding-right:var(--spacing-14);font-size:var(--size-interactive-md-font-size)}.lc-datepicker.lc-datepicker--lg{height:var(--size-interactive-lg-height);padding:var(--size-interactive-lg-padding);padding-right:var(--spacing-16);font-size:var(--size-interactive-lg-font-size)}.lc-datepicker.lc-datepicker--filled{background-color:var(--color-surface-sunken);border-color:transparent}.lc-datepicker.lc-datepicker--filled:hover:not(:disabled):not([readonly]):not(:focus){background-color:var(--color-surface-hover);border-color:var(--color-border)}.lc-datepicker.lc-datepicker--filled:focus{background-color:var(--color-surface);border-color:var(--color-primary-500)}.lc-datepicker.lc-datepicker--filled:disabled{background-color:var(--color-surface-muted)}.lc-datepicker-icons{position:absolute;right:var(--spacing-3);top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:var(--spacing-1);pointer-events:none}.lc-datepicker-calendar-icon{width:1.25rem;height:1.25rem;color:var(--color-text-secondary)}.lc-datepicker-clear{pointer-events:auto;display:flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;padding:0;background:none;border:none;border-radius:var(--border-radius-sm);color:var(--color-text-secondary);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-clear:hover{color:var(--color-text-primary);background-color:var(--color-surface-hover)}.lc-datepicker-clear:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-clear svg{width:1rem;height:1rem}.lc-datepicker-calendar{position:absolute;z-index:1000;margin-top:var(--spacing-1);padding:var(--lc-density-padding-md, var(--spacing-4));background-color:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--border-radius-lg);box-shadow:var(--elevation-3);min-width:280px;opacity:0;transform:translateY(-8px);transition:all var(--animation-duration-base) var(--animation-timing-ease);pointer-events:none}.lc-datepicker-calendar.lc-datepicker-calendar--open{opacity:1;transform:translateY(0);pointer-events:auto}.lc-datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--spacing-4)}.lc-datepicker-month-year{font-size:var(--font-size-base);font-weight:var(--font-weight-semibold);color:var(--color-text-primary)}.lc-datepicker-nav-button{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;background:none;border:none;border-radius:var(--border-radius-md);color:var(--color-text-secondary);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-nav-button:hover{background-color:var(--color-surface-hover);color:var(--color-text-primary)}.lc-datepicker-nav-button:active{background-color:var(--color-surface-sunken)}.lc-datepicker-nav-button:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-nav-button svg{width:1.25rem;height:1.25rem}.lc-datepicker-quick-actions{display:flex;justify-content:center;margin-bottom:var(--spacing-3)}.lc-datepicker-today-button{padding:var(--spacing-1) var(--spacing-3);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-primary-600);background:none;border:1px solid var(--color-primary-200);border-radius:var(--border-radius-md);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-today-button:hover{background-color:var(--color-primary-50);border-color:var(--color-primary-300)}.lc-datepicker-today-button:active{background-color:var(--color-primary-100)}.lc-datepicker-today-button:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--spacing-1);margin-bottom:var(--spacing-2)}.lc-datepicker-weekday{font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);color:var(--color-text-secondary);text-align:center;padding:var(--spacing-1)}.lc-datepicker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--spacing-1)}.lc-datepicker-day{display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;padding:0;font-size:var(--font-size-sm);font-weight:var(--font-weight-regular);color:var(--color-text-primary);background:none;border:none;border-radius:var(--border-radius-md);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-day:hover:not(:disabled){background-color:var(--color-surface-hover)}.lc-datepicker-day.lc-datepicker-day--other-month{color:var(--color-text-tertiary)}.lc-datepicker-day.lc-datepicker-day--today{font-weight:var(--font-weight-semibold);color:var(--color-primary-600);background-color:var(--color-primary-50)}.lc-datepicker-day.lc-datepicker-day--selected{font-weight:var(--font-weight-semibold);color:var(--color-on-primary);background-color:var(--color-primary-fill)}.lc-datepicker-day.lc-datepicker-day--selected:hover{background-color:var(--color-primary-fill-hover)}.lc-datepicker-day.lc-datepicker-day--disabled{color:var(--color-text-disabled);cursor:not-allowed;opacity:.5}.lc-datepicker-day.lc-datepicker-day--disabled:hover{background:none}.lc-datepicker-day:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px}.lc-datepicker__error{font-size:var(--font-size-xs);color:var(--color-error-600);margin-top:var(--spacing-1)}.lc-datepicker__helper{font-size:var(--font-size-xs);color:var(--color-text-secondary);margin-top:var(--spacing-1)}\n"],
533
533
  dependencies: [{
534
534
  kind: "ngmodule",
535
535
  type: OverlayModule
@@ -595,7 +595,7 @@ i0.ɵɵngDeclareClassMetadata({
595
595
  multi: true
596
596
  }],
597
597
  template: "<div class=\"lc-datepicker-wrapper\">\n <div class=\"lc-datepicker-input-wrapper\">\n <input\n #datepickerInput\n type=\"text\"\n [id]=\"inputId\"\n [class]=\"datepickerClasses()\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n autocomplete=\"off\"\n [attr.aria-expanded]=\"isOpen() ? 'true' : 'false'\"\n [attr.aria-controls]=\"isOpen() ? inputId + '-calendar' : null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [placeholder]=\"placeholder()\"\n [value]=\"inputValue()\"\n (input)=\"onInputChange(getInputValue($event))\"\n (click)=\"toggle()\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onBlur()\"\n />\n <div class=\"lc-datepicker-icons\">\n @if (selectedDate() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"lc-datepicker-clear\"\n (click)=\"clear(); $event.stopPropagation()\"\n [attr.aria-label]=\"clearAriaLabel()\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\"\n />\n </svg>\n </button>\n }\n <svg\n class=\"lc-datepicker-calendar-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M5.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H6a.75.75 0 01-.75-.75V12zM6 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H6zM7.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H8a.75.75 0 01-.75-.75V12zM8 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H8zM9.25 10a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H10a.75.75 0 01-.75-.75V10zM10 11.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V12a.75.75 0 00-.75-.75H10zM9.25 14a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H10a.75.75 0 01-.75-.75V14zM12 9.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V10a.75.75 0 00-.75-.75H12zM11.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H12a.75.75 0 01-.75-.75V12zM12 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H12zM13.25 10a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H14a.75.75 0 01-.75-.75V10zM14 11.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V12a.75.75 0 00-.75-.75H14z\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M5.75 2a.75.75 0 01.75.75V4h7V2.75a.75.75 0 011.5 0V4h.25A2.75 2.75 0 0118 6.75v8.5A2.75 2.75 0 0115.25 18H4.75A2.75 2.75 0 012 15.25v-8.5A2.75 2.75 0 014.75 4H5V2.75A.75.75 0 015.75 2zm-1 5.5c-.69 0-1.25.56-1.25 1.25v6.5c0 .69.56 1.25 1.25 1.25h10.5c.69 0 1.25-.56 1.25-1.25v-6.5c0-.69-.56-1.25-1.25-1.25H4.75z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n </div>\n\n <!-- Calendar Panel -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"datepickerInput\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n (backdropClick)=\"onClickOutside()\"\n (detach)=\"close()\"\n >\n <div\n #calendarPanel\n class=\"lc-datepicker-calendar\"\n [class.lc-datepicker-calendar--open]=\"isOpen()\"\n [id]=\"inputId + '-calendar'\"\n role=\"dialog\"\n [attr.aria-label]=\"dialogAriaLabel()\"\n >\n <!-- Calendar Header -->\n <div class=\"lc-datepicker-header\">\n <button\n type=\"button\"\n class=\"lc-datepicker-nav-button\"\n (click)=\"previousMonth()\"\n [attr.aria-label]=\"previousMonthAriaLabel()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n fill-rule=\"evenodd\"\n d=\"M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n \n <div class=\"lc-datepicker-month-year\" aria-live=\"polite\">\n {{ currentMonthName() }} {{ currentYear() }}\n </div>\n \n <button\n type=\"button\"\n class=\"lc-datepicker-nav-button\"\n (click)=\"nextMonth()\"\n [attr.aria-label]=\"nextMonthAriaLabel()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n fill-rule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Quick Actions -->\n <div class=\"lc-datepicker-quick-actions\">\n <button\n type=\"button\"\n class=\"lc-datepicker-today-button\"\n (click)=\"goToToday()\"\n >\n {{ todayLabel() }}\n </button>\n </div>\n\n <!-- Weekday Headers -->\n <div class=\"lc-datepicker-weekdays\" aria-hidden=\"true\">\n @for (day of weekdayLabels(); track $index) {\n <div class=\"lc-datepicker-weekday\">{{ day }}</div>\n }\n </div>\n\n <!-- Calendar Days -->\n <div class=\"lc-datepicker-days\">\n @for (date of generateCalendarDays(); track date.getTime()) {\n <button\n type=\"button\"\n class=\"lc-datepicker-day\"\n [class.lc-datepicker-day--other-month]=\"!isCurrentMonth(date)\"\n [class.lc-datepicker-day--today]=\"isToday(date)\"\n [class.lc-datepicker-day--selected]=\"isSelectedDate(date)\"\n [class.lc-datepicker-day--disabled]=\"isDateDisabled(date)\"\n [disabled]=\"isDateDisabled(date)\"\n [attr.aria-current]=\"isToday(date) ? 'date' : null\"\n [attr.aria-label]=\"dayAriaLabel(date)\"\n (click)=\"selectDate(date)\"\n >\n {{ date.getDate() }}\n </button>\n }\n </div>\n </div>\n </ng-template>\n\n <!-- Helper/Error Text -->\n @if (error() && errorMessage()) {\n <div class=\"lc-datepicker__error\" [id]=\"inputId + '-error'\" role=\"alert\">\n {{ errorMessage() }}\n </div>\n } @else if (helperText()) {\n <div class=\"lc-datepicker__helper\" [id]=\"inputId + '-helper'\">\n {{ helperText() }}\n </div>\n }\n</div>\n",
598
- styles: [".lc-datepicker-wrapper{display:flex;flex-direction:column;gap:var(--lc-density-gap-xs, var(--spacing-1));width:100%;position:relative}.lc-datepicker-input-wrapper{position:relative;width:100%}.lc-datepicker{width:100%;font-family:var(--font-family-sans);font-weight:var(--font-weight-regular);line-height:var(--line-height-normal);color:var(--color-text-primary);background-color:var(--color-surface);border:1px solid var(--color-field-border);border-radius:var(--border-radius-md);transition:all var(--animation-duration-base) var(--animation-timing-ease);cursor:text}.lc-datepicker::placeholder{color:var(--color-text-secondary)}.lc-datepicker:hover:not(:disabled):not([readonly]){border-color:var(--color-primary-400)}.lc-datepicker:focus{outline:2px solid var(--color-primary-500);outline-offset:0px;border-color:var(--color-primary-500)}.lc-datepicker:disabled{background-color:var(--color-surface-muted);border-color:var(--color-border);cursor:not-allowed;opacity:.6}.lc-datepicker[readonly]{background-color:var(--color-surface-muted);cursor:default}.lc-datepicker.lc-datepicker--error{border-color:var(--color-error-600)}.lc-datepicker.lc-datepicker--error:focus{outline-color:var(--color-error-600);border-color:var(--color-error-600)}.lc-datepicker.lc-datepicker--xs{height:var(--size-interactive-xs-height);padding:var(--size-interactive-xs-padding);padding-right:var(--spacing-10);font-size:var(--size-interactive-xs-font-size)}.lc-datepicker.lc-datepicker--sm{height:var(--size-interactive-sm-height);padding:var(--size-interactive-sm-padding);padding-right:var(--spacing-12);font-size:var(--size-interactive-sm-font-size)}.lc-datepicker.lc-datepicker--md{height:var(--size-interactive-md-height);padding:var(--size-interactive-md-padding);padding-right:var(--spacing-14);font-size:var(--size-interactive-md-font-size)}.lc-datepicker.lc-datepicker--lg{height:var(--size-interactive-lg-height);padding:var(--size-interactive-lg-padding);padding-right:var(--spacing-16);font-size:var(--size-interactive-lg-font-size)}.lc-datepicker.lc-datepicker--filled{background-color:var(--color-surface-sunken);border-color:transparent}.lc-datepicker.lc-datepicker--filled:hover:not(:disabled):not([readonly]){background-color:var(--color-surface-hover);border-color:var(--color-border)}.lc-datepicker.lc-datepicker--filled:focus{background-color:var(--color-surface);border-color:var(--color-primary-500)}.lc-datepicker.lc-datepicker--filled:disabled{background-color:var(--color-surface-muted)}.lc-datepicker-icons{position:absolute;right:var(--spacing-3);top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:var(--spacing-1);pointer-events:none}.lc-datepicker-calendar-icon{width:1.25rem;height:1.25rem;color:var(--color-text-secondary)}.lc-datepicker-clear{pointer-events:auto;display:flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;padding:0;background:none;border:none;border-radius:var(--border-radius-sm);color:var(--color-text-secondary);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-clear:hover{color:var(--color-text-primary);background-color:var(--color-surface-hover)}.lc-datepicker-clear:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-clear svg{width:1rem;height:1rem}.lc-datepicker-calendar{position:absolute;z-index:1000;margin-top:var(--spacing-1);padding:var(--lc-density-padding-md, var(--spacing-4));background-color:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--border-radius-lg);box-shadow:var(--elevation-3);min-width:280px;opacity:0;transform:translateY(-8px);transition:all var(--animation-duration-base) var(--animation-timing-ease);pointer-events:none}.lc-datepicker-calendar.lc-datepicker-calendar--open{opacity:1;transform:translateY(0);pointer-events:auto}.lc-datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--spacing-4)}.lc-datepicker-month-year{font-size:var(--font-size-base);font-weight:var(--font-weight-semibold);color:var(--color-text-primary)}.lc-datepicker-nav-button{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;background:none;border:none;border-radius:var(--border-radius-md);color:var(--color-text-secondary);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-nav-button:hover{background-color:var(--color-surface-hover);color:var(--color-text-primary)}.lc-datepicker-nav-button:active{background-color:var(--color-surface-sunken)}.lc-datepicker-nav-button:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-nav-button svg{width:1.25rem;height:1.25rem}.lc-datepicker-quick-actions{display:flex;justify-content:center;margin-bottom:var(--spacing-3)}.lc-datepicker-today-button{padding:var(--spacing-1) var(--spacing-3);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-primary-600);background:none;border:1px solid var(--color-primary-200);border-radius:var(--border-radius-md);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-today-button:hover{background-color:var(--color-primary-50);border-color:var(--color-primary-300)}.lc-datepicker-today-button:active{background-color:var(--color-primary-100)}.lc-datepicker-today-button:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--spacing-1);margin-bottom:var(--spacing-2)}.lc-datepicker-weekday{font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);color:var(--color-text-secondary);text-align:center;padding:var(--spacing-1)}.lc-datepicker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--spacing-1)}.lc-datepicker-day{display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;padding:0;font-size:var(--font-size-sm);font-weight:var(--font-weight-regular);color:var(--color-text-primary);background:none;border:none;border-radius:var(--border-radius-md);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-day:hover:not(:disabled){background-color:var(--color-surface-hover)}.lc-datepicker-day.lc-datepicker-day--other-month{color:var(--color-text-tertiary)}.lc-datepicker-day.lc-datepicker-day--today{font-weight:var(--font-weight-semibold);color:var(--color-primary-600);background-color:var(--color-primary-50)}.lc-datepicker-day.lc-datepicker-day--selected{font-weight:var(--font-weight-semibold);color:var(--color-on-primary);background-color:var(--color-primary-fill)}.lc-datepicker-day.lc-datepicker-day--selected:hover{background-color:var(--color-primary-fill-hover)}.lc-datepicker-day.lc-datepicker-day--disabled{color:var(--color-text-disabled);cursor:not-allowed;opacity:.5}.lc-datepicker-day.lc-datepicker-day--disabled:hover{background:none}.lc-datepicker-day:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px}.lc-datepicker__error{font-size:var(--font-size-xs);color:var(--color-error-600);margin-top:var(--spacing-1)}.lc-datepicker__helper{font-size:var(--font-size-xs);color:var(--color-text-secondary);margin-top:var(--spacing-1)}\n"]
598
+ styles: [".lc-datepicker-wrapper{display:flex;flex-direction:column;gap:var(--lc-density-gap-xs, var(--spacing-1));width:100%;position:relative}.lc-datepicker-input-wrapper{position:relative;width:100%}.lc-datepicker{width:100%;font-family:var(--font-family-sans);font-weight:var(--font-weight-regular);line-height:var(--line-height-normal);color:var(--color-text-primary);background-color:var(--color-surface);border:1px solid var(--color-field-border);border-radius:var(--border-radius-md);transition:all var(--animation-duration-base) var(--animation-timing-ease);cursor:text}.lc-datepicker::placeholder{color:var(--color-text-secondary)}.lc-datepicker:hover:not(:disabled):not([readonly]):not(:focus){border-color:var(--color-primary-400)}.lc-datepicker:focus{outline:2px solid var(--color-primary-500);outline-offset:0px;border-color:var(--color-primary-500)}.lc-datepicker:disabled{background-color:var(--color-surface-muted);border-color:var(--color-border);cursor:not-allowed;opacity:.6}.lc-datepicker[readonly]{background-color:var(--color-surface-muted);cursor:default}.lc-datepicker.lc-datepicker--error{border-color:var(--color-error-600)}.lc-datepicker.lc-datepicker--error:focus{outline-color:var(--color-error-600);border-color:var(--color-error-600)}.lc-datepicker.lc-datepicker--xs{height:var(--size-interactive-xs-height);padding:var(--size-interactive-xs-padding);padding-right:var(--spacing-10);font-size:var(--size-interactive-xs-font-size)}.lc-datepicker.lc-datepicker--sm{height:var(--size-interactive-sm-height);padding:var(--size-interactive-sm-padding);padding-right:var(--spacing-12);font-size:var(--size-interactive-sm-font-size)}.lc-datepicker.lc-datepicker--md{height:var(--size-interactive-md-height);padding:var(--size-interactive-md-padding);padding-right:var(--spacing-14);font-size:var(--size-interactive-md-font-size)}.lc-datepicker.lc-datepicker--lg{height:var(--size-interactive-lg-height);padding:var(--size-interactive-lg-padding);padding-right:var(--spacing-16);font-size:var(--size-interactive-lg-font-size)}.lc-datepicker.lc-datepicker--filled{background-color:var(--color-surface-sunken);border-color:transparent}.lc-datepicker.lc-datepicker--filled:hover:not(:disabled):not([readonly]):not(:focus){background-color:var(--color-surface-hover);border-color:var(--color-border)}.lc-datepicker.lc-datepicker--filled:focus{background-color:var(--color-surface);border-color:var(--color-primary-500)}.lc-datepicker.lc-datepicker--filled:disabled{background-color:var(--color-surface-muted)}.lc-datepicker-icons{position:absolute;right:var(--spacing-3);top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:var(--spacing-1);pointer-events:none}.lc-datepicker-calendar-icon{width:1.25rem;height:1.25rem;color:var(--color-text-secondary)}.lc-datepicker-clear{pointer-events:auto;display:flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;padding:0;background:none;border:none;border-radius:var(--border-radius-sm);color:var(--color-text-secondary);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-clear:hover{color:var(--color-text-primary);background-color:var(--color-surface-hover)}.lc-datepicker-clear:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-clear svg{width:1rem;height:1rem}.lc-datepicker-calendar{position:absolute;z-index:1000;margin-top:var(--spacing-1);padding:var(--lc-density-padding-md, var(--spacing-4));background-color:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--border-radius-lg);box-shadow:var(--elevation-3);min-width:280px;opacity:0;transform:translateY(-8px);transition:all var(--animation-duration-base) var(--animation-timing-ease);pointer-events:none}.lc-datepicker-calendar.lc-datepicker-calendar--open{opacity:1;transform:translateY(0);pointer-events:auto}.lc-datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--spacing-4)}.lc-datepicker-month-year{font-size:var(--font-size-base);font-weight:var(--font-weight-semibold);color:var(--color-text-primary)}.lc-datepicker-nav-button{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;background:none;border:none;border-radius:var(--border-radius-md);color:var(--color-text-secondary);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-nav-button:hover{background-color:var(--color-surface-hover);color:var(--color-text-primary)}.lc-datepicker-nav-button:active{background-color:var(--color-surface-sunken)}.lc-datepicker-nav-button:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-nav-button svg{width:1.25rem;height:1.25rem}.lc-datepicker-quick-actions{display:flex;justify-content:center;margin-bottom:var(--spacing-3)}.lc-datepicker-today-button{padding:var(--spacing-1) var(--spacing-3);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-primary-600);background:none;border:1px solid var(--color-primary-200);border-radius:var(--border-radius-md);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-today-button:hover{background-color:var(--color-primary-50);border-color:var(--color-primary-300)}.lc-datepicker-today-button:active{background-color:var(--color-primary-100)}.lc-datepicker-today-button:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:1px}.lc-datepicker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--spacing-1);margin-bottom:var(--spacing-2)}.lc-datepicker-weekday{font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);color:var(--color-text-secondary);text-align:center;padding:var(--spacing-1)}.lc-datepicker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--spacing-1)}.lc-datepicker-day{display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;padding:0;font-size:var(--font-size-sm);font-weight:var(--font-weight-regular);color:var(--color-text-primary);background:none;border:none;border-radius:var(--border-radius-md);cursor:pointer;transition:all var(--animation-duration-fast) var(--animation-timing-ease)}.lc-datepicker-day:hover:not(:disabled){background-color:var(--color-surface-hover)}.lc-datepicker-day.lc-datepicker-day--other-month{color:var(--color-text-tertiary)}.lc-datepicker-day.lc-datepicker-day--today{font-weight:var(--font-weight-semibold);color:var(--color-primary-600);background-color:var(--color-primary-50)}.lc-datepicker-day.lc-datepicker-day--selected{font-weight:var(--font-weight-semibold);color:var(--color-on-primary);background-color:var(--color-primary-fill)}.lc-datepicker-day.lc-datepicker-day--selected:hover{background-color:var(--color-primary-fill-hover)}.lc-datepicker-day.lc-datepicker-day--disabled{color:var(--color-text-disabled);cursor:not-allowed;opacity:.5}.lc-datepicker-day.lc-datepicker-day--disabled:hover{background:none}.lc-datepicker-day:focus-visible{outline:2px solid var(--color-primary-500);outline-offset:2px}.lc-datepicker__error{font-size:var(--font-size-xs);color:var(--color-error-600);margin-top:var(--spacing-1)}.lc-datepicker__helper{font-size:var(--font-size-xs);color:var(--color-text-secondary);margin-top:var(--spacing-1)}\n"]
599
599
  }]
600
600
  }],
601
601
  propDecorators: {
@@ -1 +1 @@
1
- {"version":3,"file":"lifecorner-angular-ui-kit-datepicker.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/datepicker/datepicker.component.ts","../../../../libs/angular-ui-kit/src/lib/datepicker/datepicker.component.html"],"sourcesContent":["import {\n Component,\n input,\n output,\n signal,\n computed,\n linkedSignal,\n ChangeDetectionStrategy,\n forwardRef,\n ElementRef,\n viewChild,\n inject,\n DOCUMENT,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { OverlayModule } from '@angular/cdk/overlay';\n\nexport type DateValue = Date | string | null;\n\n/**\n * Datepicker component for date selection with calendar overlay.\n *\n * Features:\n * - Calendar popup with month and year navigation\n * - Manual date entry in the configured format\n * - Min/max date constraints\n * - Disabled specific dates and weekends\n * - Configurable date format string\n * - Variant styles (outline, filled)\n * - Size presets (xs, sm, md, lg)\n * - Disabled and readonly states\n * - ControlValueAccessor integration for reactive forms\n *\n * @example\n * ```html\n * <lc-datepicker placeholder=\"Select date\" [(ngModel)]=\"selectedDate\" />\n * ```\n */\n@Component({\n selector: 'lc-datepicker',\n standalone: true,\n imports: [OverlayModule],\n templateUrl: './datepicker.component.html',\n styleUrl: './datepicker.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatepickerComponent),\n multi: true,\n },\n ],\n})\nexport class DatepickerComponent implements ControlValueAccessor {\n private static nextId = 0;\n\n /** Per-instance id for the input; helper/error text ids derive from it. */\n readonly inputId = `lc-datepicker-${++DatepickerComponent.nextId}`;\n\n private readonly datepickerInput = viewChild<ElementRef<HTMLInputElement>>('datepickerInput');\n private readonly calendarPanel = viewChild<ElementRef<HTMLElement>>('calendarPanel');\n\n /**\n * Visual variant of the datepicker\n */\n readonly variant = input<'outline' | 'filled'>('outline');\n\n /**\n * Size of the datepicker\n */\n readonly size = input<'xs' | 'sm' | 'md' | 'lg'>('md');\n\n /**\n * Whether the datepicker is disabled\n */\n readonly disabled = input<boolean>(false);\n\n /**\n * Whether the datepicker is in error state\n */\n readonly error = input<boolean>(false);\n\n /**\n * Whether the datepicker is required\n */\n readonly required = input<boolean>(false);\n\n /**\n * Whether the datepicker is readonly\n */\n readonly readonly = input<boolean>(false);\n\n /**\n * Placeholder text\n */\n readonly placeholder = input<string>('Select a date');\n\n /**\n * Helper text displayed below the datepicker\n */\n readonly helperText = input<string>('');\n\n /**\n * Error message displayed when error is true\n */\n readonly errorMessage = input<string>('');\n\n /**\n * ARIA label for accessibility\n */\n readonly ariaLabel = input<string | undefined>(undefined);\n\n /**\n * Date format string (e.g., 'YYYY-MM-DD', 'MM/DD/YYYY')\n */\n readonly format = input<string>('YYYY-MM-DD');\n\n /**\n * Minimum selectable date (compared by calendar day, time of day is ignored)\n */\n readonly minDate = input<Date | undefined>(undefined);\n\n /**\n * Maximum selectable date (compared by calendar day, time of day is ignored)\n */\n readonly maxDate = input<Date | undefined>(undefined);\n\n /**\n * Array of disabled dates\n */\n readonly disabledDates = input<Date[]>([]);\n\n /**\n * Whether to disable weekends\n */\n readonly disableWeekends = input<boolean>(false);\n\n /** BCP 47 locale for month and weekday names and the day buttons' accessible names (e.g. `'de-DE'`). Empty keeps the built-in English names. */\n readonly locale = input('');\n\n /** First column of the grid: 0 Sunday (default) … 6 Saturday — 1 for Monday. */\n readonly firstDayOfWeek = input(0);\n\n /** Accessible name of the clear button. */\n readonly clearAriaLabel = input('Clear date');\n\n /** Accessible name of the calendar dialog. */\n readonly dialogAriaLabel = input('Choose date');\n\n /** Accessible name of the previous-month button. */\n readonly previousMonthAriaLabel = input('Previous month');\n\n /** Accessible name of the next-month button. */\n readonly nextMonthAriaLabel = input('Next month');\n\n /** Label of the \"go to today\" button. */\n readonly todayLabel = input('Today');\n\n /** Appended to the selected day's accessible name (`…, selected`). */\n readonly selectedAriaLabel = input('selected');\n\n /**\n * Emitted when date selection changes\n */\n readonly dateChange = output<Date | null>();\n\n /**\n * Emitted when calendar opens\n */\n readonly opened = output<void>();\n\n /**\n * Emitted when calendar closes\n */\n readonly closed = output<void>();\n\n // Internal state\n readonly selectedDate = signal<Date | null>(null);\n readonly isOpen = signal<boolean>(false);\n readonly currentMonth = signal<number>(new Date().getMonth());\n readonly currentYear = signal<number>(new Date().getFullYear());\n\n /** Disabled state pushed in by the forms API (setDisabledState). */\n private readonly formDisabled = signal<boolean>(false);\n\n /** Effective disabled state: the `disabled` input OR the form control's disabled state. */\n readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n\n // Computed values\n readonly formattedDate = computed(() => {\n const date = this.selectedDate();\n if (!date) return '';\n return this.formatDate(date, this.format());\n });\n\n /**\n * Text currently shown in the input. Follows the selected date, but the user\n * can type freely; only a complete, valid date is committed to the model.\n */\n readonly inputValue = linkedSignal(() => this.formattedDate());\n\n weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n\n monthNames = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n\n /** Month name in the header: `locale` when set, the English names otherwise. */\n readonly currentMonthName = computed(() => {\n const locale = this.locale();\n return locale\n ? new Date(this.currentYear(), this.currentMonth(), 1).toLocaleDateString(locale, { month: 'long' })\n : this.monthNames[this.currentMonth()];\n });\n\n /** Weekday headers in grid order, starting at `firstDayOfWeek`. */\n readonly weekdayLabels = computed(() => {\n const locale = this.locale();\n const first = this.gridStart();\n // 1 Jan 2023 was a Sunday, so day d of that week has getDay() === d.\n const names = locale\n ? Array.from({ length: 7 }, (_, d) =>\n new Date(2023, 0, 1 + d).toLocaleDateString(locale, { weekday: 'short' }).replace(/\\.$/, ''),\n )\n : this.weekDays;\n return Array.from({ length: 7 }, (_, i) => names[(first + i) % 7]);\n });\n\n /** `firstDayOfWeek` clamped to 0–6. */\n private readonly gridStart = computed(() => {\n const day = Math.trunc(Number(this.firstDayOfWeek()));\n return Number.isFinite(day) ? ((day % 7) + 7) % 7 : 0;\n });\n\n /** id of the helper/error text the input is described by (aria-describedby) */\n readonly describedBy = computed(() => {\n if (this.error() && this.errorMessage()) {\n return `${this.inputId}-error`;\n }\n return this.helperText() ? `${this.inputId}-helper` : null;\n });\n\n /**\n * Computed classes for the datepicker input element\n */\n readonly datepickerClasses = computed(() => {\n const classes = [\n 'lc-datepicker',\n `lc-datepicker--${this.variant()}`,\n `lc-datepicker--${this.size()}`,\n ];\n\n if (this.isDisabled()) {\n classes.push('lc-datepicker--disabled');\n }\n\n if (this.error()) {\n classes.push('lc-datepicker--error');\n }\n\n if (this.readonly()) {\n classes.push('lc-datepicker--readonly');\n }\n\n if (this.isOpen()) {\n classes.push('lc-datepicker--open');\n }\n\n return classes.join(' ');\n });\n\n // Private properties\n private readonly document = inject(DOCUMENT);\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onChange: (value: Date | null) => void = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onTouched: () => void = () => {};\n\n // Public methods\n /**\n * Toggle calendar open/closed\n */\n toggle(): void {\n if (this.isDisabled() || this.readonly()) {\n return;\n }\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Open calendar\n */\n open(): void {\n if (this.isDisabled() || this.readonly() || this.isOpen()) {\n return;\n }\n this.isOpen.set(true);\n\n // Set calendar to selected date's month/year or current\n const date = this.selectedDate();\n if (date) {\n this.showMonthOf(date);\n }\n\n this.opened.emit();\n }\n\n /**\n * Close calendar. Idempotent: the overlay's `detach` re-enters here after\n * `isOpen` flips, and that second call must not emit `closed` again.\n */\n close(): void {\n if (!this.isOpen()) {\n return;\n }\n // A day button inside the panel may hold focus; it is about to be removed,\n // so hand focus back to the input instead of letting it drop to <body>.\n this.restoreFocusFromPanel();\n this.isOpen.set(false);\n this.closed.emit();\n }\n\n /**\n * Select a date\n */\n selectDate(date: Date): void {\n if (this.isDisabled() || this.readonly() || this.isDateDisabled(date)) {\n return;\n }\n\n this.commitDate(date);\n this.close();\n }\n\n /**\n * Clear selected date\n */\n clear(): void {\n this.selectedDate.set(null);\n this.inputValue.set('');\n this.onChange(null);\n this.dateChange.emit(null);\n }\n\n /**\n * Check if a date is disabled\n */\n isDateDisabled(date: Date): boolean {\n // min/max are compared by calendar day: consumers typically pass `new Date()`\n // (which carries the current time) while calendar cells sit at midnight.\n const day = this.startOfDay(date);\n\n const min = this.minDate();\n if (min && day < this.startOfDay(min)) {\n return true;\n }\n\n const max = this.maxDate();\n if (max && day > this.startOfDay(max)) {\n return true;\n }\n\n // Check disabled dates\n if (this.disabledDates().some((d) => this.isSameDate(d, date))) {\n return true;\n }\n\n // Check weekends\n if (this.disableWeekends()) {\n const weekday = date.getDay();\n if (weekday === 0 || weekday === 6) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Check if date is today\n */\n isToday(date: Date): boolean {\n const today = new Date();\n return this.isSameDate(date, today);\n }\n\n /** Accessible name of a day button: the full date, plus `selectedAriaLabel` when selected. */\n protected dayAriaLabel(date: Date): string {\n const locale = this.locale();\n const name = locale\n ? date.toLocaleDateString(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' })\n : date.toDateString();\n return this.isSelectedDate(date) ? `${name}, ${this.selectedAriaLabel()}` : name;\n }\n\n /**\n * Check if date is selected\n */\n isSelectedDate(date: Date): boolean {\n const selected = this.selectedDate();\n return selected ? this.isSameDate(date, selected) : false;\n }\n\n /**\n * Generate calendar days for current month\n */\n generateCalendarDays(): Date[] {\n const year = this.currentYear();\n const month = this.currentMonth();\n\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n\n const days: Date[] = [];\n\n // Add previous month's days, so the first column is `firstDayOfWeek`.\n const leadingDays = (firstDay.getDay() - this.gridStart() + 7) % 7;\n for (let i = leadingDays - 1; i >= 0; i--) {\n const date = new Date(year, month, -i);\n days.push(date);\n }\n\n // Add current month's days\n for (let i = 1; i <= lastDay.getDate(); i++) {\n days.push(new Date(year, month, i));\n }\n\n // Add next month's days to complete the grid\n const remainingDays = 42 - days.length; // 6 weeks * 7 days\n for (let i = 1; i <= remainingDays; i++) {\n days.push(new Date(year, month + 1, i));\n }\n\n return days.slice(0, 42); // Ensure exactly 42 days (6 weeks)\n }\n\n /**\n * Navigate to next month\n */\n nextMonth(): void {\n if (this.currentMonth() === 11) {\n this.currentMonth.set(0);\n this.currentYear.set(this.currentYear() + 1);\n } else {\n this.currentMonth.set(this.currentMonth() + 1);\n }\n }\n\n /**\n * Navigate to previous month\n */\n previousMonth(): void {\n if (this.currentMonth() === 0) {\n this.currentMonth.set(11);\n this.currentYear.set(this.currentYear() - 1);\n } else {\n this.currentMonth.set(this.currentMonth() - 1);\n }\n }\n\n /**\n * Navigate to today\n */\n goToToday(): void {\n this.showMonthOf(new Date());\n }\n\n /**\n * Handle input change (manual date entry). Partial input is kept as text\n * only; the model changes once the text is a complete, valid, selectable date.\n */\n onInputChange(value: string): void {\n this.inputValue.set(value);\n\n if (value.trim() === '') {\n if (this.selectedDate() !== null) {\n this.clear();\n }\n return;\n }\n\n const date = this.parseDate(value, this.format());\n if (date && !this.isDateDisabled(date) && !this.isSelectedDate(date)) {\n this.commitDate(date);\n this.showMonthOf(date);\n }\n }\n\n /**\n * Handle keyboard navigation\n */\n onKeyDown(event: KeyboardEvent): void {\n if (this.isDisabled() || this.readonly()) {\n return;\n }\n\n if (\n !this.isOpen() &&\n (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ')\n ) {\n this.open();\n event.preventDefault();\n return;\n }\n\n if (!this.isOpen()) return;\n\n // While the text differs from the model the user is mid-edit: arrows must\n // move the caret, not the calendar selection.\n const editing = this.inputValue() !== this.formattedDate();\n const currentDate = this.selectedDate() || new Date();\n let newDate: Date | null = null;\n\n switch (event.key) {\n case 'Escape':\n this.close();\n event.preventDefault();\n // Only this datepicker should react; keep the key from reaching enclosing overlays.\n event.stopPropagation();\n break;\n\n case 'ArrowRight':\n if (editing) break;\n newDate = new Date(currentDate);\n newDate.setDate(currentDate.getDate() + 1);\n event.preventDefault();\n break;\n\n case 'ArrowLeft':\n if (editing) break;\n newDate = new Date(currentDate);\n newDate.setDate(currentDate.getDate() - 1);\n event.preventDefault();\n break;\n\n case 'ArrowDown':\n if (editing) break;\n newDate = new Date(currentDate);\n newDate.setDate(currentDate.getDate() + 7);\n event.preventDefault();\n break;\n\n case 'ArrowUp':\n if (editing) break;\n newDate = new Date(currentDate);\n newDate.setDate(currentDate.getDate() - 7);\n event.preventDefault();\n break;\n\n case 'Enter': {\n const selected = this.selectedDate();\n if (selected) {\n this.selectDate(selected);\n }\n event.preventDefault();\n break;\n }\n }\n\n if (newDate && !this.isDateDisabled(newDate)) {\n this.selectedDate.set(newDate);\n this.showMonthOf(newDate);\n }\n }\n\n /**\n * Handle blur event: mark touched and drop any partial text that never became a date.\n */\n onBlur(): void {\n this.onTouched();\n this.inputValue.set(this.formattedDate());\n }\n\n /**\n * Handle click outside\n */\n onClickOutside(): void {\n this.close();\n }\n\n // ControlValueAccessor implementation\n writeValue(value: DateValue): void {\n let date: Date | null = null;\n if (value instanceof Date) {\n date = isNaN(value.getTime()) ? null : value;\n } else if (typeof value === 'string') {\n date = this.parseDate(value, this.format());\n }\n this.selectedDate.set(date);\n this.inputValue.set(this.formattedDate());\n }\n\n registerOnChange(fn: (value: Date | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n\n /**\n * Check if date is in current month\n */\n isCurrentMonth(date: Date): boolean {\n return date.getMonth() === this.currentMonth() && date.getFullYear() === this.currentYear();\n }\n\n // Private helper methods\n private commitDate(date: Date): void {\n this.selectedDate.set(date);\n this.inputValue.set(this.formatDate(date, this.format()));\n this.onChange(date);\n this.dateChange.emit(date);\n }\n\n private showMonthOf(date: Date): void {\n this.currentMonth.set(date.getMonth());\n this.currentYear.set(date.getFullYear());\n }\n\n private restoreFocusFromPanel(): void {\n const panel = this.calendarPanel()?.nativeElement;\n const active = this.document.activeElement;\n if (panel && active && panel.contains(active)) {\n this.datepickerInput()?.nativeElement.focus();\n }\n }\n\n private startOfDay(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n }\n\n /**\n * Check if two dates are the same day\n */\n private isSameDate(date1: Date, date2: Date): boolean {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n }\n\n private formatDate(date: Date, format: string): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return format.replace('YYYY', String(year)).replace('MM', month).replace('DD', day);\n }\n\n /**\n * Strict parse: the text must match the format's length, carry digits at the\n * YYYY/MM/DD positions and round-trip through formatDate (which rejects\n * things like month 13 or Feb 31 that `new Date` would silently roll over).\n * Returns null for partial or invalid input.\n */\n private parseDate(value: string, format: string): Date | null {\n if (value.length !== format.length) {\n return null;\n }\n\n const yearIndex = format.indexOf('YYYY');\n const monthIndex = format.indexOf('MM');\n const dayIndex = format.indexOf('DD');\n if (yearIndex < 0 || monthIndex < 0 || dayIndex < 0) {\n return null;\n }\n\n const yearText = value.substring(yearIndex, yearIndex + 4);\n const monthText = value.substring(monthIndex, monthIndex + 2);\n const dayText = value.substring(dayIndex, dayIndex + 2);\n if (!/^\\d{4}$/.test(yearText) || !/^\\d{2}$/.test(monthText) || !/^\\d{2}$/.test(dayText)) {\n return null;\n }\n\n const date = new Date(Number(yearText), Number(monthText) - 1, Number(dayText));\n return this.formatDate(date, format) === value ? date : null;\n }\n\n protected getInputValue(event: Event): string {\n return (event.target as HTMLInputElement).value;\n }\n}\n","<div class=\"lc-datepicker-wrapper\">\n <div class=\"lc-datepicker-input-wrapper\">\n <input\n #datepickerInput\n type=\"text\"\n [id]=\"inputId\"\n [class]=\"datepickerClasses()\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n autocomplete=\"off\"\n [attr.aria-expanded]=\"isOpen() ? 'true' : 'false'\"\n [attr.aria-controls]=\"isOpen() ? inputId + '-calendar' : null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [placeholder]=\"placeholder()\"\n [value]=\"inputValue()\"\n (input)=\"onInputChange(getInputValue($event))\"\n (click)=\"toggle()\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onBlur()\"\n />\n <div class=\"lc-datepicker-icons\">\n @if (selectedDate() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"lc-datepicker-clear\"\n (click)=\"clear(); $event.stopPropagation()\"\n [attr.aria-label]=\"clearAriaLabel()\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\"\n />\n </svg>\n </button>\n }\n <svg\n class=\"lc-datepicker-calendar-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M5.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H6a.75.75 0 01-.75-.75V12zM6 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H6zM7.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H8a.75.75 0 01-.75-.75V12zM8 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H8zM9.25 10a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H10a.75.75 0 01-.75-.75V10zM10 11.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V12a.75.75 0 00-.75-.75H10zM9.25 14a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H10a.75.75 0 01-.75-.75V14zM12 9.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V10a.75.75 0 00-.75-.75H12zM11.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H12a.75.75 0 01-.75-.75V12zM12 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H12zM13.25 10a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H14a.75.75 0 01-.75-.75V10zM14 11.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V12a.75.75 0 00-.75-.75H14z\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M5.75 2a.75.75 0 01.75.75V4h7V2.75a.75.75 0 011.5 0V4h.25A2.75 2.75 0 0118 6.75v8.5A2.75 2.75 0 0115.25 18H4.75A2.75 2.75 0 012 15.25v-8.5A2.75 2.75 0 014.75 4H5V2.75A.75.75 0 015.75 2zm-1 5.5c-.69 0-1.25.56-1.25 1.25v6.5c0 .69.56 1.25 1.25 1.25h10.5c.69 0 1.25-.56 1.25-1.25v-6.5c0-.69-.56-1.25-1.25-1.25H4.75z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n </div>\n\n <!-- Calendar Panel -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"datepickerInput\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n (backdropClick)=\"onClickOutside()\"\n (detach)=\"close()\"\n >\n <div\n #calendarPanel\n class=\"lc-datepicker-calendar\"\n [class.lc-datepicker-calendar--open]=\"isOpen()\"\n [id]=\"inputId + '-calendar'\"\n role=\"dialog\"\n [attr.aria-label]=\"dialogAriaLabel()\"\n >\n <!-- Calendar Header -->\n <div class=\"lc-datepicker-header\">\n <button\n type=\"button\"\n class=\"lc-datepicker-nav-button\"\n (click)=\"previousMonth()\"\n [attr.aria-label]=\"previousMonthAriaLabel()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n fill-rule=\"evenodd\"\n d=\"M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n \n <div class=\"lc-datepicker-month-year\" aria-live=\"polite\">\n {{ currentMonthName() }} {{ currentYear() }}\n </div>\n \n <button\n type=\"button\"\n class=\"lc-datepicker-nav-button\"\n (click)=\"nextMonth()\"\n [attr.aria-label]=\"nextMonthAriaLabel()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n fill-rule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Quick Actions -->\n <div class=\"lc-datepicker-quick-actions\">\n <button\n type=\"button\"\n class=\"lc-datepicker-today-button\"\n (click)=\"goToToday()\"\n >\n {{ todayLabel() }}\n </button>\n </div>\n\n <!-- Weekday Headers -->\n <div class=\"lc-datepicker-weekdays\" aria-hidden=\"true\">\n @for (day of weekdayLabels(); track $index) {\n <div class=\"lc-datepicker-weekday\">{{ day }}</div>\n }\n </div>\n\n <!-- Calendar Days -->\n <div class=\"lc-datepicker-days\">\n @for (date of generateCalendarDays(); track date.getTime()) {\n <button\n type=\"button\"\n class=\"lc-datepicker-day\"\n [class.lc-datepicker-day--other-month]=\"!isCurrentMonth(date)\"\n [class.lc-datepicker-day--today]=\"isToday(date)\"\n [class.lc-datepicker-day--selected]=\"isSelectedDate(date)\"\n [class.lc-datepicker-day--disabled]=\"isDateDisabled(date)\"\n [disabled]=\"isDateDisabled(date)\"\n [attr.aria-current]=\"isToday(date) ? 'date' : null\"\n [attr.aria-label]=\"dayAriaLabel(date)\"\n (click)=\"selectDate(date)\"\n >\n {{ date.getDate() }}\n </button>\n }\n </div>\n </div>\n </ng-template>\n\n <!-- Helper/Error Text -->\n @if (error() && errorMessage()) {\n <div class=\"lc-datepicker__error\" [id]=\"inputId + '-error'\" role=\"alert\">\n {{ errorMessage() }}\n </div>\n } @else if (helperText()) {\n <div class=\"lc-datepicker__helper\" [id]=\"inputId + '-helper'\">\n {{ helperText() }}\n </div>\n }\n</div>\n"],"mappings":"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"}
1
+ {"version":3,"file":"lifecorner-angular-ui-kit-datepicker.mjs","names":[],"sources":["../../../../libs/angular-ui-kit/src/lib/datepicker/datepicker.component.ts","../../../../libs/angular-ui-kit/src/lib/datepicker/datepicker.component.html"],"sourcesContent":["import {\n Component,\n input,\n output,\n signal,\n computed,\n linkedSignal,\n ChangeDetectionStrategy,\n forwardRef,\n ElementRef,\n viewChild,\n inject,\n DOCUMENT,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { OverlayModule } from '@angular/cdk/overlay';\n\nexport type DateValue = Date | string | null;\n\n/**\n * Datepicker component for date selection with calendar overlay.\n *\n * Features:\n * - Calendar popup with month and year navigation\n * - Manual date entry in the configured format\n * - Min/max date constraints\n * - Disabled specific dates and weekends\n * - Configurable date format string\n * - Variant styles (outline, filled)\n * - Size presets (xs, sm, md, lg)\n * - Disabled and readonly states\n * - ControlValueAccessor integration for reactive forms\n *\n * @example\n * ```html\n * <lc-datepicker placeholder=\"Select date\" [(ngModel)]=\"selectedDate\" />\n * ```\n */\n@Component({\n selector: 'lc-datepicker',\n standalone: true,\n imports: [OverlayModule],\n templateUrl: './datepicker.component.html',\n styleUrl: './datepicker.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatepickerComponent),\n multi: true,\n },\n ],\n})\nexport class DatepickerComponent implements ControlValueAccessor {\n private static nextId = 0;\n\n /** Per-instance id for the input; helper/error text ids derive from it. */\n readonly inputId = `lc-datepicker-${++DatepickerComponent.nextId}`;\n\n private readonly datepickerInput = viewChild<ElementRef<HTMLInputElement>>('datepickerInput');\n private readonly calendarPanel = viewChild<ElementRef<HTMLElement>>('calendarPanel');\n\n /**\n * Visual variant of the datepicker\n */\n readonly variant = input<'outline' | 'filled'>('outline');\n\n /**\n * Size of the datepicker\n */\n readonly size = input<'xs' | 'sm' | 'md' | 'lg'>('md');\n\n /**\n * Whether the datepicker is disabled\n */\n readonly disabled = input<boolean>(false);\n\n /**\n * Whether the datepicker is in error state\n */\n readonly error = input<boolean>(false);\n\n /**\n * Whether the datepicker is required\n */\n readonly required = input<boolean>(false);\n\n /**\n * Whether the datepicker is readonly\n */\n readonly readonly = input<boolean>(false);\n\n /**\n * Placeholder text\n */\n readonly placeholder = input<string>('Select a date');\n\n /**\n * Helper text displayed below the datepicker\n */\n readonly helperText = input<string>('');\n\n /**\n * Error message displayed when error is true\n */\n readonly errorMessage = input<string>('');\n\n /**\n * ARIA label for accessibility\n */\n readonly ariaLabel = input<string | undefined>(undefined);\n\n /**\n * Date format string (e.g., 'YYYY-MM-DD', 'MM/DD/YYYY')\n */\n readonly format = input<string>('YYYY-MM-DD');\n\n /**\n * Minimum selectable date (compared by calendar day, time of day is ignored)\n */\n readonly minDate = input<Date | undefined>(undefined);\n\n /**\n * Maximum selectable date (compared by calendar day, time of day is ignored)\n */\n readonly maxDate = input<Date | undefined>(undefined);\n\n /**\n * Array of disabled dates\n */\n readonly disabledDates = input<Date[]>([]);\n\n /**\n * Whether to disable weekends\n */\n readonly disableWeekends = input<boolean>(false);\n\n /** BCP 47 locale for month and weekday names and the day buttons' accessible names (e.g. `'de-DE'`). Empty keeps the built-in English names. */\n readonly locale = input('');\n\n /** First column of the grid: 0 Sunday (default) … 6 Saturday — 1 for Monday. */\n readonly firstDayOfWeek = input(0);\n\n /** Accessible name of the clear button. */\n readonly clearAriaLabel = input('Clear date');\n\n /** Accessible name of the calendar dialog. */\n readonly dialogAriaLabel = input('Choose date');\n\n /** Accessible name of the previous-month button. */\n readonly previousMonthAriaLabel = input('Previous month');\n\n /** Accessible name of the next-month button. */\n readonly nextMonthAriaLabel = input('Next month');\n\n /** Label of the \"go to today\" button. */\n readonly todayLabel = input('Today');\n\n /** Appended to the selected day's accessible name (`…, selected`). */\n readonly selectedAriaLabel = input('selected');\n\n /**\n * Emitted when date selection changes\n */\n readonly dateChange = output<Date | null>();\n\n /**\n * Emitted when calendar opens\n */\n readonly opened = output<void>();\n\n /**\n * Emitted when calendar closes\n */\n readonly closed = output<void>();\n\n // Internal state\n readonly selectedDate = signal<Date | null>(null);\n readonly isOpen = signal<boolean>(false);\n readonly currentMonth = signal<number>(new Date().getMonth());\n readonly currentYear = signal<number>(new Date().getFullYear());\n\n /** Disabled state pushed in by the forms API (setDisabledState). */\n private readonly formDisabled = signal<boolean>(false);\n\n /** Effective disabled state: the `disabled` input OR the form control's disabled state. */\n readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n\n // Computed values\n readonly formattedDate = computed(() => {\n const date = this.selectedDate();\n if (!date) return '';\n return this.formatDate(date, this.format());\n });\n\n /**\n * Text currently shown in the input. Follows the selected date, but the user\n * can type freely; only a complete, valid date is committed to the model.\n */\n readonly inputValue = linkedSignal(() => this.formattedDate());\n\n weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n\n monthNames = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n\n /** Month name in the header: `locale` when set, the English names otherwise. */\n readonly currentMonthName = computed(() => {\n const locale = this.locale();\n return locale\n ? new Date(this.currentYear(), this.currentMonth(), 1).toLocaleDateString(locale, { month: 'long' })\n : this.monthNames[this.currentMonth()];\n });\n\n /** Weekday headers in grid order, starting at `firstDayOfWeek`. */\n readonly weekdayLabels = computed(() => {\n const locale = this.locale();\n const first = this.gridStart();\n // 1 Jan 2023 was a Sunday, so day d of that week has getDay() === d.\n const names = locale\n ? Array.from({ length: 7 }, (_, d) =>\n new Date(2023, 0, 1 + d).toLocaleDateString(locale, { weekday: 'short' }).replace(/\\.$/, ''),\n )\n : this.weekDays;\n return Array.from({ length: 7 }, (_, i) => names[(first + i) % 7]);\n });\n\n /** `firstDayOfWeek` clamped to 0–6. */\n private readonly gridStart = computed(() => {\n const day = Math.trunc(Number(this.firstDayOfWeek()));\n return Number.isFinite(day) ? ((day % 7) + 7) % 7 : 0;\n });\n\n /** id of the helper/error text the input is described by (aria-describedby) */\n readonly describedBy = computed(() => {\n if (this.error() && this.errorMessage()) {\n return `${this.inputId}-error`;\n }\n return this.helperText() ? `${this.inputId}-helper` : null;\n });\n\n /**\n * Computed classes for the datepicker input element\n */\n readonly datepickerClasses = computed(() => {\n const classes = [\n 'lc-datepicker',\n `lc-datepicker--${this.variant()}`,\n `lc-datepicker--${this.size()}`,\n ];\n\n if (this.isDisabled()) {\n classes.push('lc-datepicker--disabled');\n }\n\n if (this.error()) {\n classes.push('lc-datepicker--error');\n }\n\n if (this.readonly()) {\n classes.push('lc-datepicker--readonly');\n }\n\n if (this.isOpen()) {\n classes.push('lc-datepicker--open');\n }\n\n return classes.join(' ');\n });\n\n // Private properties\n private readonly document = inject(DOCUMENT);\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onChange: (value: Date | null) => void = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private onTouched: () => void = () => {};\n\n // Public methods\n /**\n * Toggle calendar open/closed\n */\n toggle(): void {\n if (this.isDisabled() || this.readonly()) {\n return;\n }\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Open calendar\n */\n open(): void {\n if (this.isDisabled() || this.readonly() || this.isOpen()) {\n return;\n }\n this.isOpen.set(true);\n\n // Set calendar to selected date's month/year or current\n const date = this.selectedDate();\n if (date) {\n this.showMonthOf(date);\n }\n\n this.opened.emit();\n }\n\n /**\n * Close calendar. Idempotent: the overlay's `detach` re-enters here after\n * `isOpen` flips, and that second call must not emit `closed` again.\n */\n close(): void {\n if (!this.isOpen()) {\n return;\n }\n // A day button inside the panel may hold focus; it is about to be removed,\n // so hand focus back to the input instead of letting it drop to <body>.\n this.restoreFocusFromPanel();\n this.isOpen.set(false);\n this.closed.emit();\n }\n\n /**\n * Select a date\n */\n selectDate(date: Date): void {\n if (this.isDisabled() || this.readonly() || this.isDateDisabled(date)) {\n return;\n }\n\n this.commitDate(date);\n this.close();\n }\n\n /**\n * Clear selected date\n */\n clear(): void {\n this.selectedDate.set(null);\n this.inputValue.set('');\n this.onChange(null);\n this.dateChange.emit(null);\n }\n\n /**\n * Check if a date is disabled\n */\n isDateDisabled(date: Date): boolean {\n // min/max are compared by calendar day: consumers typically pass `new Date()`\n // (which carries the current time) while calendar cells sit at midnight.\n const day = this.startOfDay(date);\n\n const min = this.minDate();\n if (min && day < this.startOfDay(min)) {\n return true;\n }\n\n const max = this.maxDate();\n if (max && day > this.startOfDay(max)) {\n return true;\n }\n\n // Check disabled dates\n if (this.disabledDates().some((d) => this.isSameDate(d, date))) {\n return true;\n }\n\n // Check weekends\n if (this.disableWeekends()) {\n const weekday = date.getDay();\n if (weekday === 0 || weekday === 6) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Check if date is today\n */\n isToday(date: Date): boolean {\n const today = new Date();\n return this.isSameDate(date, today);\n }\n\n /** Accessible name of a day button: the full date, plus `selectedAriaLabel` when selected. */\n protected dayAriaLabel(date: Date): string {\n const locale = this.locale();\n const name = locale\n ? date.toLocaleDateString(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' })\n : date.toDateString();\n return this.isSelectedDate(date) ? `${name}, ${this.selectedAriaLabel()}` : name;\n }\n\n /**\n * Check if date is selected\n */\n isSelectedDate(date: Date): boolean {\n const selected = this.selectedDate();\n return selected ? this.isSameDate(date, selected) : false;\n }\n\n /**\n * Generate calendar days for current month\n */\n generateCalendarDays(): Date[] {\n const year = this.currentYear();\n const month = this.currentMonth();\n\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n\n const days: Date[] = [];\n\n // Add previous month's days, so the first column is `firstDayOfWeek`.\n const leadingDays = (firstDay.getDay() - this.gridStart() + 7) % 7;\n for (let i = leadingDays - 1; i >= 0; i--) {\n const date = new Date(year, month, -i);\n days.push(date);\n }\n\n // Add current month's days\n for (let i = 1; i <= lastDay.getDate(); i++) {\n days.push(new Date(year, month, i));\n }\n\n // Add next month's days to complete the grid\n const remainingDays = 42 - days.length; // 6 weeks * 7 days\n for (let i = 1; i <= remainingDays; i++) {\n days.push(new Date(year, month + 1, i));\n }\n\n return days.slice(0, 42); // Ensure exactly 42 days (6 weeks)\n }\n\n /**\n * Navigate to next month\n */\n nextMonth(): void {\n if (this.currentMonth() === 11) {\n this.currentMonth.set(0);\n this.currentYear.set(this.currentYear() + 1);\n } else {\n this.currentMonth.set(this.currentMonth() + 1);\n }\n }\n\n /**\n * Navigate to previous month\n */\n previousMonth(): void {\n if (this.currentMonth() === 0) {\n this.currentMonth.set(11);\n this.currentYear.set(this.currentYear() - 1);\n } else {\n this.currentMonth.set(this.currentMonth() - 1);\n }\n }\n\n /**\n * Navigate to today\n */\n goToToday(): void {\n this.showMonthOf(new Date());\n }\n\n /**\n * Handle input change (manual date entry). Partial input is kept as text\n * only; the model changes once the text is a complete, valid, selectable date.\n */\n onInputChange(value: string): void {\n this.inputValue.set(value);\n\n if (value.trim() === '') {\n if (this.selectedDate() !== null) {\n this.clear();\n }\n return;\n }\n\n const date = this.parseDate(value, this.format());\n if (date && !this.isDateDisabled(date) && !this.isSelectedDate(date)) {\n this.commitDate(date);\n this.showMonthOf(date);\n }\n }\n\n /**\n * Handle keyboard navigation\n */\n onKeyDown(event: KeyboardEvent): void {\n if (this.isDisabled() || this.readonly()) {\n return;\n }\n\n if (\n !this.isOpen() &&\n (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ')\n ) {\n this.open();\n event.preventDefault();\n return;\n }\n\n if (!this.isOpen()) return;\n\n // While the text differs from the model the user is mid-edit: arrows must\n // move the caret, not the calendar selection.\n const editing = this.inputValue() !== this.formattedDate();\n const currentDate = this.selectedDate() || new Date();\n let newDate: Date | null = null;\n\n switch (event.key) {\n case 'Escape':\n this.close();\n event.preventDefault();\n // Only this datepicker should react; keep the key from reaching enclosing overlays.\n event.stopPropagation();\n break;\n\n case 'ArrowRight':\n if (editing) break;\n newDate = new Date(currentDate);\n newDate.setDate(currentDate.getDate() + 1);\n event.preventDefault();\n break;\n\n case 'ArrowLeft':\n if (editing) break;\n newDate = new Date(currentDate);\n newDate.setDate(currentDate.getDate() - 1);\n event.preventDefault();\n break;\n\n case 'ArrowDown':\n if (editing) break;\n newDate = new Date(currentDate);\n newDate.setDate(currentDate.getDate() + 7);\n event.preventDefault();\n break;\n\n case 'ArrowUp':\n if (editing) break;\n newDate = new Date(currentDate);\n newDate.setDate(currentDate.getDate() - 7);\n event.preventDefault();\n break;\n\n case 'Enter': {\n const selected = this.selectedDate();\n if (selected) {\n this.selectDate(selected);\n }\n event.preventDefault();\n break;\n }\n }\n\n if (newDate && !this.isDateDisabled(newDate)) {\n this.selectedDate.set(newDate);\n this.showMonthOf(newDate);\n }\n }\n\n /**\n * Handle blur event: mark touched and drop any partial text that never became a date.\n */\n onBlur(): void {\n this.onTouched();\n this.inputValue.set(this.formattedDate());\n }\n\n /**\n * Handle click outside\n */\n onClickOutside(): void {\n this.close();\n }\n\n // ControlValueAccessor implementation\n writeValue(value: DateValue): void {\n let date: Date | null = null;\n if (value instanceof Date) {\n date = isNaN(value.getTime()) ? null : value;\n } else if (typeof value === 'string') {\n date = this.parseDate(value, this.format());\n }\n this.selectedDate.set(date);\n this.inputValue.set(this.formattedDate());\n }\n\n registerOnChange(fn: (value: Date | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n\n /**\n * Check if date is in current month\n */\n isCurrentMonth(date: Date): boolean {\n return date.getMonth() === this.currentMonth() && date.getFullYear() === this.currentYear();\n }\n\n // Private helper methods\n private commitDate(date: Date): void {\n this.selectedDate.set(date);\n this.inputValue.set(this.formatDate(date, this.format()));\n this.onChange(date);\n this.dateChange.emit(date);\n }\n\n private showMonthOf(date: Date): void {\n this.currentMonth.set(date.getMonth());\n this.currentYear.set(date.getFullYear());\n }\n\n private restoreFocusFromPanel(): void {\n const panel = this.calendarPanel()?.nativeElement;\n const active = this.document.activeElement;\n if (panel && active && panel.contains(active)) {\n this.datepickerInput()?.nativeElement.focus();\n }\n }\n\n private startOfDay(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n }\n\n /**\n * Check if two dates are the same day\n */\n private isSameDate(date1: Date, date2: Date): boolean {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n }\n\n private formatDate(date: Date, format: string): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return format.replace('YYYY', String(year)).replace('MM', month).replace('DD', day);\n }\n\n /**\n * Strict parse: the text must match the format's length, carry digits at the\n * YYYY/MM/DD positions and round-trip through formatDate (which rejects\n * things like month 13 or Feb 31 that `new Date` would silently roll over).\n * Returns null for partial or invalid input.\n */\n private parseDate(value: string, format: string): Date | null {\n if (value.length !== format.length) {\n return null;\n }\n\n const yearIndex = format.indexOf('YYYY');\n const monthIndex = format.indexOf('MM');\n const dayIndex = format.indexOf('DD');\n if (yearIndex < 0 || monthIndex < 0 || dayIndex < 0) {\n return null;\n }\n\n const yearText = value.substring(yearIndex, yearIndex + 4);\n const monthText = value.substring(monthIndex, monthIndex + 2);\n const dayText = value.substring(dayIndex, dayIndex + 2);\n if (!/^\\d{4}$/.test(yearText) || !/^\\d{2}$/.test(monthText) || !/^\\d{2}$/.test(dayText)) {\n return null;\n }\n\n const date = new Date(Number(yearText), Number(monthText) - 1, Number(dayText));\n return this.formatDate(date, format) === value ? date : null;\n }\n\n protected getInputValue(event: Event): string {\n return (event.target as HTMLInputElement).value;\n }\n}\n","<div class=\"lc-datepicker-wrapper\">\n <div class=\"lc-datepicker-input-wrapper\">\n <input\n #datepickerInput\n type=\"text\"\n [id]=\"inputId\"\n [class]=\"datepickerClasses()\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n autocomplete=\"off\"\n [attr.aria-expanded]=\"isOpen() ? 'true' : 'false'\"\n [attr.aria-controls]=\"isOpen() ? inputId + '-calendar' : null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [placeholder]=\"placeholder()\"\n [value]=\"inputValue()\"\n (input)=\"onInputChange(getInputValue($event))\"\n (click)=\"toggle()\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onBlur()\"\n />\n <div class=\"lc-datepicker-icons\">\n @if (selectedDate() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"lc-datepicker-clear\"\n (click)=\"clear(); $event.stopPropagation()\"\n [attr.aria-label]=\"clearAriaLabel()\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\"\n />\n </svg>\n </button>\n }\n <svg\n class=\"lc-datepicker-calendar-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M5.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H6a.75.75 0 01-.75-.75V12zM6 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H6zM7.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H8a.75.75 0 01-.75-.75V12zM8 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H8zM9.25 10a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H10a.75.75 0 01-.75-.75V10zM10 11.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V12a.75.75 0 00-.75-.75H10zM9.25 14a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H10a.75.75 0 01-.75-.75V14zM12 9.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V10a.75.75 0 00-.75-.75H12zM11.25 12a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H12a.75.75 0 01-.75-.75V12zM12 13.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V14a.75.75 0 00-.75-.75H12zM13.25 10a.75.75 0 01.75-.75h.01a.75.75 0 01.75.75v.01a.75.75 0 01-.75.75H14a.75.75 0 01-.75-.75V10zM14 11.25a.75.75 0 00-.75.75v.01c0 .414.336.75.75.75h.01a.75.75 0 00.75-.75V12a.75.75 0 00-.75-.75H14z\"\n />\n <path\n fill-rule=\"evenodd\"\n d=\"M5.75 2a.75.75 0 01.75.75V4h7V2.75a.75.75 0 011.5 0V4h.25A2.75 2.75 0 0118 6.75v8.5A2.75 2.75 0 0115.25 18H4.75A2.75 2.75 0 012 15.25v-8.5A2.75 2.75 0 014.75 4H5V2.75A.75.75 0 015.75 2zm-1 5.5c-.69 0-1.25.56-1.25 1.25v6.5c0 .69.56 1.25 1.25 1.25h10.5c.69 0 1.25-.56 1.25-1.25v-6.5c0-.69-.56-1.25-1.25-1.25H4.75z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n </div>\n\n <!-- Calendar Panel -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"datepickerInput\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n (backdropClick)=\"onClickOutside()\"\n (detach)=\"close()\"\n >\n <div\n #calendarPanel\n class=\"lc-datepicker-calendar\"\n [class.lc-datepicker-calendar--open]=\"isOpen()\"\n [id]=\"inputId + '-calendar'\"\n role=\"dialog\"\n [attr.aria-label]=\"dialogAriaLabel()\"\n >\n <!-- Calendar Header -->\n <div class=\"lc-datepicker-header\">\n <button\n type=\"button\"\n class=\"lc-datepicker-nav-button\"\n (click)=\"previousMonth()\"\n [attr.aria-label]=\"previousMonthAriaLabel()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n fill-rule=\"evenodd\"\n d=\"M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n \n <div class=\"lc-datepicker-month-year\" aria-live=\"polite\">\n {{ currentMonthName() }} {{ currentYear() }}\n </div>\n \n <button\n type=\"button\"\n class=\"lc-datepicker-nav-button\"\n (click)=\"nextMonth()\"\n [attr.aria-label]=\"nextMonthAriaLabel()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n fill-rule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n <!-- Quick Actions -->\n <div class=\"lc-datepicker-quick-actions\">\n <button\n type=\"button\"\n class=\"lc-datepicker-today-button\"\n (click)=\"goToToday()\"\n >\n {{ todayLabel() }}\n </button>\n </div>\n\n <!-- Weekday Headers -->\n <div class=\"lc-datepicker-weekdays\" aria-hidden=\"true\">\n @for (day of weekdayLabels(); track $index) {\n <div class=\"lc-datepicker-weekday\">{{ day }}</div>\n }\n </div>\n\n <!-- Calendar Days -->\n <div class=\"lc-datepicker-days\">\n @for (date of generateCalendarDays(); track date.getTime()) {\n <button\n type=\"button\"\n class=\"lc-datepicker-day\"\n [class.lc-datepicker-day--other-month]=\"!isCurrentMonth(date)\"\n [class.lc-datepicker-day--today]=\"isToday(date)\"\n [class.lc-datepicker-day--selected]=\"isSelectedDate(date)\"\n [class.lc-datepicker-day--disabled]=\"isDateDisabled(date)\"\n [disabled]=\"isDateDisabled(date)\"\n [attr.aria-current]=\"isToday(date) ? 'date' : null\"\n [attr.aria-label]=\"dayAriaLabel(date)\"\n (click)=\"selectDate(date)\"\n >\n {{ date.getDate() }}\n </button>\n }\n </div>\n </div>\n </ng-template>\n\n <!-- Helper/Error Text -->\n @if (error() && errorMessage()) {\n <div class=\"lc-datepicker__error\" [id]=\"inputId + '-error'\" role=\"alert\">\n {{ errorMessage() }}\n </div>\n } @else if (helperText()) {\n <div class=\"lc-datepicker__helper\" [id]=\"inputId + '-helper'\">\n {{ helperText() }}\n </div>\n }\n</div>\n"],"mappings":"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"}