asterui 0.12.64 → 0.12.66

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.
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.js","sources":["../../src/components/DatePicker.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, forwardRef } from 'react'\nimport { Input } from './Input'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnSm = 'btn-sm'\nconst dBtnSquare = 'btn-square'\n\nexport interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n value?: Date | null\n defaultValue?: Date | null\n onChange?: (date: Date | null) => void\n format?: string\n placeholder?: string\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport type DateRangeValue = [Date | null, Date | null]\n\nexport interface DateRangePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n value?: DateRangeValue\n defaultValue?: DateRangeValue\n onChange?: (range: DateRangeValue) => void\n format?: string\n placeholder?: [string, string] | string\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nconst DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\nconst MONTHS = [\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\nfunction formatDate(date: Date | null, format: string = 'MM/DD/YYYY'): string {\n if (!date) return ''\n\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\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n}\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\nfunction getFirstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay()\n}\n\nfunction stripTime(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear()\n && a.getMonth() === b.getMonth()\n && a.getDate() === b.getDate()\n}\n\nfunction isBeforeDay(a: Date, b: Date): boolean {\n return stripTime(a).getTime() < stripTime(b).getTime()\n}\n\nfunction isAfterDay(a: Date, b: Date): boolean {\n return stripTime(a).getTime() > stripTime(b).getTime()\n}\n\nfunction formatRange(range: DateRangeValue, format: string = 'MM/DD/YYYY'): string {\n const [start, end] = range\n if (start && end) return `${formatDate(start, format)} - ${formatDate(end, format)}`\n if (start) return `${formatDate(start, format)} - `\n return ''\n}\n\nconst DatePickerComponent = forwardRef<HTMLDivElement, DatePickerProps>(function DatePicker(\n {\n value,\n defaultValue,\n onChange,\n format,\n placeholder = 'Select date',\n disabled = false,\n size,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const [selectedDate, setSelectedDate] = useState<Date | null>(\n value || defaultValue || null\n )\n const [isOpen, setIsOpen] = useState(false)\n const [viewMonth, setViewMonth] = useState(\n selectedDate ? selectedDate.getMonth() : new Date().getMonth()\n )\n const [viewYear, setViewYear] = useState(\n selectedDate ? selectedDate.getFullYear() : new Date().getFullYear()\n )\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (value !== undefined) {\n setSelectedDate(value)\n }\n }, [value])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const handleDateSelect = (day: number) => {\n const newDate = new Date(viewYear, viewMonth, day)\n setSelectedDate(newDate)\n onChange?.(newDate)\n setIsOpen(false)\n }\n\n const handlePrevMonth = () => {\n if (viewMonth === 0) {\n setViewMonth(11)\n setViewYear(viewYear - 1)\n } else {\n setViewMonth(viewMonth - 1)\n }\n }\n\n const handleNextMonth = () => {\n if (viewMonth === 11) {\n setViewMonth(0)\n setViewYear(viewYear + 1)\n } else {\n setViewMonth(viewMonth + 1)\n }\n }\n\n const daysInMonth = getDaysInMonth(viewYear, viewMonth)\n const firstDayOfMonth = getFirstDayOfMonth(viewYear, viewMonth)\n\n const calendarDays: (number | null)[] = []\n for (let i = 0; i < firstDayOfMonth; i++) {\n calendarDays.push(null)\n }\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(i)\n }\n\n const isSelectedDay = (day: number | null): boolean => {\n if (!day || !selectedDate) return false\n return (\n selectedDate.getDate() === day &&\n selectedDate.getMonth() === viewMonth &&\n selectedDate.getFullYear() === viewYear\n )\n }\n\n const isToday = (day: number | null): boolean => {\n if (!day) return false\n const today = new Date()\n return (\n today.getDate() === day &&\n today.getMonth() === viewMonth &&\n today.getFullYear() === viewYear\n )\n }\n\n return (\n <div ref={ref || containerRef} className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} data-testid={testId} {...rest}>\n <Input\n value={formatDate(selectedDate, format)}\n placeholder={placeholder}\n disabled={disabled}\n size={effectiveSize}\n readOnly\n onClick={() => !disabled && setIsOpen(!isOpen)}\n className=\"cursor-pointer\"\n data-testid={getTestId('input')}\n />\n\n {isOpen && (\n <div className=\"absolute top-full left-0 mt-2 bg-base-100 border border-base-300 rounded-lg shadow-lg p-4 z-50 w-80\" data-testid={getTestId('calendar')}>\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n <div className=\"text-base font-semibold\">\n {MONTHS[viewMonth]} {viewYear}\n </div>\n\n <button\n type=\"button\"\n onClick={handleNextMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n {/* Days of week */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {DAYS.map((day) => (\n <div\n key={day}\n className=\"text-center text-xs font-semibold text-base-content/60 py-2\"\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((day, index) => (\n <button\n key={index}\n type=\"button\"\n disabled={!day}\n onClick={() => day && handleDateSelect(day)}\n className={`\n aspect-square flex items-center justify-center text-sm rounded-lg\n ${!day ? 'invisible' : 'hover:bg-base-200'}\n ${isSelectedDay(day) ? 'bg-primary text-primary-content hover:bg-primary/90' : ''}\n ${isToday(day) && !isSelectedDay(day) ? 'border border-primary' : ''}\n ${day ? 'cursor-pointer' : ''}\n `}\n >\n {day}\n </button>\n ))}\n </div>\n\n {/* Today button */}\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"button\"\n onClick={() => {\n const today = new Date()\n setSelectedDate(today)\n setViewMonth(today.getMonth())\n setViewYear(today.getFullYear())\n onChange?.(today)\n setIsOpen(false)\n }}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm}`}\n >\n Today\n </button>\n </div>\n </div>\n )}\n </div>\n )\n})\n\nconst DateRangePicker = forwardRef<HTMLDivElement, DateRangePickerProps>(function DateRangePicker(\n {\n value,\n defaultValue,\n onChange,\n format,\n placeholder,\n disabled = false,\n size,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const [startPlaceholder, endPlaceholder] = Array.isArray(placeholder)\n ? placeholder\n : [placeholder ?? 'Start date', 'End date']\n const resolvedPlaceholder = Array.isArray(placeholder)\n ? `${startPlaceholder} - ${endPlaceholder}`\n : placeholder ?? 'Start date - End date'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const [selectedRange, setSelectedRange] = useState<DateRangeValue>(\n value || defaultValue || [null, null]\n )\n const [isOpen, setIsOpen] = useState(false)\n const initialDate = selectedRange[0] ?? selectedRange[1] ?? new Date()\n const [viewMonth, setViewMonth] = useState(initialDate.getMonth())\n const [viewYear, setViewYear] = useState(initialDate.getFullYear())\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (value !== undefined) {\n setSelectedRange(value)\n }\n }, [value])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const handleDateSelect = (day: number) => {\n const newDate = new Date(viewYear, viewMonth, day)\n let [start, end] = selectedRange\n\n if (!start || (start && end)) {\n start = newDate\n end = null\n } else if (start && !end) {\n if (isBeforeDay(newDate, start)) {\n end = start\n start = newDate\n } else {\n end = newDate\n }\n }\n\n const nextRange: DateRangeValue = [start, end]\n setSelectedRange(nextRange)\n onChange?.(nextRange)\n if (start && end) {\n setIsOpen(false)\n }\n }\n\n const handlePrevMonth = () => {\n if (viewMonth === 0) {\n setViewMonth(11)\n setViewYear(viewYear - 1)\n } else {\n setViewMonth(viewMonth - 1)\n }\n }\n\n const handleNextMonth = () => {\n if (viewMonth === 11) {\n setViewMonth(0)\n setViewYear(viewYear + 1)\n } else {\n setViewMonth(viewMonth + 1)\n }\n }\n\n const daysInMonth = getDaysInMonth(viewYear, viewMonth)\n const firstDayOfMonth = getFirstDayOfMonth(viewYear, viewMonth)\n\n const calendarDays: (number | null)[] = []\n for (let i = 0; i < firstDayOfMonth; i++) {\n calendarDays.push(null)\n }\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(i)\n }\n\n const isToday = (day: number | null): boolean => {\n if (!day) return false\n const today = new Date()\n return (\n today.getDate() === day &&\n today.getMonth() === viewMonth &&\n today.getFullYear() === viewYear\n )\n }\n\n const [rangeStart, rangeEnd] = selectedRange\n\n return (\n <div ref={ref || containerRef} className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} data-testid={testId} {...rest}>\n <Input\n value={formatRange(selectedRange, format)}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n size={effectiveSize}\n readOnly\n onClick={() => !disabled && setIsOpen(!isOpen)}\n className=\"cursor-pointer\"\n data-testid={getTestId('input')}\n />\n\n {isOpen && (\n <div className=\"absolute top-full left-0 mt-2 bg-base-100 border border-base-300 rounded-lg shadow-lg p-4 z-50 w-80\" data-testid={getTestId('calendar')}>\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n <div className=\"text-base font-semibold\">\n {MONTHS[viewMonth]} {viewYear}\n </div>\n\n <button\n type=\"button\"\n onClick={handleNextMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n {/* Days of week */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {DAYS.map((day) => (\n <div\n key={day}\n className=\"text-center text-xs font-semibold text-base-content/60 py-2\"\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((day, index) => {\n const dayDate = day ? new Date(viewYear, viewMonth, day) : null\n const isStart = !!dayDate && !!rangeStart && isSameDay(dayDate, rangeStart)\n const isEnd = !!dayDate && !!rangeEnd && isSameDay(dayDate, rangeEnd)\n const isInRange = !!dayDate && !!rangeStart && !!rangeEnd\n && isAfterDay(dayDate, rangeStart)\n && isBeforeDay(dayDate, rangeEnd)\n\n return (\n <button\n key={index}\n type=\"button\"\n disabled={!day}\n onClick={() => day && handleDateSelect(day)}\n className={`\n aspect-square flex items-center justify-center text-sm rounded-lg\n ${!day ? 'invisible' : 'hover:bg-base-200'}\n ${isInRange ? 'bg-primary/10' : ''}\n ${isStart || isEnd ? 'bg-primary text-primary-content hover:bg-primary/90' : ''}\n ${isToday(day) && !isStart && !isEnd ? 'border border-primary' : ''}\n ${day ? 'cursor-pointer' : ''}\n `}\n >\n {day}\n </button>\n )\n })}\n </div>\n\n {/* Today button */}\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"button\"\n onClick={() => {\n const today = new Date()\n setSelectedRange([today, today])\n setViewMonth(today.getMonth())\n setViewYear(today.getFullYear())\n onChange?.([today, today])\n setIsOpen(false)\n }}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm}`}\n >\n Today\n </button>\n </div>\n </div>\n )}\n </div>\n )\n})\n\nDatePickerComponent.displayName = 'DatePicker'\nDateRangePicker.displayName = 'DatePicker.Range'\n\ntype DatePickerType = typeof DatePickerComponent & {\n Range: typeof DateRangePicker\n}\n\nexport const DatePicker = DatePickerComponent as DatePickerType\nDatePicker.Range = DateRangePicker\n"],"names":["dBtn","dBtnGhost","dBtnSm","dBtnSquare","DAYS","MONTHS","formatDate","date","format","year","month","day","getDaysInMonth","getFirstDayOfMonth","stripTime","isSameDay","a","b","isBeforeDay","isAfterDay","formatRange","range","start","end","DatePickerComponent","forwardRef","value","defaultValue","onChange","placeholder","disabled","size","testId","className","rest","ref","componentSize","useConfig","effectiveSize","getTestId","suffix","selectedDate","setSelectedDate","useState","isOpen","setIsOpen","viewMonth","setViewMonth","viewYear","setViewYear","containerRef","useRef","useEffect","handleClickOutside","event","handleDateSelect","newDate","handlePrevMonth","handleNextMonth","daysInMonth","firstDayOfMonth","calendarDays","i","isSelectedDay","isToday","today","jsx","Input","jsxs","index","DateRangePicker","startPlaceholder","endPlaceholder","resolvedPlaceholder","selectedRange","setSelectedRange","initialDate","nextRange","rangeStart","rangeEnd","dayDate","isStart","isEnd","isInRange","DatePicker"],"mappings":"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"}
1
+ {"version":3,"file":"DatePicker.js","sources":["../../src/components/DatePicker.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, forwardRef } from 'react'\nimport { Input } from './Input'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnSm = 'btn-sm'\nconst dBtnSquare = 'btn-square'\n\nexport interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n value?: Date | null\n defaultValue?: Date | null\n onChange?: (date: Date | null) => void\n format?: string\n placeholder?: string\n disabledDate?: (date: Date) => boolean\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport type DateRangeValue = [Date | null, Date | null]\n\nexport interface DateRangePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n value?: DateRangeValue\n defaultValue?: DateRangeValue\n onChange?: (range: DateRangeValue) => void\n format?: string\n placeholder?: [string, string] | string\n disabledDate?: (date: Date) => boolean\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nconst DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\nconst MONTHS = [\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\nfunction formatDate(date: Date | null, format: string = 'MM/DD/YYYY'): string {\n if (!date) return ''\n\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\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n}\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\nfunction getFirstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay()\n}\n\nfunction stripTime(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear()\n && a.getMonth() === b.getMonth()\n && a.getDate() === b.getDate()\n}\n\nfunction isBeforeDay(a: Date, b: Date): boolean {\n return stripTime(a).getTime() < stripTime(b).getTime()\n}\n\nfunction isAfterDay(a: Date, b: Date): boolean {\n return stripTime(a).getTime() > stripTime(b).getTime()\n}\n\nfunction addDays(date: Date, amount: number): Date {\n const next = new Date(date)\n next.setDate(next.getDate() + amount)\n return next\n}\n\nfunction formatRange(range: DateRangeValue, format: string = 'MM/DD/YYYY'): string {\n const [start, end] = range\n if (start && end) return `${formatDate(start, format)} - ${formatDate(end, format)}`\n if (start) return `${formatDate(start, format)} - `\n return ''\n}\n\nconst DatePickerComponent = forwardRef<HTMLDivElement, DatePickerProps>(function DatePicker(\n {\n value,\n defaultValue,\n onChange,\n format,\n placeholder,\n disabledDate,\n disabled = false,\n size,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize, locale } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const resolvedPlaceholder = placeholder ?? locale?.DatePicker?.placeholder ?? 'Select date'\n const todayLabel = locale?.DatePicker?.today ?? 'Today'\n const todayDate = new Date()\n const isTodayDisabled = disabled || disabledDate?.(todayDate)\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const [selectedDate, setSelectedDate] = useState<Date | null>(\n value || defaultValue || null\n )\n const [isOpen, setIsOpen] = useState(false)\n const [focusedDate, setFocusedDate] = useState<Date | null>(null)\n const [viewMonth, setViewMonth] = useState(\n selectedDate ? selectedDate.getMonth() : new Date().getMonth()\n )\n const [viewYear, setViewYear] = useState(\n selectedDate ? selectedDate.getFullYear() : new Date().getFullYear()\n )\n\n const containerRef = useRef<HTMLDivElement>(null)\n const calendarRef = useRef<HTMLDivElement>(null)\n const calendarId = React.useId()\n\n useEffect(() => {\n if (value !== undefined) {\n setSelectedDate(value)\n }\n }, [value])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n setFocusedDate(selectedDate ?? todayDate)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n useEffect(() => {\n if (!isOpen || !calendarRef.current) return\n const focusTarget = calendarRef.current.querySelector<HTMLButtonElement>('[data-calendar-focus=\"true\"]')\n focusTarget?.focus()\n }, [isOpen, viewMonth, viewYear, focusedDate])\n\n const handleDateSelect = (day: number) => {\n const newDate = new Date(viewYear, viewMonth, day)\n if (disabled || disabledDate?.(newDate)) return\n setSelectedDate(newDate)\n onChange?.(newDate)\n setIsOpen(false)\n }\n\n const focusNextEnabledDate = (start: Date, delta: number) => {\n let candidate = addDays(start, delta)\n for (let i = 0; i < 31; i++) {\n if (!disabledDate?.(candidate)) return candidate\n candidate = addDays(candidate, delta)\n }\n return start\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (!focusedDate) return\n let nextDate = focusedDate\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault()\n nextDate = focusNextEnabledDate(focusedDate, 1)\n break\n case 'ArrowLeft':\n event.preventDefault()\n nextDate = focusNextEnabledDate(focusedDate, -1)\n break\n case 'ArrowDown':\n event.preventDefault()\n nextDate = focusNextEnabledDate(focusedDate, 7)\n break\n case 'ArrowUp':\n event.preventDefault()\n nextDate = focusNextEnabledDate(focusedDate, -7)\n break\n case 'Home':\n event.preventDefault()\n nextDate = new Date(focusedDate.getFullYear(), focusedDate.getMonth(), 1)\n if (disabledDate?.(nextDate)) {\n nextDate = focusNextEnabledDate(nextDate, 1)\n }\n break\n case 'End':\n event.preventDefault()\n nextDate = new Date(focusedDate.getFullYear(), focusedDate.getMonth(), getDaysInMonth(focusedDate.getFullYear(), focusedDate.getMonth()))\n if (disabledDate?.(nextDate)) {\n nextDate = focusNextEnabledDate(nextDate, -1)\n }\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n handleDateSelect(focusedDate.getDate())\n return\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n return\n default:\n return\n }\n\n setFocusedDate(nextDate)\n setViewMonth(nextDate.getMonth())\n setViewYear(nextDate.getFullYear())\n }\n\n const handlePrevMonth = () => {\n if (viewMonth === 0) {\n setViewMonth(11)\n setViewYear(viewYear - 1)\n } else {\n setViewMonth(viewMonth - 1)\n }\n }\n\n const handleNextMonth = () => {\n if (viewMonth === 11) {\n setViewMonth(0)\n setViewYear(viewYear + 1)\n } else {\n setViewMonth(viewMonth + 1)\n }\n }\n\n const daysInMonth = getDaysInMonth(viewYear, viewMonth)\n const firstDayOfMonth = getFirstDayOfMonth(viewYear, viewMonth)\n\n const calendarDays: (number | null)[] = []\n for (let i = 0; i < firstDayOfMonth; i++) {\n calendarDays.push(null)\n }\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(i)\n }\n\n const isSelectedDay = (day: number | null): boolean => {\n if (!day || !selectedDate) return false\n return (\n selectedDate.getDate() === day &&\n selectedDate.getMonth() === viewMonth &&\n selectedDate.getFullYear() === viewYear\n )\n }\n\n const isToday = (day: number | null): boolean => {\n if (!day) return false\n const today = new Date()\n return (\n today.getDate() === day &&\n today.getMonth() === viewMonth &&\n today.getFullYear() === viewYear\n )\n }\n\n return (\n <div ref={ref || containerRef} className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} data-testid={testId} {...rest}>\n <Input\n value={formatDate(selectedDate, format)}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n size={effectiveSize}\n readOnly\n onClick={() => !disabled && setIsOpen(!isOpen)}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={calendarId}\n className=\"cursor-pointer\"\n data-testid={getTestId('input')}\n />\n\n {isOpen && (\n <div\n ref={calendarRef}\n id={calendarId}\n role=\"dialog\"\n aria-label=\"Date picker calendar\"\n className=\"absolute top-full left-0 mt-2 bg-base-100 border border-base-300 rounded-lg shadow-lg p-4 z-50 w-80\"\n data-testid={getTestId('calendar')}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n <div className=\"text-base font-semibold\">\n {MONTHS[viewMonth]} {viewYear}\n </div>\n\n <button\n type=\"button\"\n onClick={handleNextMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n {/* Days of week */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\" role=\"row\">\n {DAYS.map((day) => (\n <div\n key={day}\n className=\"text-center text-xs font-semibold text-base-content/60 py-2\"\n role=\"columnheader\"\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\" role=\"grid\" onKeyDown={handleKeyDown}>\n {calendarDays.map((day, index) => {\n const dayDate = day ? new Date(viewYear, viewMonth, day) : null\n const isDayDisabled = disabled || (!!dayDate && !!disabledDate?.(dayDate))\n const isFocusedDay = !!dayDate && !!focusedDate && isSameDay(dayDate, focusedDate)\n\n return (\n <button\n key={index}\n type=\"button\"\n disabled={!day || isDayDisabled}\n aria-disabled={isDayDisabled || undefined}\n aria-selected={isSelectedDay(day) || undefined}\n role=\"gridcell\"\n onClick={() => day && handleDateSelect(day)}\n tabIndex={isFocusedDay ? 0 : -1}\n data-calendar-focus={isFocusedDay ? 'true' : undefined}\n className={`\n aspect-square flex items-center justify-center text-sm rounded-lg\n ${!day ? 'invisible' : ''}\n ${day && !isDayDisabled ? 'hover:bg-base-200 cursor-pointer' : ''}\n ${isSelectedDay(day) ? 'bg-primary text-primary-content hover:bg-primary/90' : ''}\n ${isToday(day) && !isSelectedDay(day) ? 'border border-primary' : ''}\n ${isDayDisabled ? 'text-base-content/30 cursor-not-allowed' : ''}\n `}\n >\n {day}\n </button>\n )\n })}\n </div>\n\n {/* Today button */}\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"button\"\n onClick={() => {\n const today = new Date()\n if (disabledDate?.(today)) return\n setSelectedDate(today)\n setViewMonth(today.getMonth())\n setViewYear(today.getFullYear())\n onChange?.(today)\n setIsOpen(false)\n }}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm}`}\n disabled={isTodayDisabled}\n >\n {todayLabel}\n </button>\n </div>\n </div>\n )}\n </div>\n )\n})\n\nconst DateRangePicker = forwardRef<HTMLDivElement, DateRangePickerProps>(function DateRangePicker(\n {\n value,\n defaultValue,\n onChange,\n format,\n placeholder,\n disabledDate,\n disabled = false,\n size,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize, locale } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const localeRangePlaceholder = locale?.DatePicker?.rangePlaceholder\n const [startPlaceholder, endPlaceholder] = Array.isArray(placeholder)\n ? placeholder\n : [\n placeholder ?? localeRangePlaceholder?.[0] ?? 'Start date',\n localeRangePlaceholder?.[1] ?? 'End date',\n ]\n const resolvedPlaceholder = Array.isArray(placeholder)\n ? `${startPlaceholder} - ${endPlaceholder}`\n : placeholder ?? `${startPlaceholder} - ${endPlaceholder}`\n const todayLabel = locale?.DatePicker?.today ?? 'Today'\n const todayDate = new Date()\n const isTodayDisabled = disabled || disabledDate?.(todayDate)\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const [selectedRange, setSelectedRange] = useState<DateRangeValue>(\n value || defaultValue || [null, null]\n )\n const [isOpen, setIsOpen] = useState(false)\n const [focusedDate, setFocusedDate] = useState<Date | null>(null)\n const initialDate = selectedRange[0] ?? selectedRange[1] ?? new Date()\n const [viewMonth, setViewMonth] = useState(initialDate.getMonth())\n const [viewYear, setViewYear] = useState(initialDate.getFullYear())\n\n const containerRef = useRef<HTMLDivElement>(null)\n const calendarRef = useRef<HTMLDivElement>(null)\n const calendarId = React.useId()\n\n useEffect(() => {\n if (value !== undefined) {\n setSelectedRange(value)\n }\n }, [value])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n setFocusedDate(selectedRange[0] ?? selectedRange[1] ?? todayDate)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n useEffect(() => {\n if (!isOpen || !calendarRef.current) return\n const focusTarget = calendarRef.current.querySelector<HTMLButtonElement>('[data-calendar-focus=\"true\"]')\n focusTarget?.focus()\n }, [isOpen, viewMonth, viewYear, focusedDate])\n\n const handleDateSelect = (day: number) => {\n const newDate = new Date(viewYear, viewMonth, day)\n if (disabled || disabledDate?.(newDate)) return\n let [start, end] = selectedRange\n\n if (!start || (start && end)) {\n start = newDate\n end = null\n } else if (start && !end) {\n if (isBeforeDay(newDate, start)) {\n end = start\n start = newDate\n } else {\n end = newDate\n }\n }\n\n const nextRange: DateRangeValue = [start, end]\n setSelectedRange(nextRange)\n onChange?.(nextRange)\n if (start && end) {\n setIsOpen(false)\n }\n }\n\n const focusNextEnabledDate = (start: Date, delta: number) => {\n let candidate = addDays(start, delta)\n for (let i = 0; i < 31; i++) {\n if (!disabledDate?.(candidate)) return candidate\n candidate = addDays(candidate, delta)\n }\n return start\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (!focusedDate) return\n let nextDate = focusedDate\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault()\n nextDate = focusNextEnabledDate(focusedDate, 1)\n break\n case 'ArrowLeft':\n event.preventDefault()\n nextDate = focusNextEnabledDate(focusedDate, -1)\n break\n case 'ArrowDown':\n event.preventDefault()\n nextDate = focusNextEnabledDate(focusedDate, 7)\n break\n case 'ArrowUp':\n event.preventDefault()\n nextDate = focusNextEnabledDate(focusedDate, -7)\n break\n case 'Home':\n event.preventDefault()\n nextDate = new Date(focusedDate.getFullYear(), focusedDate.getMonth(), 1)\n if (disabledDate?.(nextDate)) {\n nextDate = focusNextEnabledDate(nextDate, 1)\n }\n break\n case 'End':\n event.preventDefault()\n nextDate = new Date(focusedDate.getFullYear(), focusedDate.getMonth(), getDaysInMonth(focusedDate.getFullYear(), focusedDate.getMonth()))\n if (disabledDate?.(nextDate)) {\n nextDate = focusNextEnabledDate(nextDate, -1)\n }\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n handleDateSelect(focusedDate.getDate())\n return\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n return\n default:\n return\n }\n\n setFocusedDate(nextDate)\n setViewMonth(nextDate.getMonth())\n setViewYear(nextDate.getFullYear())\n }\n\n const handlePrevMonth = () => {\n if (viewMonth === 0) {\n setViewMonth(11)\n setViewYear(viewYear - 1)\n } else {\n setViewMonth(viewMonth - 1)\n }\n }\n\n const handleNextMonth = () => {\n if (viewMonth === 11) {\n setViewMonth(0)\n setViewYear(viewYear + 1)\n } else {\n setViewMonth(viewMonth + 1)\n }\n }\n\n const daysInMonth = getDaysInMonth(viewYear, viewMonth)\n const firstDayOfMonth = getFirstDayOfMonth(viewYear, viewMonth)\n\n const calendarDays: (number | null)[] = []\n for (let i = 0; i < firstDayOfMonth; i++) {\n calendarDays.push(null)\n }\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(i)\n }\n\n const isToday = (day: number | null): boolean => {\n if (!day) return false\n const today = new Date()\n return (\n today.getDate() === day &&\n today.getMonth() === viewMonth &&\n today.getFullYear() === viewYear\n )\n }\n\n const [rangeStart, rangeEnd] = selectedRange\n\n return (\n <div ref={ref || containerRef} className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} data-testid={testId} {...rest}>\n <Input\n value={formatRange(selectedRange, format)}\n placeholder={resolvedPlaceholder}\n disabled={disabled}\n size={effectiveSize}\n readOnly\n onClick={() => !disabled && setIsOpen(!isOpen)}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={calendarId}\n className=\"cursor-pointer\"\n data-testid={getTestId('input')}\n />\n\n {isOpen && (\n <div\n ref={calendarRef}\n id={calendarId}\n role=\"dialog\"\n aria-label=\"Date range picker calendar\"\n className=\"absolute top-full left-0 mt-2 bg-base-100 border border-base-300 rounded-lg shadow-lg p-4 z-50 w-80\"\n data-testid={getTestId('calendar')}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n <div className=\"text-base font-semibold\">\n {MONTHS[viewMonth]} {viewYear}\n </div>\n\n <button\n type=\"button\"\n onClick={handleNextMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n {/* Days of week */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\" role=\"row\">\n {DAYS.map((day) => (\n <div\n key={day}\n className=\"text-center text-xs font-semibold text-base-content/60 py-2\"\n role=\"columnheader\"\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\" role=\"grid\" onKeyDown={handleKeyDown}>\n {calendarDays.map((day, index) => {\n const dayDate = day ? new Date(viewYear, viewMonth, day) : null\n const isDayDisabled = disabled || (!!dayDate && !!disabledDate?.(dayDate))\n const isStart = !!dayDate && !!rangeStart && isSameDay(dayDate, rangeStart)\n const isEnd = !!dayDate && !!rangeEnd && isSameDay(dayDate, rangeEnd)\n const isInRange = !!dayDate && !!rangeStart && !!rangeEnd\n && isAfterDay(dayDate, rangeStart)\n && isBeforeDay(dayDate, rangeEnd)\n const isFocusedDay = !!dayDate && !!focusedDate && isSameDay(dayDate, focusedDate)\n\n return (\n <button\n key={index}\n type=\"button\"\n disabled={!day || isDayDisabled}\n aria-disabled={isDayDisabled || undefined}\n aria-selected={isStart || isEnd || isInRange || undefined}\n role=\"gridcell\"\n onClick={() => day && handleDateSelect(day)}\n tabIndex={isFocusedDay ? 0 : -1}\n data-calendar-focus={isFocusedDay ? 'true' : undefined}\n className={`\n aspect-square flex items-center justify-center text-sm rounded-lg\n ${!day ? 'invisible' : ''}\n ${day && !isDayDisabled ? 'hover:bg-base-200 cursor-pointer' : ''}\n ${isInRange ? 'bg-primary/10' : ''}\n ${isStart || isEnd ? 'bg-primary text-primary-content hover:bg-primary/90' : ''}\n ${isToday(day) && !isStart && !isEnd ? 'border border-primary' : ''}\n ${isDayDisabled ? 'text-base-content/30 cursor-not-allowed' : ''}\n `}\n >\n {day}\n </button>\n )\n })}\n </div>\n\n {/* Today button */}\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"button\"\n onClick={() => {\n const today = new Date()\n if (disabledDate?.(today)) return\n setSelectedRange([today, today])\n setViewMonth(today.getMonth())\n setViewYear(today.getFullYear())\n onChange?.([today, today])\n setIsOpen(false)\n }}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm}`}\n disabled={isTodayDisabled}\n >\n {todayLabel}\n </button>\n </div>\n </div>\n )}\n </div>\n )\n})\n\nDatePickerComponent.displayName = 'DatePicker'\nDateRangePicker.displayName = 'DatePicker.Range'\n\ntype DatePickerType = typeof DatePickerComponent & {\n Range: typeof DateRangePicker\n}\n\nexport const DatePicker = DatePickerComponent as DatePickerType\nDatePicker.Range = DateRangePicker\n"],"names":["dBtn","dBtnGhost","dBtnSm","dBtnSquare","DAYS","MONTHS","formatDate","date","format","year","month","day","getDaysInMonth","getFirstDayOfMonth","stripTime","isSameDay","a","b","isBeforeDay","isAfterDay","addDays","amount","next","formatRange","range","start","end","DatePickerComponent","forwardRef","value","defaultValue","onChange","placeholder","disabledDate","disabled","size","testId","className","rest","ref","componentSize","locale","useConfig","effectiveSize","resolvedPlaceholder","todayLabel","todayDate","isTodayDisabled","getTestId","suffix","selectedDate","setSelectedDate","useState","isOpen","setIsOpen","focusedDate","setFocusedDate","viewMonth","setViewMonth","viewYear","setViewYear","containerRef","useRef","calendarRef","calendarId","React","useEffect","handleClickOutside","event","handleDateSelect","newDate","focusNextEnabledDate","delta","candidate","i","handleKeyDown","nextDate","handlePrevMonth","handleNextMonth","daysInMonth","firstDayOfMonth","calendarDays","isSelectedDay","isToday","today","jsx","Input","jsxs","index","dayDate","isDayDisabled","isFocusedDay","DateRangePicker","localeRangePlaceholder","startPlaceholder","endPlaceholder","selectedRange","setSelectedRange","initialDate","nextRange","rangeStart","rangeEnd","isStart","isEnd","isInRange","DatePicker"],"mappings":"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"}
@@ -1,91 +1,99 @@
1
- import { jsxs as p, Fragment as F, jsx as t } from "react/jsx-runtime";
2
- import { forwardRef as z, useState as h, useEffect as W, useCallback as i } from "react";
3
- const H = "btn", R = "btn-circle", V = "btn-sm", q = z(
1
+ import { jsxs as v, Fragment as H, jsx as a } from "react/jsx-runtime";
2
+ import { forwardRef as T, useState as l, useEffect as W, useCallback as i } from "react";
3
+ const R = "btn", V = "btn-circle", q = "btn-sm", A = T(
4
4
  ({
5
- src: l,
6
- alt: n = "",
7
- fallback: c,
5
+ src: c,
6
+ alt: s = "",
7
+ fallback: g,
8
8
  placeholder: y,
9
- preview: s = !0,
9
+ preview: n = !0,
10
10
  width: d,
11
11
  height: m,
12
- className: C = "",
12
+ className: j = "",
13
13
  onLoad: k,
14
14
  onError: w,
15
- "data-testid": o = "image",
16
- ...N
17
- }, j) => {
18
- const [a, g] = h(!0), [r, v] = h(!1), [L, u] = h(!1), [P, x] = h(l);
15
+ "data-testid": r = "image",
16
+ ...L
17
+ }, P) => {
18
+ const [t, u] = l(!0), [o, f] = l(!1), [B, h] = l(!1), [S, x] = l(c), [$, C] = l(!1);
19
19
  W(() => {
20
- g(!0), v(!1), x(l);
21
- }, [l]);
22
- const B = i(() => {
23
- g(!1), v(!1), k?.();
24
- }, [k]), S = i(() => {
25
- g(!1), v(!0), c && x(c), w?.();
26
- }, [c, w]), D = i(() => {
27
- s && !r && !a && u(!0);
28
- }, [s, r, a]), $ = i(() => {
29
- u(!1);
30
- }, []), E = i(
20
+ u(!0), f(!1), C(!1), x(c);
21
+ }, [c]);
22
+ const D = i(() => {
23
+ u(!1), f(!1), k?.();
24
+ }, [k]), E = i(() => {
25
+ if (w?.(), g && !$) {
26
+ C(!0), x(g), u(!0), f(!1);
27
+ return;
28
+ }
29
+ u(!1), f(!0);
30
+ }, [g, $, w]), F = i(() => {
31
+ n && !o && !t && h(!0);
32
+ }, [n, o, t]), N = i(() => {
33
+ h(!1);
34
+ }, []), K = i(
31
35
  (e) => {
32
- s && !r && !a && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), u(!0));
36
+ n && !o && !t && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), h(!0));
33
37
  },
34
- [s, r, a]
35
- ), K = i((e) => {
36
- e.key === "Escape" && u(!1);
37
- }, []), b = () => {
38
+ [n, o, t]
39
+ ), M = i((e) => {
40
+ e.key === "Escape" && h(!1);
41
+ }, []), p = () => {
38
42
  const e = {};
39
43
  return d && (e.width = typeof d == "number" ? `${d}px` : d), m && (e.height = typeof m == "number" ? `${m}px` : m), e;
40
- }, f = s && !r && !a, M = [
41
- C,
42
- f ? "cursor-pointer hover:opacity-80 transition-opacity" : ""
44
+ }, b = n && !o && !t, z = [
45
+ j,
46
+ b ? "cursor-pointer hover:opacity-80 transition-opacity" : ""
43
47
  ].filter(Boolean).join(" ");
44
- return /* @__PURE__ */ p(F, { children: [
45
- /* @__PURE__ */ p(
48
+ return /* @__PURE__ */ v(H, { children: [
49
+ /* @__PURE__ */ v(
46
50
  "div",
47
51
  {
48
52
  className: "relative inline-block",
49
- style: b(),
50
- "data-testid": o,
51
- "data-state": a ? "loading" : r ? "error" : "loaded",
53
+ style: p(),
54
+ "data-testid": r,
55
+ "data-state": t ? "loading" : o ? "error" : "loaded",
52
56
  children: [
53
- a && y && /* @__PURE__ */ t(
57
+ t && y && /* @__PURE__ */ a(
54
58
  "div",
55
59
  {
56
60
  className: "absolute inset-0 flex items-center justify-center bg-base-200",
57
- "data-testid": `${o}-placeholder`,
61
+ "data-testid": `${r}-placeholder`,
58
62
  children: y
59
63
  }
60
64
  ),
61
- /* @__PURE__ */ t(
65
+ /* @__PURE__ */ a(
62
66
  "img",
63
67
  {
64
- ref: j,
65
- ...N,
66
- src: P,
67
- alt: n,
68
- className: M,
69
- style: { ...b(), display: a ? "none" : "block" },
70
- onLoad: B,
71
- onError: S,
72
- onClick: D,
73
- onKeyDown: E,
74
- tabIndex: f ? 0 : void 0,
75
- role: f ? "button" : void 0,
76
- "aria-label": f ? `${n || "Image"} (click to preview)` : void 0,
77
- "data-testid": `${o}-img`
68
+ ref: P,
69
+ ...L,
70
+ src: S,
71
+ alt: s,
72
+ className: z,
73
+ style: {
74
+ ...p(),
75
+ opacity: t ? 0 : 1,
76
+ transition: "opacity 150ms ease"
77
+ },
78
+ onLoad: D,
79
+ onError: E,
80
+ onClick: F,
81
+ onKeyDown: K,
82
+ tabIndex: b ? 0 : void 0,
83
+ role: b ? "button" : void 0,
84
+ "aria-label": b ? `${s || "Image"} (click to preview)` : void 0,
85
+ "data-testid": `${r}-img`
78
86
  }
79
87
  ),
80
- r && !c && /* @__PURE__ */ t(
88
+ o && /* @__PURE__ */ a(
81
89
  "div",
82
90
  {
83
91
  className: "flex items-center justify-center bg-base-200 text-base-content/50",
84
- style: b(),
85
- "data-testid": `${o}-error`,
92
+ style: p(),
93
+ "data-testid": `${r}-error`,
86
94
  role: "img",
87
- "aria-label": `Failed to load: ${n || "image"}`,
88
- children: /* @__PURE__ */ t(
95
+ "aria-label": `Failed to load: ${s || "image"}`,
96
+ children: /* @__PURE__ */ a(
89
97
  "svg",
90
98
  {
91
99
  className: "w-12 h-12",
@@ -93,7 +101,7 @@ const H = "btn", R = "btn-circle", V = "btn-sm", q = z(
93
101
  stroke: "currentColor",
94
102
  viewBox: "0 0 24 24",
95
103
  "aria-hidden": "true",
96
- children: /* @__PURE__ */ t(
104
+ children: /* @__PURE__ */ a(
97
105
  "path",
98
106
  {
99
107
  strokeLinecap: "round",
@@ -109,26 +117,26 @@ const H = "btn", R = "btn-circle", V = "btn-sm", q = z(
109
117
  ]
110
118
  }
111
119
  ),
112
- L && /* @__PURE__ */ t(
120
+ B && /* @__PURE__ */ a(
113
121
  "div",
114
122
  {
115
123
  className: "fixed inset-0 z-50 bg-black bg-opacity-80 flex items-center justify-center p-4",
116
- onClick: $,
117
- onKeyDown: K,
124
+ onClick: N,
125
+ onKeyDown: M,
118
126
  role: "dialog",
119
127
  "aria-modal": "true",
120
- "aria-label": `Preview: ${n || "Image"}`,
121
- "data-testid": `${o}-preview`,
122
- children: /* @__PURE__ */ p("div", { className: "relative max-w-full max-h-full", children: [
123
- /* @__PURE__ */ t(
128
+ "aria-label": `Preview: ${s || "Image"}`,
129
+ "data-testid": `${r}-preview`,
130
+ children: /* @__PURE__ */ v("div", { className: "relative max-w-full max-h-full", children: [
131
+ /* @__PURE__ */ a(
124
132
  "button",
125
133
  {
126
- className: `absolute top-4 right-4 ${H} ${R} ${V}`,
127
- onClick: $,
134
+ className: `absolute top-4 right-4 ${R} ${V} ${q}`,
135
+ onClick: N,
128
136
  "aria-label": "Close preview",
129
137
  autoFocus: !0,
130
- "data-testid": `${o}-preview-close`,
131
- children: /* @__PURE__ */ t(
138
+ "data-testid": `${r}-preview-close`,
139
+ children: /* @__PURE__ */ a(
132
140
  "svg",
133
141
  {
134
142
  className: "w-6 h-6",
@@ -136,7 +144,7 @@ const H = "btn", R = "btn-circle", V = "btn-sm", q = z(
136
144
  stroke: "currentColor",
137
145
  viewBox: "0 0 24 24",
138
146
  "aria-hidden": "true",
139
- children: /* @__PURE__ */ t(
147
+ children: /* @__PURE__ */ a(
140
148
  "path",
141
149
  {
142
150
  strokeLinecap: "round",
@@ -149,14 +157,14 @@ const H = "btn", R = "btn-circle", V = "btn-sm", q = z(
149
157
  )
150
158
  }
151
159
  ),
152
- /* @__PURE__ */ t(
160
+ /* @__PURE__ */ a(
153
161
  "img",
154
162
  {
155
- src: l,
156
- alt: n,
163
+ src: c,
164
+ alt: s,
157
165
  className: "max-w-full max-h-[90vh] object-contain",
158
166
  onClick: (e) => e.stopPropagation(),
159
- "data-testid": `${o}-preview-img`
167
+ "data-testid": `${r}-preview-img`
160
168
  }
161
169
  )
162
170
  ] })
@@ -165,8 +173,8 @@ const H = "btn", R = "btn-circle", V = "btn-sm", q = z(
165
173
  ] });
166
174
  }
167
175
  );
168
- q.displayName = "Image";
176
+ A.displayName = "Image";
169
177
  export {
170
- q as Image
178
+ A as Image
171
179
  };
172
180
  //# sourceMappingURL=Image.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Image.js","sources":["../../src/components/Image.tsx"],"sourcesContent":["import React, { useState, useEffect, forwardRef, useCallback } from 'react'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnCircle = 'btn-circle'\nconst dBtnSm = 'btn-sm'\n\nexport interface ImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, 'placeholder'> {\n /** Image source URL */\n src: string\n /** Alternative text for the image */\n alt?: string\n /** Fallback image URL when source fails to load */\n fallback?: string\n /** Placeholder content shown while loading */\n placeholder?: React.ReactNode\n /** Enable click to preview image in lightbox */\n preview?: boolean\n /** Image width */\n width?: string | number\n /** Image height */\n height?: string | number\n /** Additional CSS classes */\n className?: string\n /** Callback when image loads successfully */\n onLoad?: () => void\n /** Callback when image fails to load */\n onError?: () => void\n /** Test ID for the component */\n 'data-testid'?: string\n}\n\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(\n (\n {\n src,\n alt = '',\n fallback,\n placeholder,\n preview = true,\n width,\n height,\n className = '',\n onLoad,\n onError,\n 'data-testid': testId = 'image',\n ...props\n },\n ref\n ) => {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [currentSrc, setCurrentSrc] = useState(src)\n\n useEffect(() => {\n setLoading(true)\n setError(false)\n setCurrentSrc(src)\n }, [src])\n\n const handleLoad = useCallback(() => {\n setLoading(false)\n setError(false)\n onLoad?.()\n }, [onLoad])\n\n const handleError = useCallback(() => {\n setLoading(false)\n setError(true)\n if (fallback) {\n setCurrentSrc(fallback)\n }\n onError?.()\n }, [fallback, onError])\n\n const handleImageClick = useCallback(() => {\n if (preview && !error && !loading) {\n setShowPreview(true)\n }\n }, [preview, error, loading])\n\n const handleClosePreview = useCallback(() => {\n setShowPreview(false)\n }, [])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (preview && !error && !loading && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n setShowPreview(true)\n }\n },\n [preview, error, loading]\n )\n\n const handlePreviewKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n setShowPreview(false)\n }\n }, [])\n\n const getStyle = (): React.CSSProperties => {\n const style: React.CSSProperties = {}\n if (width) {\n style.width = typeof width === 'number' ? `${width}px` : width\n }\n if (height) {\n style.height = typeof height === 'number' ? `${height}px` : height\n }\n return style\n }\n\n const isPreviewable = preview && !error && !loading\n const imageClasses = [\n className,\n isPreviewable ? 'cursor-pointer hover:opacity-80 transition-opacity' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <>\n <div\n className=\"relative inline-block\"\n style={getStyle()}\n data-testid={testId}\n data-state={loading ? 'loading' : error ? 'error' : 'loaded'}\n >\n {loading && placeholder && (\n <div\n className=\"absolute inset-0 flex items-center justify-center bg-base-200\"\n data-testid={`${testId}-placeholder`}\n >\n {placeholder}\n </div>\n )}\n <img\n ref={ref}\n {...props}\n src={currentSrc}\n alt={alt}\n className={imageClasses}\n style={{ ...getStyle(), display: loading ? 'none' : 'block' }}\n onLoad={handleLoad}\n onError={handleError}\n onClick={handleImageClick}\n onKeyDown={handleKeyDown}\n tabIndex={isPreviewable ? 0 : undefined}\n role={isPreviewable ? 'button' : undefined}\n aria-label={isPreviewable ? `${alt || 'Image'} (click to preview)` : undefined}\n data-testid={`${testId}-img`}\n />\n {error && !fallback && (\n <div\n className=\"flex items-center justify-center bg-base-200 text-base-content/50\"\n style={getStyle()}\n data-testid={`${testId}-error`}\n role=\"img\"\n aria-label={`Failed to load: ${alt || 'image'}`}\n >\n <svg\n className=\"w-12 h-12\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n </div>\n )}\n </div>\n\n {showPreview && (\n <div\n className=\"fixed inset-0 z-50 bg-black bg-opacity-80 flex items-center justify-center p-4\"\n onClick={handleClosePreview}\n onKeyDown={handlePreviewKeyDown}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Preview: ${alt || 'Image'}`}\n data-testid={`${testId}-preview`}\n >\n <div className=\"relative max-w-full max-h-full\">\n <button\n className={`absolute top-4 right-4 ${dBtn} ${dBtnCircle} ${dBtnSm}`}\n onClick={handleClosePreview}\n aria-label=\"Close preview\"\n autoFocus\n data-testid={`${testId}-preview-close`}\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n <img\n src={src}\n alt={alt}\n className=\"max-w-full max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n data-testid={`${testId}-preview-img`}\n />\n </div>\n </div>\n )}\n </>\n )\n }\n)\n\nImage.displayName = 'Image'\n"],"names":["dBtn","dBtnCircle","dBtnSm","Image","forwardRef","src","alt","fallback","placeholder","preview","width","height","className","onLoad","onError","testId","props","ref","loading","setLoading","useState","error","setError","showPreview","setShowPreview","currentSrc","setCurrentSrc","useEffect","handleLoad","useCallback","handleError","handleImageClick","handleClosePreview","handleKeyDown","handlePreviewKeyDown","getStyle","style","isPreviewable","imageClasses","jsxs","Fragment","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Image.js","sources":["../../src/components/Image.tsx"],"sourcesContent":["import React, { useState, useEffect, forwardRef, useCallback } from 'react'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnCircle = 'btn-circle'\nconst dBtnSm = 'btn-sm'\n\nexport interface ImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, 'placeholder'> {\n /** Image source URL */\n src: string\n /** Alternative text for the image */\n alt?: string\n /** Fallback image URL when source fails to load */\n fallback?: string\n /** Placeholder content shown while loading */\n placeholder?: React.ReactNode\n /** Enable click to preview image in lightbox */\n preview?: boolean\n /** Image width */\n width?: string | number\n /** Image height */\n height?: string | number\n /** Additional CSS classes */\n className?: string\n /** Callback when image loads successfully */\n onLoad?: () => void\n /** Callback when image fails to load */\n onError?: () => void\n /** Test ID for the component */\n 'data-testid'?: string\n}\n\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(\n (\n {\n src,\n alt = '',\n fallback,\n placeholder,\n preview = true,\n width,\n height,\n className = '',\n onLoad,\n onError,\n 'data-testid': testId = 'image',\n ...props\n },\n ref\n ) => {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [currentSrc, setCurrentSrc] = useState(src)\n const [hasTriedFallback, setHasTriedFallback] = useState(false)\n\n useEffect(() => {\n setLoading(true)\n setError(false)\n setHasTriedFallback(false)\n setCurrentSrc(src)\n }, [src])\n\n const handleLoad = useCallback(() => {\n setLoading(false)\n setError(false)\n onLoad?.()\n }, [onLoad])\n\n const handleError = useCallback(() => {\n onError?.()\n if (fallback && !hasTriedFallback) {\n setHasTriedFallback(true)\n setCurrentSrc(fallback)\n setLoading(true)\n setError(false)\n return\n }\n setLoading(false)\n setError(true)\n }, [fallback, hasTriedFallback, onError])\n\n const handleImageClick = useCallback(() => {\n if (preview && !error && !loading) {\n setShowPreview(true)\n }\n }, [preview, error, loading])\n\n const handleClosePreview = useCallback(() => {\n setShowPreview(false)\n }, [])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (preview && !error && !loading && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n setShowPreview(true)\n }\n },\n [preview, error, loading]\n )\n\n const handlePreviewKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n setShowPreview(false)\n }\n }, [])\n\n const getStyle = (): React.CSSProperties => {\n const style: React.CSSProperties = {}\n if (width) {\n style.width = typeof width === 'number' ? `${width}px` : width\n }\n if (height) {\n style.height = typeof height === 'number' ? `${height}px` : height\n }\n return style\n }\n\n const isPreviewable = preview && !error && !loading\n const imageClasses = [\n className,\n isPreviewable ? 'cursor-pointer hover:opacity-80 transition-opacity' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <>\n <div\n className=\"relative inline-block\"\n style={getStyle()}\n data-testid={testId}\n data-state={loading ? 'loading' : error ? 'error' : 'loaded'}\n >\n {loading && placeholder && (\n <div\n className=\"absolute inset-0 flex items-center justify-center bg-base-200\"\n data-testid={`${testId}-placeholder`}\n >\n {placeholder}\n </div>\n )}\n <img\n ref={ref}\n {...props}\n src={currentSrc}\n alt={alt}\n className={imageClasses}\n style={{\n ...getStyle(),\n opacity: loading ? 0 : 1,\n transition: 'opacity 150ms ease',\n }}\n onLoad={handleLoad}\n onError={handleError}\n onClick={handleImageClick}\n onKeyDown={handleKeyDown}\n tabIndex={isPreviewable ? 0 : undefined}\n role={isPreviewable ? 'button' : undefined}\n aria-label={isPreviewable ? `${alt || 'Image'} (click to preview)` : undefined}\n data-testid={`${testId}-img`}\n />\n {error && (\n <div\n className=\"flex items-center justify-center bg-base-200 text-base-content/50\"\n style={getStyle()}\n data-testid={`${testId}-error`}\n role=\"img\"\n aria-label={`Failed to load: ${alt || 'image'}`}\n >\n <svg\n className=\"w-12 h-12\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n </div>\n )}\n </div>\n\n {showPreview && (\n <div\n className=\"fixed inset-0 z-50 bg-black bg-opacity-80 flex items-center justify-center p-4\"\n onClick={handleClosePreview}\n onKeyDown={handlePreviewKeyDown}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Preview: ${alt || 'Image'}`}\n data-testid={`${testId}-preview`}\n >\n <div className=\"relative max-w-full max-h-full\">\n <button\n className={`absolute top-4 right-4 ${dBtn} ${dBtnCircle} ${dBtnSm}`}\n onClick={handleClosePreview}\n aria-label=\"Close preview\"\n autoFocus\n data-testid={`${testId}-preview-close`}\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n <img\n src={src}\n alt={alt}\n className=\"max-w-full max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n data-testid={`${testId}-preview-img`}\n />\n </div>\n </div>\n )}\n </>\n )\n }\n)\n\nImage.displayName = 'Image'\n"],"names":["dBtn","dBtnCircle","dBtnSm","Image","forwardRef","src","alt","fallback","placeholder","preview","width","height","className","onLoad","onError","testId","props","ref","loading","setLoading","useState","error","setError","showPreview","setShowPreview","currentSrc","setCurrentSrc","hasTriedFallback","setHasTriedFallback","useEffect","handleLoad","useCallback","handleError","handleImageClick","handleClosePreview","handleKeyDown","handlePreviewKeyDown","getStyle","style","isPreviewable","imageClasses","jsxs","Fragment","jsx"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export { Affix } from './components/Affix';
2
2
  export type { AffixProps } from './components/Affix';
3
+ export { AspectRatio } from './components/AspectRatio';
4
+ export type { AspectRatioProps } from './components/AspectRatio';
3
5
  export { Anchor } from './components/Anchor';
4
6
  export type { AnchorProps, AnchorLinkProps, AnchorLinkItem } from './components/Anchor';
5
7
  export { Alert } from './components/Alert';