{"version":3,"file":"utils.cjs","sources":["../../../../../src/components/date-input/calendar/utils.ts"],"sourcesContent":["import { toValidInputValue } from \"../utils.js\";\nimport type { CalendarProps } from \"./types.js\";\n\nconst NORWEGIAN_LOCALE = \"nb-NO\";\nconst WEEK_STARTS_ON = 1;\nexport function getCalendarTable(year: number, month: number) {\n    const now = new Date();\n    const y = Number.isFinite(year) ? year : now.getFullYear();\n    const m = Number.isFinite(month) ? month : now.getMonth();\n\n    const daysInMonth = new Date(y, m + 1, 0).getDate();\n    const firstDay = new Date(y, m, 1).getDay(); // 0 = Sunday\n\n    const leadingBlanks = (firstDay - WEEK_STARTS_ON + 7) % 7;\n\n    const cells: Array<number | null> = [\n        ...Array(leadingBlanks).fill(null),\n        ...Array.from({ length: daysInMonth }, (_, i) => i + 1),\n    ];\n\n    while (cells.length % 7 !== 0) cells.push(null);\n\n    const weeks: Array<Array<number | null>> = [];\n    for (let i = 0; i < cells.length; i += 7) {\n        weeks.push(cells.slice(i, i + 7));\n    }\n\n    const formatter = new Intl.DateTimeFormat(NORWEGIAN_LOCALE, {\n        weekday: \"long\",\n    });\n    const headers = Array.from({ length: 7 }, (_, i) => {\n        const d = new Date(2024, 0, 7 + ((WEEK_STARTS_ON + i) % 7));\n        return formatter.format(d);\n    });\n\n    return { headers, weeks };\n}\n\nconst DEFAULT_YEARS_RANGE = 5;\nexport function getYearOptions(\n    currentYear: number,\n    min?: string,\n    max?: string,\n): number[] {\n    const parsedMinYear = min\n        ? new Date(toValidInputValue(min) || \"\").getUTCFullYear()\n        : Number.NaN;\n    const parsedMaxYear = max\n        ? new Date(toValidInputValue(max) || \"\").getUTCFullYear()\n        : Number.NaN;\n\n    const minYear = Number.isFinite(parsedMinYear)\n        ? parsedMinYear\n        : currentYear - DEFAULT_YEARS_RANGE;\n    const maxYear = Number.isFinite(parsedMaxYear)\n        ? parsedMaxYear\n        : currentYear + DEFAULT_YEARS_RANGE;\n\n    const startYear = Math.min(minYear, currentYear);\n    const endYear = Math.max(maxYear, currentYear);\n\n    const years: number[] = [];\n    for (let year = startYear; year <= endYear; year++) {\n        years.push(year);\n    }\n    return years;\n}\n\nexport function getMonthNames(locale: string): string[] {\n    const formatter = new Intl.DateTimeFormat(locale, { month: \"long\" });\n    return Array.from({ length: 12 }, (_, i) =>\n        formatter.format(new Date(2000, i, 1)),\n    );\n}\nexport const months = getMonthNames(NORWEGIAN_LOCALE);\n\nexport const isDateDisabled = (\n    value: CalendarProps[\"value\"],\n    min?: CalendarProps[\"min\"],\n    max?: CalendarProps[\"max\"],\n): boolean => {\n    if (value) {\n        const date = new Date(toValidInputValue(value) || \"\");\n        const minDate = min\n            ? new Date(toValidInputValue(min) || \"\")\n            : undefined;\n        const maxDate = max\n            ? new Date(toValidInputValue(max) || \"\")\n            : undefined;\n        if (minDate && date < minDate) return true;\n        if (maxDate && date > maxDate) return true;\n    }\n    return false;\n};\n\nexport const addDays = (date: Date, amount: number): Date => {\n    const next = new Date(date);\n    next.setDate(next.getDate() + amount);\n    return next;\n};\n\nexport const addMonths = (date: Date, amount: number): Date => {\n    const first = new Date(date.getFullYear(), date.getMonth() + amount, 1);\n    const lastDayOfMonth = new Date(\n        first.getFullYear(),\n        first.getMonth() + 1,\n        0,\n    ).getDate();\n    first.setDate(Math.min(date.getDate(), lastDayOfMonth));\n    return first;\n};\n\nexport const startOfWeek = (date: Date): Date => {\n    const next = new Date(date);\n    const diff = (next.getDay() - WEEK_STARTS_ON + 7) % 7;\n    next.setDate(next.getDate() - diff);\n    return next;\n};\n\nexport const endOfWeek = (date: Date): Date => addDays(startOfWeek(date), 6);\n\nexport const isoToLocalDate = (value: string | undefined): Date | null => {\n    const iso = toValidInputValue(value);\n    if (!iso) return null;\n    const [year, month, day] = iso.split(\"-\").map(Number);\n    return new Date(year, month - 1, day);\n};\n\nexport const clampDateToRange = (\n    date: Date,\n    min?: string,\n    max?: string,\n): Date => {\n    const iso = toValidInputValue(date);\n    const minIso = min ? toValidInputValue(min) : \"\";\n    const maxIso = max ? toValidInputValue(max) : \"\";\n    if (minIso && iso < minIso) return isoToLocalDate(minIso) ?? date;\n    if (maxIso && iso > maxIso) return isoToLocalDate(maxIso) ?? date;\n    return date;\n};\n\nexport const hasSelectableDateInMonth = (\n    year: number,\n    month: number,\n    min?: string,\n    max?: string,\n): boolean => {\n    const firstIso = toValidInputValue(new Date(year, month, 1));\n    const lastIso = toValidInputValue(new Date(year, month + 1, 0));\n    const minIso = min ? toValidInputValue(min) : \"\";\n    const maxIso = max ? toValidInputValue(max) : \"\";\n    if (minIso && lastIso < minIso) return false;\n    if (maxIso && firstIso > maxIso) return false;\n    return true;\n};\n\nexport const getSelectableMonths = (\n    year: number,\n    min?: string,\n    max?: string,\n): number[] =>\n    months\n        .map((_, index) => index)\n        .filter((index) => hasSelectableDateInMonth(year, index, min, max));\n\nconst MONTH_CHANGE_KEYS = [\"PageUp\", \"PageDown\"];\nexport const getNextFocusableDate = (\n    key: string,\n    shiftKey: boolean,\n    focusedDate: Date,\n    min?: string,\n    max?: string,\n): Date | null => {\n    const naive = getDateForCalendarKey(key, shiftKey, focusedDate);\n    if (!naive) {\n        return null;\n    }\n\n    // Måneds-/årshopp inn i en helt disabla måned skal være en no-op,\n    // på linje med de disabla ‹ ›-knappene.\n    if (\n        MONTH_CHANGE_KEYS.includes(key) &&\n        !hasSelectableDateInMonth(\n            naive.getFullYear(),\n            naive.getMonth(),\n            min,\n            max,\n        )\n    ) {\n        return null;\n    }\n\n    // Klamper til nærmeste valgbare dato (håndterer bl.a. at selve\n    // måldagen kan være før min / etter max selv om måneden har gyldige dager).\n    return clampDateToRange(naive, min, max);\n};\n\n// Mapper et tastetrykk til datoen navigasjonen skal flytte til.\n// Returnerer null for taster som ikke er navigasjon (håndteres i komponenten).\nexport const getDateForCalendarKey = (\n    key: string,\n    shiftKey: boolean,\n    focusedDate: Date,\n): Date | null => {\n    switch (key) {\n        case \"ArrowLeft\":\n            return addDays(focusedDate, -1);\n        case \"ArrowRight\":\n            return addDays(focusedDate, 1);\n        case \"ArrowUp\":\n            return addDays(focusedDate, -7);\n        case \"ArrowDown\":\n            return addDays(focusedDate, 7);\n        case \"Home\":\n            return startOfWeek(focusedDate);\n        case \"End\":\n            return endOfWeek(focusedDate);\n        case \"PageUp\":\n            return addMonths(focusedDate, shiftKey ? -12 : -1);\n        case \"PageDown\":\n            return addMonths(focusedDate, shiftKey ? 12 : 1);\n        default:\n            return null;\n    }\n};\n"],"names":["NORWEGIAN_LOCALE","getMonthNames","locale","formatter","Intl","DateTimeFormat","month","Array","from","length","_","i","format","Date","months","addDays","date","amount","next","setDate","getDate","addMonths","first","getFullYear","getMonth","lastDayOfMonth","Math","min","startOfWeek","diff","getDay","endOfWeek","isoToLocalDate","value","iso","toValidInputValue","year","day","split","map","Number","clampDateToRange","max","minIso","maxIso","hasSelectableDateInMonth","firstIso","lastIso","MONTH_CHANGE_KEYS","getDateForCalendarKey","key","shiftKey","focusedDate","now","y","isFinite","m","daysInMonth","leadingBlanks","cells","fill","push","weeks","slice","weekday","headers","d","naive","includes","index","filter","currentYear","parsedMinYear","getUTCFullYear","NaN","parsedMaxYear","minYear","maxYear","startYear","endYear","years","minDate","maxDate"],"mappings":"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"}