import '../nui-icon/nui-icon.js'; import { html, nothing, type TemplateResult } from 'lit'; import type { NuiType } from '../../types/nui-type.js'; import { buildCalendarDays, formatDisplayDate, getMonthLabel, getWeekdayLabels, parseIsoDate, toIsoDate, } from './date-utils.js'; import type { DatePickerSize, DatePickerVariant } from './types.js'; export interface NuiDatePickerViewState { value: string; displayValue: string; placeholder: string; disabled: boolean; readonly: boolean; invalid: boolean; required: boolean; fluid: boolean; size: DatePickerSize | ''; variant: DatePickerVariant | ''; showIcon: boolean; icon: string; manualInput: boolean; name: string; inputId: string; ariaLabel: string; ariaLabelledby: string; overlayVisible: boolean; visibleMonth: Date; selectedDate: Date | null; today: Date; nuiType: NuiType; datePickerClass: string; } export interface DatePickerRenderHandlers { onInput: (event: Event) => void; onChange: (event: Event) => void; onFocus: (event: Event) => void; onBlur: (event: Event) => void; onIconClick: (event: Event) => void; onIconMouseDown: (event: Event) => void; onPrevMonth: (event: Event) => void; onNextMonth: (event: Event) => void; onDayClick: (iso: string, event: Event) => void; onPanelMouseDown: (event: Event) => void; } export function getDatePickerClass(datePickerClass: string): string { return ['nui-date-picker', datePickerClass].filter(Boolean).join(' '); } function renderCalendar( state: NuiDatePickerViewState, handlers: DatePickerRenderHandlers, ): TemplateResult { const days = buildCalendarDays(state.visibleMonth); const weekdays = getWeekdayLabels(); return html` `; } export function renderDatePicker( state: NuiDatePickerViewState, handlers: DatePickerRenderHandlers, ): TemplateResult { return html`
${ state.showIcon ? html` ` : nothing }
${state.overlayVisible ? renderCalendar(state, handlers) : nothing}
`; } export function getVisibleMonth(value: string, fallback = new Date()): Date { return parseIsoDate(value) ?? fallback; } export function getSelectedDate(value: string): Date | null { return parseIsoDate(value); } export function getDisplayValue(value: string, dateFormat: string): string { if (!value) { return ''; } return formatDisplayDate(value, dateFormat); } export function commitIsoValue(iso: string): string { if (!iso) { return ''; } return parseIsoDate(iso) ? iso : ''; } export function shiftVisibleMonth(current: Date, delta: number): Date { return new Date(current.getFullYear(), current.getMonth() + delta, 1); } export function getToday(): Date { const today = new Date(); return new Date(today.getFullYear(), today.getMonth(), today.getDate()); } export { toIsoDate };