{"version":3,"file":"mayvio-ui-angular-src-datepicker.mjs","sources":["../../src/datepicker/datepicker.component.ts","../../src/datepicker/mayvio-ui-angular-src-datepicker.ts"],"sourcesContent":["import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  HostListener,\n  ElementRef,\n  inject,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport 'mayvio-ui/datepicker/css';\n\nconst MONTH_NAMES = [\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\nconst DAY_NAMES = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\n\ninterface DayObj {\n  date: Date;\n  isCurrentMonth: boolean;\n}\n\n@Component({\n  selector: 'mv-datepicker',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"mv-datepicker\" [class.mv-datepicker--open]=\"isOpen\" [class]=\"className\">\n      <button\n        type=\"button\"\n        class=\"mv-datepicker-trigger\"\n        [class.mv-datepicker-trigger--disabled]=\"disabled\"\n        (click)=\"toggleMenu()\"\n        [disabled]=\"disabled\"\n        [attr.aria-label]=\"value ? 'Selected date: ' + formattedDate : 'Choose date'\"\n      >\n        <span [class.mv-datepicker-placeholder]=\"!value\">\n          {{ formattedDate }}\n        </span>\n        <svg\n          width=\"16\"\n          height=\"16\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n        >\n          <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n          <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line>\n          <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line>\n          <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\n        </svg>\n      </button>\n\n      <div class=\"mv-datepicker-popup\" role=\"dialog\" aria-label=\"Calendar\" *ngIf=\"isOpen\">\n        <div class=\"mv-datepicker-header\">\n          <button\n            type=\"button\"\n            class=\"mv-datepicker-nav-btn\"\n            (click)=\"prevMonth($event)\"\n            aria-label=\"Previous month\"\n          >\n            <svg\n              width=\"16\"\n              height=\"16\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"2\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n            >\n              <polyline points=\"15 18 9 12 15 6\"></polyline>\n            </svg>\n          </button>\n          <div class=\"mv-datepicker-current-month\" aria-live=\"polite\">\n            {{ currentMonthName }} {{ currentYear }}\n          </div>\n          <button\n            type=\"button\"\n            class=\"mv-datepicker-nav-btn\"\n            (click)=\"nextMonth($event)\"\n            aria-label=\"Next month\"\n          >\n            <svg\n              width=\"16\"\n              height=\"16\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"2\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n            >\n              <polyline points=\"9 18 15 12 9 6\"></polyline>\n            </svg>\n          </button>\n        </div>\n\n        <div class=\"mv-datepicker-grid\" role=\"grid\">\n          <div\n            *ngFor=\"let name of dayNames\"\n            class=\"mv-datepicker-day-name\"\n            role=\"columnheader\"\n            [attr.aria-label]=\"name\"\n          >\n            {{ name }}\n          </div>\n\n          <div\n            *ngFor=\"let dayObj of days; let i = index\"\n            class=\"mv-datepicker-cell\"\n            [class.mv-datepicker-cell--outside-month]=\"!dayObj.isCurrentMonth\"\n            [class.mv-datepicker-cell--selected]=\"isSelected(dayObj.date)\"\n            [class.mv-datepicker-cell--today]=\"isToday(dayObj.date)\"\n            [class.mv-datepicker-cell--disabled]=\"isDisabled(dayObj.date)\"\n            role=\"gridcell\"\n            [attr.aria-selected]=\"isSelected(dayObj.date)\"\n            [attr.aria-disabled]=\"isDisabled(dayObj.date)\"\n            (click)=\"selectDate(dayObj.date)\"\n          >\n            {{ dayObj.date.getDate() }}\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class DatePickerComponent implements OnInit, OnChanges {\n  @Input() value?: Date;\n  @Input() disabled = false;\n  @Input() placeholder = 'Select date';\n  @Input() minDate?: Date;\n  @Input() maxDate?: Date;\n  @Input() className = '';\n\n  @Output() dateChange = new EventEmitter<Date>();\n\n  isOpen = false;\n  viewDate: Date = new Date();\n\n  dayNames = DAY_NAMES;\n  days: DayObj[] = [];\n\n  private el = inject(ElementRef);\n  private cdr = inject(ChangeDetectorRef);\n\n  ngOnInit() {\n    this.viewDate = this.value || new Date();\n    this.generateCalendar();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['value'] && !this.isOpen) {\n      if (this.value) {\n        this.viewDate = new Date(this.value);\n      }\n      this.generateCalendar();\n    }\n  }\n\n  get formattedDate(): string {\n    if (!this.value) return this.placeholder;\n    return `${MONTH_NAMES[this.value.getMonth()]} ${this.value.getDate()}, ${this.value.getFullYear()}`;\n  }\n\n  get currentMonthName(): string {\n    return MONTH_NAMES[this.viewDate.getMonth()];\n  }\n\n  get currentYear(): number {\n    return this.viewDate.getFullYear();\n  }\n\n  generateCalendar() {\n    const year = this.viewDate.getFullYear();\n    const month = this.viewDate.getMonth();\n\n    const daysInMonth = new Date(year, month + 1, 0).getDate();\n    const firstDay = new Date(year, month, 1).getDay();\n    const daysInPrevMonth = new Date(year, month, 0).getDate();\n\n    const newDays: DayObj[] = [];\n\n    for (let i = firstDay - 1; i >= 0; i--) {\n      newDays.push({\n        date: new Date(year, month - 1, daysInPrevMonth - i),\n        isCurrentMonth: false,\n      });\n    }\n\n    for (let i = 1; i <= daysInMonth; i++) {\n      newDays.push({\n        date: new Date(year, month, i),\n        isCurrentMonth: true,\n      });\n    }\n\n    const remainingCells = 42 - newDays.length;\n    for (let i = 1; i <= remainingCells; i++) {\n      newDays.push({\n        date: new Date(year, month + 1, i),\n        isCurrentMonth: false,\n      });\n    }\n\n    this.days = newDays;\n  }\n\n  toggleMenu() {\n    if (this.disabled) return;\n    this.isOpen = !this.isOpen;\n    if (this.isOpen) {\n      this.viewDate = this.value || new Date();\n      this.generateCalendar();\n    }\n    this.cdr.markForCheck();\n  }\n\n  prevMonth(e: Event) {\n    e.stopPropagation();\n    this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() - 1, 1);\n    this.generateCalendar();\n    this.cdr.markForCheck();\n  }\n\n  nextMonth(e: Event) {\n    e.stopPropagation();\n    this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() + 1, 1);\n    this.generateCalendar();\n    this.cdr.markForCheck();\n  }\n\n  selectDate(d: Date) {\n    if (this.disabled || this.isDisabled(d)) return;\n\n    this.value = d;\n    this.dateChange.emit(this.value);\n    this.isOpen = false;\n    this.cdr.markForCheck();\n  }\n\n  isToday(d: Date): boolean {\n    const today = new Date();\n    return (\n      d.getDate() === today.getDate() &&\n      d.getMonth() === today.getMonth() &&\n      d.getFullYear() === today.getFullYear()\n    );\n  }\n\n  isSelected(d: Date): boolean {\n    if (!this.value) return false;\n    return (\n      d.getDate() === this.value.getDate() &&\n      d.getMonth() === this.value.getMonth() &&\n      d.getFullYear() === this.value.getFullYear()\n    );\n  }\n\n  isDisabled(d: Date): boolean {\n    if (this.minDate && d < this.minDate) return true;\n    if (this.maxDate && d > this.maxDate) return true;\n    return false;\n  }\n\n  @HostListener('document:mousedown', ['$event.target'])\n  onClickOutside(target: EventTarget | null) {\n    if (this.isOpen && !this.el.nativeElement.contains(target as Node)) {\n      this.isOpen = false;\n      this.cdr.markForCheck();\n    }\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}