{"version":3,"file":"index.mjs","sources":["../../../../../src/components/date-input/picker/index.tsx"],"sourcesContent":["import dayjs, { Dayjs } from \"dayjs\";\nimport React, { useCallback, useLayoutEffect, useState } from \"react\";\nimport ChevronLeft from \"../../../icons/chevron-left\";\nimport ChevronRight from \"../../../icons/chevron-right\";\nimport { type CalendarCell, getCalendarCells } from \"../../../utils/date\";\nimport { Typography } from \"../../typography\";\nimport LocalizedFormat from \"dayjs/plugin/localizedFormat\";\nimport { mergedCva } from \"../../../utils/components\";\n\ndayjs.extend(LocalizedFormat);\n\nconst iconStyles = mergedCva([\n    \"cui-w-4\",\n    \"cui-h-4\",\n    \"cui-cursor-pointer\",\n    \"cui-text-black\",\n    \"dark:cui-text-white\",\n]);\n\nconst weekdayStyles = mergedCva(\n    [\n        \"cui-w-6\",\n        \"cui-h-6\",\n        \"cui-flex\",\n        \"cui-justify-center\",\n        \"cui-items-center\",\n    ],\n    {\n        variants: {\n            holiday: {\n                true: [\"cui-text-red\", \"dark:!cui-text-red\"],\n                false: [\"cui-text-gray-600\", \"dark:cui-text-gray-500\"],\n            },\n        },\n    },\n);\n\nconst cellStyles = mergedCva(\n    [\n        \"cui-w-6\",\n        \"cui-h-6\",\n        \"cui-flex\",\n        \"cui-justify-center\",\n        \"cui-items-center\",\n        \"cui-rounded\",\n    ],\n    {\n        variants: {\n            selected: {\n                true: [\n                    \"cui-bg-green\",\n                    \"cui-text-black\",\n                    \"dark:!cui-text-black\",\n                ],\n                false: [\n                    \"cui-bg-white\",\n                    \"cui-text-black\",\n                    \"dark:cui-bg-black\",\n                    \"dark:cui-text-white\",\n                    ,\n                ],\n            },\n            disabled: {\n                true: [\n                    \"cui-text-gray-400\",\n                    \"dark:!cui-text-gray-600\",\n                    \"hover:cui-bg-white\",\n                    \"hover:dark:cui-bg-black\",\n                    \"cui-cursor-not-allowed\",\n                ],\n                false: [\"cui-cursor-pointer\"],\n            },\n        },\n        compoundVariants: [\n            {\n                disabled: false,\n                selected: false,\n                className: [\n                    \"hover:cui-bg-gray-300\",\n                    \"hover:dark:cui-bg-gray-600\",\n                ],\n            },\n        ],\n    },\n);\n\nexport interface DatePickerProps {\n    onChange?: (date: Date) => void;\n    value?: Date | null;\n    min?: Date | null;\n    max?: Date | null;\n    dataTestIds?: {\n        chrevronLeftIcon?: string;\n        chrevronRightIcon?: string;\n        cell?: string;\n    };\n}\n\nexport const DatePicker = ({\n    value,\n    onChange,\n    min,\n    max,\n    dataTestIds,\n}: DatePickerProps) => {\n    // this date is used to generate cells, and is generally set to the\n    // first day of the month we're currently interested in (also changed\n    // when the datepicker user wants to change months)\n    const [lookupDate, setLookupDate] = useState<Dayjs>(\n        value ? dayjs(value) : dayjs(),\n    );\n    const [cells, setCells] = useState<CalendarCell[]>([]);\n\n    useLayoutEffect(() => {\n        setCells(getCalendarCells(lookupDate));\n    }, [lookupDate]);\n\n    const handlePreviousMonth = useCallback(() => {\n        setLookupDate(lookupDate.subtract(1, \"month\"));\n    }, [lookupDate]);\n\n    const handleNextMonth = useCallback(() => {\n        setLookupDate(lookupDate.add(1, \"month\"));\n    }, [lookupDate]);\n\n    const handleCellClick = useCallback(\n        (event: React.MouseEvent<HTMLDivElement>) => {\n            if (!onChange || !event.target) return;\n            const index = (event.target as HTMLLIElement).dataset.index;\n            if (index !== undefined) {\n                const parsedIndex = parseInt(index);\n                if (parsedIndex >= 0)\n                    onChange(cells[parsedIndex].value.toDate());\n            }\n        },\n        [cells, onChange],\n    );\n\n    return (\n        <div className=\"cui-h-56 cui-w-52 cui-flex cui-flex-col cui-justify-between\">\n            <div className=\"cui-flex cui-items-center\">\n                <ChevronLeft\n                    data-testid={dataTestIds?.chrevronLeftIcon}\n                    className={iconStyles()}\n                    onClick={handlePreviousMonth}\n                />\n                <Typography className={{ root: \"cui-flex-1 cui-text-center\" }}>\n                    {lookupDate.format(\"MMMM YYYY\")}\n                </Typography>\n                <ChevronRight\n                    data-testid={dataTestIds?.chrevronRightIcon}\n                    className={iconStyles()}\n                    onClick={handleNextMonth}\n                />\n            </div>\n            <div className=\"cui-grid cui-grid-cols-7\">\n                {cells.slice(0, 7).map((cell) => {\n                    const dayOfWeek = cell.value.day();\n                    return (\n                        <Typography\n                            variant=\"sm\"\n                            key={dayOfWeek}\n                            className={{\n                                root: weekdayStyles({\n                                    holiday: dayOfWeek === 0 || dayOfWeek === 6,\n                                }),\n                            }}\n                            weight=\"medium\"\n                        >\n                            {cell.value.format(\"dd\")}\n                        </Typography>\n                    );\n                })}\n            </div>\n            <div className=\"cui-grid cui-grid-cols-7 cui-grid-rows-4 cui-gap-1\">\n                {cells.map((cell, index) => {\n                    const disabled =\n                        (min && cell.value.isBefore(min, \"day\")) ||\n                        (max && cell.value.isAfter(max, \"day\")) ||\n                        cell.value.month() !== lookupDate.month();\n                    const selected =\n                        !disabled &&\n                        value?.getMonth() === cell.value.month() &&\n                        value?.getDate() === cell.value.date();\n                    return (\n                        <Typography\n                            data-testid={dataTestIds?.cell}\n                            onClick={disabled ? undefined : handleCellClick}\n                            key={index}\n                            data-index={index}\n                            className={{\n                                root: cellStyles({\n                                    disabled,\n                                    selected,\n                                }),\n                            }}\n                        >\n                            {cell.text}\n                        </Typography>\n                    );\n                })}\n            </div>\n        </div>\n    );\n};\n"],"names":["React"],"mappings":"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"}