@vritti/quantum-ui 0.3.18 → 0.3.20
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.
- package/dist/DatePicker.js +2 -2
- package/dist/DatePicker.js.map +1 -1
- package/dist/DateTimePicker.js +2 -2
- package/dist/DateTimePicker.js.map +1 -1
- package/dist/Switch.js +11 -13
- package/dist/Switch.js.map +1 -1
- package/dist/UploadFile.js +53 -46
- package/dist/UploadFile.js.map +1 -1
- package/dist/assets/quantum-ui.css +2 -2
- package/dist/field.js +2 -2
- package/dist/field.js.map +1 -1
- package/dist/lib/components/Switch/Switch.d.ts.map +1 -1
- package/dist/lib/components/UploadFile/UploadFile.d.ts +2 -0
- package/dist/lib/components/UploadFile/UploadFile.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/DatePicker.js
CHANGED
|
@@ -199,7 +199,7 @@ const DatePicker = forwardRef((rawProps, ref) => {
|
|
|
199
199
|
if (!parsedDate || !isWithinDayBounds(parsedDate, minDay, maxDay)) return;
|
|
200
200
|
commit(parsedDate);
|
|
201
201
|
};
|
|
202
|
-
return /* @__PURE__ */ jsxs(Field, { "data-disabled": disabled, children: [
|
|
202
|
+
return /* @__PURE__ */ jsxs(Field, { "data-disabled": disabled, className, children: [
|
|
203
203
|
label && /* @__PURE__ */ jsx(FieldLabel, { htmlFor: inputId, children: label }),
|
|
204
204
|
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
205
205
|
/* @__PURE__ */ jsx(
|
|
@@ -212,7 +212,7 @@ const DatePicker = forwardRef((rawProps, ref) => {
|
|
|
212
212
|
readOnly: true,
|
|
213
213
|
"aria-invalid": !!error,
|
|
214
214
|
placeholder,
|
|
215
|
-
className:
|
|
215
|
+
className: "w-full pr-10",
|
|
216
216
|
onClick: () => !disabled && setOpen(true),
|
|
217
217
|
onBlur: () => onBlur?.(),
|
|
218
218
|
onKeyDown: (e) => {
|
package/dist/DatePicker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","sources":["../lib/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import {\n min as earliestDate,\n format,\n getDaysInMonth,\n isAfter,\n isBefore,\n isValid,\n max as latestDate,\n parse,\n startOfDay,\n startOfMonth,\n} from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport type React from 'react';\nimport { forwardRef, useEffect, useRef, useState } from 'react';\nimport { Button } from '../../../shadcn/shadcnButton';\nimport { Calendar, type CalendarProps } from '../../../shadcn/shadcnCalendar';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/shadcnPopover';\nimport { useLocale } from '../../hooks/useLocale';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\ntype DatePickerValue = string | undefined;\ntype DateParts = { day: string; month: string; year: string };\n\nconst ISO = 'yyyy-MM-dd';\nconst MANUAL = 'dd/MM/yyyy';\nconst DEFAULT_DISPLAY = 'P';\nconst objectWithHasOwn = Object as ObjectConstructor & { hasOwn(target: object, key: PropertyKey): boolean };\n\nconst emptyParts = (): DateParts => ({ day: '', month: '', year: '' });\nconst digits = (value: string, max: number) => value.replace(/\\D/g, '').slice(0, max);\nconst hasValueProp = (props: object, key: string) => objectWithHasOwn.hasOwn(props, key);\nconst parseIso = (value?: string) => {\n if (!value || !/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return undefined;\n const next = parse(value, ISO, new Date());\n return isValid(next) && format(next, ISO) === value ? next : undefined;\n};\nconst toParts = (date?: Date): DateParts =>\n date\n ? {\n day: format(date, 'dd'),\n month: format(date, 'MM'),\n year: format(date, 'yyyy'),\n }\n : emptyParts();\nconst toIso = (date?: Date) => (date ? format(date, ISO) : undefined);\n\nconst parseManualDate = ({ day, month, year }: DateParts) => {\n if (day.length !== 2 || month.length !== 2 || year.length !== 4) return undefined;\n const next = parse(`${day}/${month}/${year}`, MANUAL, new Date());\n return isValid(next) && format(next, MANUAL) === `${day}/${month}/${year}` ? next : undefined;\n};\n\nconst previewManualDate = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n const day = parts.day ? Number(parts.day) : Number.NaN;\n\n if (!Number.isInteger(year) || year < 1 || !Number.isInteger(month) || month < 1 || month > 12) return undefined;\n if (!Number.isInteger(day) || day < 1) return undefined;\n\n const maxDay = getDaysInMonth(new Date(year, month - 1, 1));\n if (day > maxDay) return undefined;\n\n const next = new Date(year, month - 1, day);\n return isValid(next) ? next : undefined;\n};\n\nconst latest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? latestDate(values) : undefined;\n};\n\nconst earliest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? earliestDate(values) : undefined;\n};\n\nconst isWithinDayBounds = (date: Date, minDay?: Date, maxDay?: Date) =>\n (!minDay || !isBefore(startOfDay(date), minDay)) && (!maxDay || !isAfter(startOfDay(date), maxDay));\n\nconst coerceWithinDayBounds = (date: Date | undefined, minDay?: Date, maxDay?: Date) =>\n date && isWithinDayBounds(date, minDay, maxDay) ? date : undefined;\n\nconst visibleMonthFromParts = (parts: DateParts, fallbackMonth: Date) => {\n const hasYear = parts.year.length === 4;\n const hasMonth = parts.month.length > 0;\n\n if (!hasYear && !hasMonth) return fallbackMonth;\n\n const year = hasYear ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = hasMonth ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n\n if (!Number.isInteger(year) || year < 1 || year > 9999) return fallbackMonth;\n if (!Number.isInteger(month) || month < 1 || month > 12) return new Date(year, fallbackMonth.getMonth(), 1);\n\n return new Date(year, month - 1, 1);\n};\n\nconst clampMonth = (month: Date, minDay?: Date, maxDay?: Date) => {\n const monthStart = startOfMonth(month);\n const minMonth = minDay ? startOfMonth(minDay) : undefined;\n const maxMonth = maxDay ? startOfMonth(maxDay) : undefined;\n\n if (minMonth && minDay && isBefore(monthStart, minMonth)) return minDay;\n if (maxMonth && maxDay && isAfter(monthStart, maxMonth)) return maxDay;\n return month;\n};\n\nconst maxDayForParts = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year.length === 4 ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month.length > 0 ? Number(parts.month) - 1 : fallbackMonth.getMonth();\n const safeMonth = month >= 0 && month < 12 ? month : fallbackMonth.getMonth();\n return getDaysInMonth(new Date(year, safeMonth, 1));\n};\n\nconst mergeDisabledMatchers = (\n disabled: CalendarProps['disabled'],\n minDay?: Date,\n maxDay?: Date,\n): CalendarProps['disabled'] => {\n const matchers = disabled ? (Array.isArray(disabled) ? [...disabled] : [disabled]) : [];\n if (minDay) matchers.push({ before: minDay });\n if (maxDay) matchers.push({ after: maxDay });\n return matchers.length > 0 ? matchers : undefined;\n};\n\nexport interface DatePickerProps {\n name?: string;\n label?: string;\n description?: React.ReactNode;\n error?: string;\n placeholder?: string;\n value?: DatePickerValue;\n onValueChange?: (value: string | null) => void;\n onChange?: (value: string | null) => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n calendarProps?: CalendarProps;\n className?: string;\n id?: string;\n onBlur?: () => void;\n disabled?: boolean;\n disableInput?: boolean;\n displayFormat?: string;\n minDate?: Date;\n maxDate?: Date;\n}\n\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>((rawProps, ref) => {\n const controlled = hasValueProp(rawProps, 'value');\n const openControlled = hasValueProp(rawProps, 'open');\n const {\n label,\n description,\n error,\n placeholder = 'Select date',\n value,\n onValueChange,\n onChange,\n open: openProp,\n onOpenChange,\n calendarProps,\n className,\n id,\n onBlur,\n disabled,\n disableInput = true,\n displayFormat = DEFAULT_DISPLAY,\n minDate,\n maxDate,\n ...props\n } = rawProps;\n\n const locale = useLocale();\n const formatOptions = locale ? { locale } : undefined;\n\n const parsedValue = parseIso(value);\n const minDay = minDate ? startOfDay(minDate) : undefined;\n const maxDay = maxDate ? startOfDay(maxDate) : undefined;\n const {\n mode: _calendarMode,\n month: _calendarMonth,\n onMonthChange: calendarOnMonthChange,\n startMonth: calendarStartMonth,\n endMonth: calendarEndMonth,\n disabled: calendarDisabledProp,\n captionLayout: _calendarCaptionLayout,\n ...calendarRestProps\n } = calendarProps ?? {};\n\n const [localValue, setLocalValue] = useState<Date | undefined>(() =>\n coerceWithinDayBounds(parsedValue, minDay, maxDay),\n );\n const [openState, setOpenState] = useState(false);\n const [month, setMonth] = useState<Date>(() =>\n clampMonth(parsedValue ?? minDay ?? maxDay ?? new Date(), minDay, maxDay),\n );\n const [draftParts, setDraftParts] = useState<DateParts>(() => toParts(parsedValue));\n const lastInvalidTimeRef = useRef<number | null>(null);\n\n const rawSelected = controlled ? parsedValue : localValue;\n const selected = coerceWithinDayBounds(rawSelected, minDay, maxDay);\n const rawSelectedTime = rawSelected?.getTime() ?? null;\n const minDayTime = minDay?.getTime() ?? null;\n const maxDayTime = maxDay?.getTime() ?? null;\n const selectedTime = selected?.getTime() ?? null;\n const selectedPreview = previewManualDate(draftParts, month);\n const calendarSelected =\n selectedPreview && isWithinDayBounds(selectedPreview, minDay, maxDay) ? selectedPreview : selected;\n const inputId = id ?? props.name ?? 'date';\n const startMonth = latest([minDay, calendarStartMonth]);\n const endMonth = earliest([maxDay, calendarEndMonth]);\n const calendarDisabled = mergeDisabledMatchers(calendarDisabledProp, minDay, maxDay);\n const isOpen = openControlled ? openProp : openState;\n const setOpen = openControlled ? (onOpenChange ?? (() => {})) : setOpenState;\n\n useEffect(() => {\n if (!controlled) return;\n const next = selectedTime === null ? undefined : new Date(selectedTime);\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setDraftParts(toParts(next));\n setMonth((currentMonth) => (next ? next : clampMonth(currentMonth, nextMinDay, nextMaxDay)));\n }, [controlled, selectedTime, minDayTime, maxDayTime]);\n\n useEffect(() => {\n if (rawSelectedTime === null || selectedTime !== null) {\n lastInvalidTimeRef.current = null;\n return;\n }\n if (lastInvalidTimeRef.current === rawSelectedTime) return;\n\n lastInvalidTimeRef.current = rawSelectedTime;\n\n if (!controlled) setLocalValue(undefined);\n setDraftParts(emptyParts());\n\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));\n\n onValueChange?.(null);\n onChange?.(null);\n }, [controlled, rawSelectedTime, selectedTime, minDayTime, maxDayTime, onValueChange, onChange]);\n\n useEffect(() => {\n if (selectedTime !== null) return;\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));\n }, [selectedTime, minDayTime, maxDayTime]);\n\n const emit = (next?: Date) => {\n const iso = toIso(next) ?? null;\n onValueChange?.(iso);\n onChange?.(iso);\n };\n\n const commit = (next?: Date) => {\n if (!controlled) setLocalValue(next);\n setDraftParts(toParts(next));\n setMonth((currentMonth) => (next ? next : clampMonth(currentMonth, minDay, maxDay)));\n emit(next);\n };\n\n const updateDraftDate = (nextParts: DateParts) => {\n setDraftParts(nextParts);\n\n const nextMonth = clampMonth(visibleMonthFromParts(nextParts, month), minDay, maxDay);\n if (nextMonth.getTime() !== month.getTime()) setMonth(nextMonth);\n\n if (!nextParts.day && !nextParts.month && !nextParts.year) {\n commit(undefined);\n return;\n }\n\n const parsedDate = parseManualDate(nextParts);\n if (!parsedDate || !isWithinDayBounds(parsedDate, minDay, maxDay)) return;\n\n commit(parsedDate);\n };\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className=\"relative\">\n <Input\n ref={ref}\n id={inputId}\n value={selected ? format(selected, displayFormat, formatOptions) : ''}\n disabled={disabled}\n readOnly\n aria-invalid={!!error}\n placeholder={placeholder}\n className={`pr-10 ${className ?? ''}`.trim()}\n onClick={() => !disabled && setOpen(true)}\n onBlur={() => onBlur?.()}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowDown') return;\n e.preventDefault();\n setOpen(true);\n }}\n {...props}\n />\n <div className=\"absolute inset-y-0 right-1 flex items-center\">\n <Popover open={isOpen} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Select date\"\n disabled={disabled}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <CalendarIcon />\n <span className=\"sr-only\">Select date</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"end\" sideOffset={10}>\n {!disableInput && (\n <div className=\"border-b p-2\">\n <div className=\"flex items-center justify-center\">\n <div className=\"inline-flex items-center gap-1 rounded-lg border border-border/70 bg-muted/40 p-1\">\n <Input\n value={draftParts.day}\n placeholder=\"DD\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const day = digits(e.target.value, 2);\n if (day === '00') return;\n if (day.length === 2) {\n const nextDay = Number(day);\n if (nextDay < 1 || nextDay > maxDayForParts(draftParts, month)) return;\n }\n updateDraftDate({ ...draftParts, day });\n }}\n />\n <Input\n value={draftParts.month}\n placeholder=\"MM\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const monthValue = digits(e.target.value, 2);\n if (monthValue === '00') return;\n if (monthValue.length === 2) {\n const nextMonth = Number(monthValue);\n if (nextMonth < 1 || nextMonth > 12) return;\n }\n\n let day = draftParts.day;\n if (day.length === 2) {\n const cappedDay = Math.min(\n Number(day),\n maxDayForParts({ ...draftParts, month: monthValue }, month),\n );\n day = String(cappedDay).padStart(2, '0');\n }\n\n updateDraftDate({ ...draftParts, day, month: monthValue });\n }}\n />\n <Input\n value={draftParts.year}\n placeholder=\"YYYY\"\n inputMode=\"numeric\"\n maxLength={4}\n className=\"!h-6 w-16 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => updateDraftDate({ ...draftParts, year: digits(e.target.value, 4) })}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return;\n e.preventDefault();\n updateDraftDate(draftParts);\n setOpen(false);\n }}\n />\n </div>\n </div>\n </div>\n )}\n <Calendar\n {...calendarRestProps}\n locale={calendarRestProps.locale ?? locale}\n mode=\"single\"\n captionLayout=\"label\"\n startMonth={startMonth}\n endMonth={endMonth}\n disabled={calendarDisabled}\n month={month}\n onMonthChange={(nextMonth) => {\n const safeMonth = clampMonth(nextMonth, minDay, maxDay);\n setMonth(safeMonth);\n setDraftParts((current) => ({\n ...current,\n month: format(safeMonth, 'MM', formatOptions),\n year: format(safeMonth, 'yyyy', formatOptions),\n }));\n calendarOnMonthChange?.(safeMonth);\n }}\n selected={calendarSelected}\n onSelect={(next) => {\n // Ignore react-day-picker's toggle-to-undefined when clicking the already-selected date (accidental clear); use manual input to clear\n if (!next) return;\n if (!isWithinDayBounds(next, minDay, maxDay)) return;\n commit(next);\n onBlur?.();\n setOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n </div>\n </div>\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n});\n\nDatePicker.displayName = 'DatePicker';\n"],"names":["latestDate","earliestDate","CalendarIcon","Calendar"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":["../lib/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import {\n min as earliestDate,\n format,\n getDaysInMonth,\n isAfter,\n isBefore,\n isValid,\n max as latestDate,\n parse,\n startOfDay,\n startOfMonth,\n} from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport type React from 'react';\nimport { forwardRef, useEffect, useRef, useState } from 'react';\nimport { Button } from '../../../shadcn/shadcnButton';\nimport { Calendar, type CalendarProps } from '../../../shadcn/shadcnCalendar';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/shadcnPopover';\nimport { useLocale } from '../../hooks/useLocale';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\ntype DatePickerValue = string | undefined;\ntype DateParts = { day: string; month: string; year: string };\n\nconst ISO = 'yyyy-MM-dd';\nconst MANUAL = 'dd/MM/yyyy';\nconst DEFAULT_DISPLAY = 'P';\nconst objectWithHasOwn = Object as ObjectConstructor & { hasOwn(target: object, key: PropertyKey): boolean };\n\nconst emptyParts = (): DateParts => ({ day: '', month: '', year: '' });\nconst digits = (value: string, max: number) => value.replace(/\\D/g, '').slice(0, max);\nconst hasValueProp = (props: object, key: string) => objectWithHasOwn.hasOwn(props, key);\nconst parseIso = (value?: string) => {\n if (!value || !/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return undefined;\n const next = parse(value, ISO, new Date());\n return isValid(next) && format(next, ISO) === value ? next : undefined;\n};\nconst toParts = (date?: Date): DateParts =>\n date\n ? {\n day: format(date, 'dd'),\n month: format(date, 'MM'),\n year: format(date, 'yyyy'),\n }\n : emptyParts();\nconst toIso = (date?: Date) => (date ? format(date, ISO) : undefined);\n\nconst parseManualDate = ({ day, month, year }: DateParts) => {\n if (day.length !== 2 || month.length !== 2 || year.length !== 4) return undefined;\n const next = parse(`${day}/${month}/${year}`, MANUAL, new Date());\n return isValid(next) && format(next, MANUAL) === `${day}/${month}/${year}` ? next : undefined;\n};\n\nconst previewManualDate = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n const day = parts.day ? Number(parts.day) : Number.NaN;\n\n if (!Number.isInteger(year) || year < 1 || !Number.isInteger(month) || month < 1 || month > 12) return undefined;\n if (!Number.isInteger(day) || day < 1) return undefined;\n\n const maxDay = getDaysInMonth(new Date(year, month - 1, 1));\n if (day > maxDay) return undefined;\n\n const next = new Date(year, month - 1, day);\n return isValid(next) ? next : undefined;\n};\n\nconst latest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? latestDate(values) : undefined;\n};\n\nconst earliest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? earliestDate(values) : undefined;\n};\n\nconst isWithinDayBounds = (date: Date, minDay?: Date, maxDay?: Date) =>\n (!minDay || !isBefore(startOfDay(date), minDay)) && (!maxDay || !isAfter(startOfDay(date), maxDay));\n\nconst coerceWithinDayBounds = (date: Date | undefined, minDay?: Date, maxDay?: Date) =>\n date && isWithinDayBounds(date, minDay, maxDay) ? date : undefined;\n\nconst visibleMonthFromParts = (parts: DateParts, fallbackMonth: Date) => {\n const hasYear = parts.year.length === 4;\n const hasMonth = parts.month.length > 0;\n\n if (!hasYear && !hasMonth) return fallbackMonth;\n\n const year = hasYear ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = hasMonth ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n\n if (!Number.isInteger(year) || year < 1 || year > 9999) return fallbackMonth;\n if (!Number.isInteger(month) || month < 1 || month > 12) return new Date(year, fallbackMonth.getMonth(), 1);\n\n return new Date(year, month - 1, 1);\n};\n\nconst clampMonth = (month: Date, minDay?: Date, maxDay?: Date) => {\n const monthStart = startOfMonth(month);\n const minMonth = minDay ? startOfMonth(minDay) : undefined;\n const maxMonth = maxDay ? startOfMonth(maxDay) : undefined;\n\n if (minMonth && minDay && isBefore(monthStart, minMonth)) return minDay;\n if (maxMonth && maxDay && isAfter(monthStart, maxMonth)) return maxDay;\n return month;\n};\n\nconst maxDayForParts = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year.length === 4 ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month.length > 0 ? Number(parts.month) - 1 : fallbackMonth.getMonth();\n const safeMonth = month >= 0 && month < 12 ? month : fallbackMonth.getMonth();\n return getDaysInMonth(new Date(year, safeMonth, 1));\n};\n\nconst mergeDisabledMatchers = (\n disabled: CalendarProps['disabled'],\n minDay?: Date,\n maxDay?: Date,\n): CalendarProps['disabled'] => {\n const matchers = disabled ? (Array.isArray(disabled) ? [...disabled] : [disabled]) : [];\n if (minDay) matchers.push({ before: minDay });\n if (maxDay) matchers.push({ after: maxDay });\n return matchers.length > 0 ? matchers : undefined;\n};\n\nexport interface DatePickerProps {\n name?: string;\n label?: string;\n description?: React.ReactNode;\n error?: string;\n placeholder?: string;\n value?: DatePickerValue;\n onValueChange?: (value: string | null) => void;\n onChange?: (value: string | null) => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n calendarProps?: CalendarProps;\n className?: string;\n id?: string;\n onBlur?: () => void;\n disabled?: boolean;\n disableInput?: boolean;\n displayFormat?: string;\n minDate?: Date;\n maxDate?: Date;\n}\n\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>((rawProps, ref) => {\n const controlled = hasValueProp(rawProps, 'value');\n const openControlled = hasValueProp(rawProps, 'open');\n const {\n label,\n description,\n error,\n placeholder = 'Select date',\n value,\n onValueChange,\n onChange,\n open: openProp,\n onOpenChange,\n calendarProps,\n className,\n id,\n onBlur,\n disabled,\n disableInput = true,\n displayFormat = DEFAULT_DISPLAY,\n minDate,\n maxDate,\n ...props\n } = rawProps;\n\n const locale = useLocale();\n const formatOptions = locale ? { locale } : undefined;\n\n const parsedValue = parseIso(value);\n const minDay = minDate ? startOfDay(minDate) : undefined;\n const maxDay = maxDate ? startOfDay(maxDate) : undefined;\n const {\n mode: _calendarMode,\n month: _calendarMonth,\n onMonthChange: calendarOnMonthChange,\n startMonth: calendarStartMonth,\n endMonth: calendarEndMonth,\n disabled: calendarDisabledProp,\n captionLayout: _calendarCaptionLayout,\n ...calendarRestProps\n } = calendarProps ?? {};\n\n const [localValue, setLocalValue] = useState<Date | undefined>(() =>\n coerceWithinDayBounds(parsedValue, minDay, maxDay),\n );\n const [openState, setOpenState] = useState(false);\n const [month, setMonth] = useState<Date>(() =>\n clampMonth(parsedValue ?? minDay ?? maxDay ?? new Date(), minDay, maxDay),\n );\n const [draftParts, setDraftParts] = useState<DateParts>(() => toParts(parsedValue));\n const lastInvalidTimeRef = useRef<number | null>(null);\n\n const rawSelected = controlled ? parsedValue : localValue;\n const selected = coerceWithinDayBounds(rawSelected, minDay, maxDay);\n const rawSelectedTime = rawSelected?.getTime() ?? null;\n const minDayTime = minDay?.getTime() ?? null;\n const maxDayTime = maxDay?.getTime() ?? null;\n const selectedTime = selected?.getTime() ?? null;\n const selectedPreview = previewManualDate(draftParts, month);\n const calendarSelected =\n selectedPreview && isWithinDayBounds(selectedPreview, minDay, maxDay) ? selectedPreview : selected;\n const inputId = id ?? props.name ?? 'date';\n const startMonth = latest([minDay, calendarStartMonth]);\n const endMonth = earliest([maxDay, calendarEndMonth]);\n const calendarDisabled = mergeDisabledMatchers(calendarDisabledProp, minDay, maxDay);\n const isOpen = openControlled ? openProp : openState;\n const setOpen = openControlled ? (onOpenChange ?? (() => {})) : setOpenState;\n\n useEffect(() => {\n if (!controlled) return;\n const next = selectedTime === null ? undefined : new Date(selectedTime);\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setDraftParts(toParts(next));\n setMonth((currentMonth) => (next ? next : clampMonth(currentMonth, nextMinDay, nextMaxDay)));\n }, [controlled, selectedTime, minDayTime, maxDayTime]);\n\n useEffect(() => {\n if (rawSelectedTime === null || selectedTime !== null) {\n lastInvalidTimeRef.current = null;\n return;\n }\n if (lastInvalidTimeRef.current === rawSelectedTime) return;\n\n lastInvalidTimeRef.current = rawSelectedTime;\n\n if (!controlled) setLocalValue(undefined);\n setDraftParts(emptyParts());\n\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));\n\n onValueChange?.(null);\n onChange?.(null);\n }, [controlled, rawSelectedTime, selectedTime, minDayTime, maxDayTime, onValueChange, onChange]);\n\n useEffect(() => {\n if (selectedTime !== null) return;\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));\n }, [selectedTime, minDayTime, maxDayTime]);\n\n const emit = (next?: Date) => {\n const iso = toIso(next) ?? null;\n onValueChange?.(iso);\n onChange?.(iso);\n };\n\n const commit = (next?: Date) => {\n if (!controlled) setLocalValue(next);\n setDraftParts(toParts(next));\n setMonth((currentMonth) => (next ? next : clampMonth(currentMonth, minDay, maxDay)));\n emit(next);\n };\n\n const updateDraftDate = (nextParts: DateParts) => {\n setDraftParts(nextParts);\n\n const nextMonth = clampMonth(visibleMonthFromParts(nextParts, month), minDay, maxDay);\n if (nextMonth.getTime() !== month.getTime()) setMonth(nextMonth);\n\n if (!nextParts.day && !nextParts.month && !nextParts.year) {\n commit(undefined);\n return;\n }\n\n const parsedDate = parseManualDate(nextParts);\n if (!parsedDate || !isWithinDayBounds(parsedDate, minDay, maxDay)) return;\n\n commit(parsedDate);\n };\n\n return (\n <Field data-disabled={disabled} className={className}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className=\"relative\">\n <Input\n ref={ref}\n id={inputId}\n value={selected ? format(selected, displayFormat, formatOptions) : ''}\n disabled={disabled}\n readOnly\n aria-invalid={!!error}\n placeholder={placeholder}\n className=\"w-full pr-10\"\n onClick={() => !disabled && setOpen(true)}\n onBlur={() => onBlur?.()}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowDown') return;\n e.preventDefault();\n setOpen(true);\n }}\n {...props}\n />\n <div className=\"absolute inset-y-0 right-1 flex items-center\">\n <Popover open={isOpen} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Select date\"\n disabled={disabled}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <CalendarIcon />\n <span className=\"sr-only\">Select date</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"end\" sideOffset={10}>\n {!disableInput && (\n <div className=\"border-b p-2\">\n <div className=\"flex items-center justify-center\">\n <div className=\"inline-flex items-center gap-1 rounded-lg border border-border/70 bg-muted/40 p-1\">\n <Input\n value={draftParts.day}\n placeholder=\"DD\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const day = digits(e.target.value, 2);\n if (day === '00') return;\n if (day.length === 2) {\n const nextDay = Number(day);\n if (nextDay < 1 || nextDay > maxDayForParts(draftParts, month)) return;\n }\n updateDraftDate({ ...draftParts, day });\n }}\n />\n <Input\n value={draftParts.month}\n placeholder=\"MM\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const monthValue = digits(e.target.value, 2);\n if (monthValue === '00') return;\n if (monthValue.length === 2) {\n const nextMonth = Number(monthValue);\n if (nextMonth < 1 || nextMonth > 12) return;\n }\n\n let day = draftParts.day;\n if (day.length === 2) {\n const cappedDay = Math.min(\n Number(day),\n maxDayForParts({ ...draftParts, month: monthValue }, month),\n );\n day = String(cappedDay).padStart(2, '0');\n }\n\n updateDraftDate({ ...draftParts, day, month: monthValue });\n }}\n />\n <Input\n value={draftParts.year}\n placeholder=\"YYYY\"\n inputMode=\"numeric\"\n maxLength={4}\n className=\"!h-6 w-16 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => updateDraftDate({ ...draftParts, year: digits(e.target.value, 4) })}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return;\n e.preventDefault();\n updateDraftDate(draftParts);\n setOpen(false);\n }}\n />\n </div>\n </div>\n </div>\n )}\n <Calendar\n {...calendarRestProps}\n locale={calendarRestProps.locale ?? locale}\n mode=\"single\"\n captionLayout=\"label\"\n startMonth={startMonth}\n endMonth={endMonth}\n disabled={calendarDisabled}\n month={month}\n onMonthChange={(nextMonth) => {\n const safeMonth = clampMonth(nextMonth, minDay, maxDay);\n setMonth(safeMonth);\n setDraftParts((current) => ({\n ...current,\n month: format(safeMonth, 'MM', formatOptions),\n year: format(safeMonth, 'yyyy', formatOptions),\n }));\n calendarOnMonthChange?.(safeMonth);\n }}\n selected={calendarSelected}\n onSelect={(next) => {\n // Ignore react-day-picker's toggle-to-undefined when clicking the already-selected date (accidental clear); use manual input to clear\n if (!next) return;\n if (!isWithinDayBounds(next, minDay, maxDay)) return;\n commit(next);\n onBlur?.();\n setOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n </div>\n </div>\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n});\n\nDatePicker.displayName = 'DatePicker';\n"],"names":["latestDate","earliestDate","CalendarIcon","Calendar"],"mappings":"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"}
|
package/dist/DateTimePicker.js
CHANGED
|
@@ -239,7 +239,7 @@ const DateTimePicker = forwardRef((rawProps, ref) => {
|
|
|
239
239
|
if (!isWithinDateTimeBounds(nextDateTime, minDateTimeValue, maxDateTimeValue)) return;
|
|
240
240
|
commit(nextDateTime);
|
|
241
241
|
};
|
|
242
|
-
return /* @__PURE__ */ jsxs(Field, { "data-disabled": disabled, children: [
|
|
242
|
+
return /* @__PURE__ */ jsxs(Field, { "data-disabled": disabled, className, children: [
|
|
243
243
|
label && /* @__PURE__ */ jsx(FieldLabel, { htmlFor: inputId, children: label }),
|
|
244
244
|
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
245
245
|
/* @__PURE__ */ jsx(
|
|
@@ -252,7 +252,7 @@ const DateTimePicker = forwardRef((rawProps, ref) => {
|
|
|
252
252
|
readOnly: true,
|
|
253
253
|
"aria-invalid": !!error,
|
|
254
254
|
placeholder,
|
|
255
|
-
className:
|
|
255
|
+
className: "w-full pr-10",
|
|
256
256
|
onClick: () => !disabled && setOpen(true),
|
|
257
257
|
onBlur: () => onBlur?.(),
|
|
258
258
|
onKeyDown: (e) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTimePicker.js","sources":["../lib/components/DateTimePicker/DateTimePicker.tsx"],"sourcesContent":["import { TZDate, tz } from '@date-fns/tz';\nimport {\n min as earliestDate,\n format,\n getDaysInMonth,\n isAfter,\n isBefore,\n isValid,\n type Locale,\n max as latestDate,\n parse,\n parseISO,\n startOfDay,\n startOfMonth,\n} from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport type React from 'react';\nimport { forwardRef, useEffect, useRef, useState } from 'react';\nimport { Button } from '../../../shadcn/shadcnButton';\nimport { Calendar, type CalendarProps } from '../../../shadcn/shadcnCalendar';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/shadcnPopover';\nimport { useBUTimezone } from '../../hooks/useBUTimezone';\nimport { useLocale } from '../../hooks/useLocale';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\ntype DateTimePickerValue = string | undefined;\ntype DateParts = { day: string; month: string; year: string };\n\nconst MANUAL_DATE = 'dd/MM/yyyy';\nconst DEFAULT_DISPLAY = 'P p';\nconst DEFAULT_TIME = '00:00';\nconst TIME_PATTERN = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\nconst objectWithHasOwn = Object as ObjectConstructor & { hasOwn(target: object, key: PropertyKey): boolean };\n\nconst emptyParts = (): DateParts => ({ day: '', month: '', year: '' });\nconst digits = (value: string, max: number) => value.replace(/\\D/g, '').slice(0, max);\nconst hasValueProp = (props: object, key: string) => objectWithHasOwn.hasOwn(props, key);\nconst formatInTimeZone = (date: Date, pattern: string, timeZone: string, locale?: Locale) =>\n format(date, pattern, locale ? { in: tz(timeZone), locale } : { in: tz(timeZone) });\nconst parseDateTime = (value?: string) => {\n if (!value) return undefined;\n const next = parseISO(value);\n return isValid(next) ? next : undefined;\n};\nconst toParts = (date?: Date): DateParts =>\n date\n ? {\n day: format(date, 'dd'),\n month: format(date, 'MM'),\n year: format(date, 'yyyy'),\n }\n : emptyParts();\nconst toCalendarDate = (date: Date | undefined, timeZone: string): Date | undefined => {\n if (!date) return undefined;\n\n const year = Number(formatInTimeZone(date, 'yyyy', timeZone));\n const month = Number(formatInTimeZone(date, 'MM', timeZone));\n const day = Number(formatInTimeZone(date, 'dd', timeZone));\n\n return new Date(year, month - 1, day);\n};\nconst toDraftParts = (date: Date | undefined, timeZone: string) => toParts(toCalendarDate(date, timeZone));\nconst toTime = (date: Date | undefined, timeZone: string) => (date ? formatInTimeZone(date, 'HH:mm', timeZone) : '');\nconst toIso = (date?: Date) => (date ? date.toISOString() : undefined);\n\nconst parseManualDate = ({ day, month, year }: DateParts) => {\n if (day.length !== 2 || month.length !== 2 || year.length !== 4) return undefined;\n const next = parse(`${day}/${month}/${year}`, MANUAL_DATE, new Date());\n return isValid(next) && format(next, MANUAL_DATE) === `${day}/${month}/${year}` ? next : undefined;\n};\n\nconst previewManualDate = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n const day = parts.day ? Number(parts.day) : Number.NaN;\n\n if (!Number.isInteger(year) || year < 1 || !Number.isInteger(month) || month < 1 || month > 12) return undefined;\n if (!Number.isInteger(day) || day < 1) return undefined;\n\n const maxDay = getDaysInMonth(new Date(year, month - 1, 1));\n if (day > maxDay) return undefined;\n\n const next = new Date(year, month - 1, day);\n return isValid(next) ? next : undefined;\n};\n\nconst withTime = (date: Date, time: string, timeZone: string) => {\n const [hours, minutes] = TIME_PATTERN.test(time) ? time.split(':').map(Number) : [0, 0];\n const zonedDateTime = TZDate.tz(timeZone, date.getFullYear(), date.getMonth(), date.getDate(), hours, minutes, 0, 0);\n return new Date(zonedDateTime.getTime());\n};\n\nconst latest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? latestDate(values) : undefined;\n};\n\nconst earliest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? earliestDate(values) : undefined;\n};\n\nconst isWithinDayBounds = (date: Date, minDay?: Date, maxDay?: Date) =>\n (!minDay || !isBefore(startOfDay(date), minDay)) && (!maxDay || !isAfter(startOfDay(date), maxDay));\n\nconst isWithinDateTimeBounds = (date: Date, minDateTime?: Date, maxDateTime?: Date) =>\n (!minDateTime || !isBefore(date, minDateTime)) && (!maxDateTime || !isAfter(date, maxDateTime));\n\nconst coerceWithinDateTimeBounds = (\n date: Date | undefined,\n minDay: Date | undefined,\n maxDay: Date | undefined,\n minDateTime: Date | undefined,\n maxDateTime: Date | undefined,\n timeZone: string,\n) =>\n date &&\n isWithinDayBounds(toCalendarDate(date, timeZone) ?? date, minDay, maxDay) &&\n isWithinDateTimeBounds(date, minDateTime, maxDateTime)\n ? date\n : undefined;\n\nconst visibleMonthFromParts = (parts: DateParts, fallbackMonth: Date) => {\n const hasYear = parts.year.length === 4;\n const hasMonth = parts.month.length > 0;\n\n if (!hasYear && !hasMonth) return fallbackMonth;\n\n const year = hasYear ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = hasMonth ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n\n if (!Number.isInteger(year) || year < 1 || year > 9999) return fallbackMonth;\n if (!Number.isInteger(month) || month < 1 || month > 12) return new Date(year, fallbackMonth.getMonth(), 1);\n\n return new Date(year, month - 1, 1);\n};\n\nconst clampMonth = (month: Date, minDay?: Date, maxDay?: Date) => {\n const monthStart = startOfMonth(month);\n const minMonth = minDay ? startOfMonth(minDay) : undefined;\n const maxMonth = maxDay ? startOfMonth(maxDay) : undefined;\n\n if (minMonth && minDay && isBefore(monthStart, minMonth)) return minDay;\n if (maxMonth && maxDay && isAfter(monthStart, maxMonth)) return maxDay;\n return month;\n};\n\nconst maxDayForParts = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year.length === 4 ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month.length > 0 ? Number(parts.month) - 1 : fallbackMonth.getMonth();\n const safeMonth = month >= 0 && month < 12 ? month : fallbackMonth.getMonth();\n return getDaysInMonth(new Date(year, safeMonth, 1));\n};\n\nconst mergeDisabledMatchers = (\n disabled: CalendarProps['disabled'],\n minDay?: Date,\n maxDay?: Date,\n): CalendarProps['disabled'] => {\n const matchers = disabled ? (Array.isArray(disabled) ? [...disabled] : [disabled]) : [];\n if (minDay) matchers.push({ before: minDay });\n if (maxDay) matchers.push({ after: maxDay });\n return matchers.length > 0 ? matchers : undefined;\n};\n\nexport interface DateTimePickerProps {\n name?: string;\n label?: string;\n description?: React.ReactNode;\n error?: string;\n placeholder?: string;\n value?: DateTimePickerValue;\n onValueChange?: (value: string | undefined) => void;\n onChange?: (value: string | undefined) => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n calendarProps?: CalendarProps;\n className?: string;\n id?: string;\n onBlur?: () => void;\n disabled?: boolean;\n displayFormat?: string;\n minDate?: Date;\n maxDate?: Date;\n minDateTime?: string;\n maxDateTime?: string;\n}\n\nexport const DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>((rawProps, ref) => {\n const controlled = hasValueProp(rawProps, 'value');\n const openControlled = hasValueProp(rawProps, 'open');\n const {\n label,\n description,\n error,\n placeholder = 'Select date and time',\n value,\n onValueChange,\n onChange,\n open: openProp,\n onOpenChange,\n calendarProps,\n className,\n id,\n onBlur,\n disabled,\n displayFormat = DEFAULT_DISPLAY,\n minDate,\n maxDate,\n minDateTime,\n maxDateTime,\n ...props\n } = rawProps;\n\n const locale = useLocale();\n const timeZone = useBUTimezone() ?? 'UTC';\n const parsedValue = parseDateTime(value);\n const minDateTimeValue = parseDateTime(minDateTime);\n const maxDateTimeValue = parseDateTime(maxDateTime);\n const minDay = latest([minDate ? startOfDay(minDate) : undefined, toCalendarDate(minDateTimeValue, timeZone)]);\n const maxDay = earliest([maxDate ? startOfDay(maxDate) : undefined, toCalendarDate(maxDateTimeValue, timeZone)]);\n const {\n mode: _calendarMode,\n month: _calendarMonth,\n onMonthChange: calendarOnMonthChange,\n startMonth: calendarStartMonth,\n endMonth: calendarEndMonth,\n disabled: calendarDisabledProp,\n captionLayout: _calendarCaptionLayout,\n ...calendarRestProps\n } = calendarProps ?? {};\n\n const [localValue, setLocalValue] = useState<Date | undefined>(() =>\n coerceWithinDateTimeBounds(parsedValue, minDay, maxDay, minDateTimeValue, maxDateTimeValue, timeZone),\n );\n const [openState, setOpenState] = useState(false);\n const [month, setMonth] = useState<Date>(() =>\n clampMonth(toCalendarDate(parsedValue, timeZone) ?? minDay ?? maxDay ?? new Date(), minDay, maxDay),\n );\n const [draftParts, setDraftParts] = useState<DateParts>(() => toDraftParts(parsedValue, timeZone));\n const [draftTime, setDraftTime] = useState(() => toTime(parsedValue, timeZone));\n const lastInvalidTimeRef = useRef<number | null>(null);\n\n const rawSelected = controlled ? parsedValue : localValue;\n const selected = coerceWithinDateTimeBounds(\n rawSelected,\n minDay,\n maxDay,\n minDateTimeValue,\n maxDateTimeValue,\n timeZone,\n );\n const selectedCalendarDate = toCalendarDate(selected, timeZone);\n const rawSelectedTime = rawSelected?.getTime() ?? null;\n const minDayTime = minDay?.getTime() ?? null;\n const maxDayTime = maxDay?.getTime() ?? null;\n const selectedTime = selected?.getTime() ?? null;\n const selectedPreview = previewManualDate(draftParts, month);\n const calendarSelected =\n selectedPreview && isWithinDayBounds(selectedPreview, minDay, maxDay) ? selectedPreview : selectedCalendarDate;\n const activeDate = calendarSelected;\n const inputId = id ?? props.name ?? 'date-time';\n const startMonth = latest([minDay, calendarStartMonth]);\n const endMonth = earliest([maxDay, calendarEndMonth]);\n const calendarDisabled = mergeDisabledMatchers(calendarDisabledProp, minDay, maxDay);\n const isOpen = openControlled ? openProp : openState;\n const setOpen = openControlled ? (onOpenChange ?? (() => {})) : setOpenState;\n\n const syncDraftFromDate = (next?: Date) => {\n const nextCalendarDate = toCalendarDate(next, timeZone);\n setDraftParts(toDraftParts(next, timeZone));\n setDraftTime(toTime(next, timeZone));\n setMonth((currentMonth) => (nextCalendarDate ? nextCalendarDate : clampMonth(currentMonth, minDay, maxDay)));\n };\n\n useEffect(() => {\n if (!controlled && selectedTime === null) return;\n\n const next = selectedTime === null ? undefined : new Date(selectedTime);\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n const nextCalendarDate = toCalendarDate(next, timeZone);\n\n setDraftParts(toDraftParts(next, timeZone));\n setDraftTime(toTime(next, timeZone));\n setMonth((currentMonth) =>\n nextCalendarDate ? nextCalendarDate : clampMonth(currentMonth, nextMinDay, nextMaxDay),\n );\n }, [controlled, selectedTime, minDayTime, maxDayTime, timeZone]);\n\n useEffect(() => {\n if (rawSelectedTime === null || selectedTime !== null) {\n lastInvalidTimeRef.current = null;\n return;\n }\n if (lastInvalidTimeRef.current === rawSelectedTime) return;\n\n lastInvalidTimeRef.current = rawSelectedTime;\n\n if (!controlled) setLocalValue(undefined);\n setDraftParts(emptyParts());\n setDraftTime('');\n\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));\n\n onValueChange?.(undefined);\n onChange?.(undefined);\n }, [controlled, rawSelectedTime, selectedTime, minDayTime, maxDayTime, onValueChange, onChange]);\n\n const emit = (next?: Date) => {\n const iso = toIso(next);\n onValueChange?.(iso);\n onChange?.(iso);\n };\n\n const commit = (next?: Date) => {\n if (!controlled) setLocalValue(next);\n syncDraftFromDate(next);\n emit(next);\n };\n\n const updateDraftDate = (nextParts: DateParts) => {\n setDraftParts(nextParts);\n\n const nextMonth = clampMonth(visibleMonthFromParts(nextParts, month), minDay, maxDay);\n if (nextMonth.getTime() !== month.getTime()) setMonth(nextMonth);\n\n if (!nextParts.day && !nextParts.month && !nextParts.year) {\n commit(undefined);\n return;\n }\n\n const parsedDate = parseManualDate(nextParts);\n if (!parsedDate || !isWithinDayBounds(parsedDate, minDay, maxDay)) return;\n\n const nextDateTime = withTime(parsedDate, draftTime || DEFAULT_TIME, timeZone);\n if (!isWithinDateTimeBounds(nextDateTime, minDateTimeValue, maxDateTimeValue)) return;\n\n commit(nextDateTime);\n };\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className=\"relative\">\n <Input\n ref={ref}\n id={inputId}\n value={selected ? formatInTimeZone(selected, displayFormat, timeZone, locale) : ''}\n disabled={disabled}\n readOnly\n aria-invalid={!!error}\n placeholder={placeholder}\n className={`pr-10 ${className ?? ''}`.trim()}\n onClick={() => !disabled && setOpen(true)}\n onBlur={() => onBlur?.()}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowDown') return;\n e.preventDefault();\n setOpen(true);\n }}\n {...props}\n />\n <div className=\"absolute inset-y-0 right-1 flex items-center\">\n <Popover open={isOpen} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Select date and time\"\n disabled={disabled}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <CalendarIcon />\n <span className=\"sr-only\">Select date and time</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"end\" sideOffset={10}>\n <div className=\"border-b p-2\">\n <div className=\"flex items-center justify-center\">\n <div className=\"inline-flex items-center gap-1 rounded-lg border border-border/70 bg-muted/40 p-1\">\n <Input\n value={draftParts.day}\n placeholder=\"DD\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const day = digits(e.target.value, 2);\n if (day === '00') return;\n if (day.length === 2) {\n const nextDay = Number(day);\n if (nextDay < 1 || nextDay > maxDayForParts(draftParts, month)) return;\n }\n updateDraftDate({ ...draftParts, day });\n }}\n />\n <Input\n value={draftParts.month}\n placeholder=\"MM\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const monthValue = digits(e.target.value, 2);\n if (monthValue === '00') return;\n if (monthValue.length === 2) {\n const nextMonth = Number(monthValue);\n if (nextMonth < 1 || nextMonth > 12) return;\n }\n\n let day = draftParts.day;\n if (day.length === 2) {\n const cappedDay = Math.min(\n Number(day),\n maxDayForParts({ ...draftParts, month: monthValue }, month),\n );\n day = String(cappedDay).padStart(2, '0');\n }\n\n updateDraftDate({ ...draftParts, day, month: monthValue });\n }}\n />\n <Input\n value={draftParts.year}\n placeholder=\"YYYY\"\n inputMode=\"numeric\"\n maxLength={4}\n className=\"!h-6 w-16 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => updateDraftDate({ ...draftParts, year: digits(e.target.value, 4) })}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return;\n e.preventDefault();\n updateDraftDate(draftParts);\n }}\n />\n </div>\n </div>\n </div>\n <Calendar\n {...calendarRestProps}\n locale={locale}\n mode=\"single\"\n captionLayout=\"label\"\n startMonth={startMonth}\n endMonth={endMonth}\n disabled={calendarDisabled}\n month={month}\n onMonthChange={(nextMonth) => {\n const safeMonth = clampMonth(nextMonth, minDay, maxDay);\n setMonth(safeMonth);\n setDraftParts((current) => ({\n ...current,\n month: format(safeMonth, 'MM'),\n year: format(safeMonth, 'yyyy'),\n }));\n calendarOnMonthChange?.(safeMonth);\n }}\n selected={calendarSelected}\n onSelect={(next) => {\n if (!next) {\n commit(undefined);\n return;\n }\n if (!isWithinDayBounds(next, minDay, maxDay)) return;\n\n setMonth(next);\n setDraftParts(toParts(next));\n\n const nextDateTime = withTime(next, draftTime || DEFAULT_TIME, timeZone);\n if (!isWithinDateTimeBounds(nextDateTime, minDateTimeValue, maxDateTimeValue)) return;\n\n commit(nextDateTime);\n onBlur?.();\n }}\n />\n <div className=\"border-t p-2\">\n <div className=\"flex items-center justify-center gap-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">Time</span>\n <Input\n type=\"time\"\n step={60}\n value={draftTime}\n disabled={disabled || !activeDate}\n className=\"h-7 w-[112px] appearance-none pr-2 [color-scheme:light] [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-clear-button]:hidden [&::-webkit-inner-spin-button]:hidden\"\n onChange={(e) => {\n const nextTime = e.target.value;\n setDraftTime(nextTime);\n\n if (!activeDate || !TIME_PATTERN.test(nextTime)) return;\n\n const nextDateTime = withTime(activeDate, nextTime, timeZone);\n if (!isWithinDateTimeBounds(nextDateTime, minDateTimeValue, maxDateTimeValue)) return;\n\n commit(nextDateTime);\n }}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return;\n e.preventDefault();\n\n if (activeDate && TIME_PATTERN.test(draftTime)) {\n const nextDateTime = withTime(activeDate, draftTime, timeZone);\n if (isWithinDateTimeBounds(nextDateTime, minDateTimeValue, maxDateTimeValue)) {\n commit(nextDateTime);\n }\n }\n\n onBlur?.();\n setOpen(false);\n }}\n />\n </div>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n </div>\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n});\n\nDateTimePicker.displayName = 'DateTimePicker';\n"],"names":["latestDate","earliestDate","CalendarIcon","Calendar"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DateTimePicker.js","sources":["../lib/components/DateTimePicker/DateTimePicker.tsx"],"sourcesContent":["import { TZDate, tz } from '@date-fns/tz';\nimport {\n min as earliestDate,\n format,\n getDaysInMonth,\n isAfter,\n isBefore,\n isValid,\n type Locale,\n max as latestDate,\n parse,\n parseISO,\n startOfDay,\n startOfMonth,\n} from 'date-fns';\nimport { CalendarIcon } from 'lucide-react';\nimport type React from 'react';\nimport { forwardRef, useEffect, useRef, useState } from 'react';\nimport { Button } from '../../../shadcn/shadcnButton';\nimport { Calendar, type CalendarProps } from '../../../shadcn/shadcnCalendar';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/shadcnPopover';\nimport { useBUTimezone } from '../../hooks/useBUTimezone';\nimport { useLocale } from '../../hooks/useLocale';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\ntype DateTimePickerValue = string | undefined;\ntype DateParts = { day: string; month: string; year: string };\n\nconst MANUAL_DATE = 'dd/MM/yyyy';\nconst DEFAULT_DISPLAY = 'P p';\nconst DEFAULT_TIME = '00:00';\nconst TIME_PATTERN = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\nconst objectWithHasOwn = Object as ObjectConstructor & { hasOwn(target: object, key: PropertyKey): boolean };\n\nconst emptyParts = (): DateParts => ({ day: '', month: '', year: '' });\nconst digits = (value: string, max: number) => value.replace(/\\D/g, '').slice(0, max);\nconst hasValueProp = (props: object, key: string) => objectWithHasOwn.hasOwn(props, key);\nconst formatInTimeZone = (date: Date, pattern: string, timeZone: string, locale?: Locale) =>\n format(date, pattern, locale ? { in: tz(timeZone), locale } : { in: tz(timeZone) });\nconst parseDateTime = (value?: string) => {\n if (!value) return undefined;\n const next = parseISO(value);\n return isValid(next) ? next : undefined;\n};\nconst toParts = (date?: Date): DateParts =>\n date\n ? {\n day: format(date, 'dd'),\n month: format(date, 'MM'),\n year: format(date, 'yyyy'),\n }\n : emptyParts();\nconst toCalendarDate = (date: Date | undefined, timeZone: string): Date | undefined => {\n if (!date) return undefined;\n\n const year = Number(formatInTimeZone(date, 'yyyy', timeZone));\n const month = Number(formatInTimeZone(date, 'MM', timeZone));\n const day = Number(formatInTimeZone(date, 'dd', timeZone));\n\n return new Date(year, month - 1, day);\n};\nconst toDraftParts = (date: Date | undefined, timeZone: string) => toParts(toCalendarDate(date, timeZone));\nconst toTime = (date: Date | undefined, timeZone: string) => (date ? formatInTimeZone(date, 'HH:mm', timeZone) : '');\nconst toIso = (date?: Date) => (date ? date.toISOString() : undefined);\n\nconst parseManualDate = ({ day, month, year }: DateParts) => {\n if (day.length !== 2 || month.length !== 2 || year.length !== 4) return undefined;\n const next = parse(`${day}/${month}/${year}`, MANUAL_DATE, new Date());\n return isValid(next) && format(next, MANUAL_DATE) === `${day}/${month}/${year}` ? next : undefined;\n};\n\nconst previewManualDate = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n const day = parts.day ? Number(parts.day) : Number.NaN;\n\n if (!Number.isInteger(year) || year < 1 || !Number.isInteger(month) || month < 1 || month > 12) return undefined;\n if (!Number.isInteger(day) || day < 1) return undefined;\n\n const maxDay = getDaysInMonth(new Date(year, month - 1, 1));\n if (day > maxDay) return undefined;\n\n const next = new Date(year, month - 1, day);\n return isValid(next) ? next : undefined;\n};\n\nconst withTime = (date: Date, time: string, timeZone: string) => {\n const [hours, minutes] = TIME_PATTERN.test(time) ? time.split(':').map(Number) : [0, 0];\n const zonedDateTime = TZDate.tz(timeZone, date.getFullYear(), date.getMonth(), date.getDate(), hours, minutes, 0, 0);\n return new Date(zonedDateTime.getTime());\n};\n\nconst latest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? latestDate(values) : undefined;\n};\n\nconst earliest = (dates: Array<Date | undefined>) => {\n const values = dates.filter((value): value is Date => !!value);\n return values.length > 0 ? earliestDate(values) : undefined;\n};\n\nconst isWithinDayBounds = (date: Date, minDay?: Date, maxDay?: Date) =>\n (!minDay || !isBefore(startOfDay(date), minDay)) && (!maxDay || !isAfter(startOfDay(date), maxDay));\n\nconst isWithinDateTimeBounds = (date: Date, minDateTime?: Date, maxDateTime?: Date) =>\n (!minDateTime || !isBefore(date, minDateTime)) && (!maxDateTime || !isAfter(date, maxDateTime));\n\nconst coerceWithinDateTimeBounds = (\n date: Date | undefined,\n minDay: Date | undefined,\n maxDay: Date | undefined,\n minDateTime: Date | undefined,\n maxDateTime: Date | undefined,\n timeZone: string,\n) =>\n date &&\n isWithinDayBounds(toCalendarDate(date, timeZone) ?? date, minDay, maxDay) &&\n isWithinDateTimeBounds(date, minDateTime, maxDateTime)\n ? date\n : undefined;\n\nconst visibleMonthFromParts = (parts: DateParts, fallbackMonth: Date) => {\n const hasYear = parts.year.length === 4;\n const hasMonth = parts.month.length > 0;\n\n if (!hasYear && !hasMonth) return fallbackMonth;\n\n const year = hasYear ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = hasMonth ? Number(parts.month) : fallbackMonth.getMonth() + 1;\n\n if (!Number.isInteger(year) || year < 1 || year > 9999) return fallbackMonth;\n if (!Number.isInteger(month) || month < 1 || month > 12) return new Date(year, fallbackMonth.getMonth(), 1);\n\n return new Date(year, month - 1, 1);\n};\n\nconst clampMonth = (month: Date, minDay?: Date, maxDay?: Date) => {\n const monthStart = startOfMonth(month);\n const minMonth = minDay ? startOfMonth(minDay) : undefined;\n const maxMonth = maxDay ? startOfMonth(maxDay) : undefined;\n\n if (minMonth && minDay && isBefore(monthStart, minMonth)) return minDay;\n if (maxMonth && maxDay && isAfter(monthStart, maxMonth)) return maxDay;\n return month;\n};\n\nconst maxDayForParts = (parts: DateParts, fallbackMonth: Date) => {\n const year = parts.year.length === 4 ? Number(parts.year) : fallbackMonth.getFullYear();\n const month = parts.month.length > 0 ? Number(parts.month) - 1 : fallbackMonth.getMonth();\n const safeMonth = month >= 0 && month < 12 ? month : fallbackMonth.getMonth();\n return getDaysInMonth(new Date(year, safeMonth, 1));\n};\n\nconst mergeDisabledMatchers = (\n disabled: CalendarProps['disabled'],\n minDay?: Date,\n maxDay?: Date,\n): CalendarProps['disabled'] => {\n const matchers = disabled ? (Array.isArray(disabled) ? [...disabled] : [disabled]) : [];\n if (minDay) matchers.push({ before: minDay });\n if (maxDay) matchers.push({ after: maxDay });\n return matchers.length > 0 ? matchers : undefined;\n};\n\nexport interface DateTimePickerProps {\n name?: string;\n label?: string;\n description?: React.ReactNode;\n error?: string;\n placeholder?: string;\n value?: DateTimePickerValue;\n onValueChange?: (value: string | undefined) => void;\n onChange?: (value: string | undefined) => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n calendarProps?: CalendarProps;\n className?: string;\n id?: string;\n onBlur?: () => void;\n disabled?: boolean;\n displayFormat?: string;\n minDate?: Date;\n maxDate?: Date;\n minDateTime?: string;\n maxDateTime?: string;\n}\n\nexport const DateTimePicker = forwardRef<HTMLInputElement, DateTimePickerProps>((rawProps, ref) => {\n const controlled = hasValueProp(rawProps, 'value');\n const openControlled = hasValueProp(rawProps, 'open');\n const {\n label,\n description,\n error,\n placeholder = 'Select date and time',\n value,\n onValueChange,\n onChange,\n open: openProp,\n onOpenChange,\n calendarProps,\n className,\n id,\n onBlur,\n disabled,\n displayFormat = DEFAULT_DISPLAY,\n minDate,\n maxDate,\n minDateTime,\n maxDateTime,\n ...props\n } = rawProps;\n\n const locale = useLocale();\n const timeZone = useBUTimezone() ?? 'UTC';\n const parsedValue = parseDateTime(value);\n const minDateTimeValue = parseDateTime(minDateTime);\n const maxDateTimeValue = parseDateTime(maxDateTime);\n const minDay = latest([minDate ? startOfDay(minDate) : undefined, toCalendarDate(minDateTimeValue, timeZone)]);\n const maxDay = earliest([maxDate ? startOfDay(maxDate) : undefined, toCalendarDate(maxDateTimeValue, timeZone)]);\n const {\n mode: _calendarMode,\n month: _calendarMonth,\n onMonthChange: calendarOnMonthChange,\n startMonth: calendarStartMonth,\n endMonth: calendarEndMonth,\n disabled: calendarDisabledProp,\n captionLayout: _calendarCaptionLayout,\n ...calendarRestProps\n } = calendarProps ?? {};\n\n const [localValue, setLocalValue] = useState<Date | undefined>(() =>\n coerceWithinDateTimeBounds(parsedValue, minDay, maxDay, minDateTimeValue, maxDateTimeValue, timeZone),\n );\n const [openState, setOpenState] = useState(false);\n const [month, setMonth] = useState<Date>(() =>\n clampMonth(toCalendarDate(parsedValue, timeZone) ?? minDay ?? maxDay ?? new Date(), minDay, maxDay),\n );\n const [draftParts, setDraftParts] = useState<DateParts>(() => toDraftParts(parsedValue, timeZone));\n const [draftTime, setDraftTime] = useState(() => toTime(parsedValue, timeZone));\n const lastInvalidTimeRef = useRef<number | null>(null);\n\n const rawSelected = controlled ? parsedValue : localValue;\n const selected = coerceWithinDateTimeBounds(\n rawSelected,\n minDay,\n maxDay,\n minDateTimeValue,\n maxDateTimeValue,\n timeZone,\n );\n const selectedCalendarDate = toCalendarDate(selected, timeZone);\n const rawSelectedTime = rawSelected?.getTime() ?? null;\n const minDayTime = minDay?.getTime() ?? null;\n const maxDayTime = maxDay?.getTime() ?? null;\n const selectedTime = selected?.getTime() ?? null;\n const selectedPreview = previewManualDate(draftParts, month);\n const calendarSelected =\n selectedPreview && isWithinDayBounds(selectedPreview, minDay, maxDay) ? selectedPreview : selectedCalendarDate;\n const activeDate = calendarSelected;\n const inputId = id ?? props.name ?? 'date-time';\n const startMonth = latest([minDay, calendarStartMonth]);\n const endMonth = earliest([maxDay, calendarEndMonth]);\n const calendarDisabled = mergeDisabledMatchers(calendarDisabledProp, minDay, maxDay);\n const isOpen = openControlled ? openProp : openState;\n const setOpen = openControlled ? (onOpenChange ?? (() => {})) : setOpenState;\n\n const syncDraftFromDate = (next?: Date) => {\n const nextCalendarDate = toCalendarDate(next, timeZone);\n setDraftParts(toDraftParts(next, timeZone));\n setDraftTime(toTime(next, timeZone));\n setMonth((currentMonth) => (nextCalendarDate ? nextCalendarDate : clampMonth(currentMonth, minDay, maxDay)));\n };\n\n useEffect(() => {\n if (!controlled && selectedTime === null) return;\n\n const next = selectedTime === null ? undefined : new Date(selectedTime);\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n const nextCalendarDate = toCalendarDate(next, timeZone);\n\n setDraftParts(toDraftParts(next, timeZone));\n setDraftTime(toTime(next, timeZone));\n setMonth((currentMonth) =>\n nextCalendarDate ? nextCalendarDate : clampMonth(currentMonth, nextMinDay, nextMaxDay),\n );\n }, [controlled, selectedTime, minDayTime, maxDayTime, timeZone]);\n\n useEffect(() => {\n if (rawSelectedTime === null || selectedTime !== null) {\n lastInvalidTimeRef.current = null;\n return;\n }\n if (lastInvalidTimeRef.current === rawSelectedTime) return;\n\n lastInvalidTimeRef.current = rawSelectedTime;\n\n if (!controlled) setLocalValue(undefined);\n setDraftParts(emptyParts());\n setDraftTime('');\n\n const nextMinDay = minDayTime === null ? undefined : new Date(minDayTime);\n const nextMaxDay = maxDayTime === null ? undefined : new Date(maxDayTime);\n setMonth((currentMonth) => clampMonth(currentMonth, nextMinDay, nextMaxDay));\n\n onValueChange?.(undefined);\n onChange?.(undefined);\n }, [controlled, rawSelectedTime, selectedTime, minDayTime, maxDayTime, onValueChange, onChange]);\n\n const emit = (next?: Date) => {\n const iso = toIso(next);\n onValueChange?.(iso);\n onChange?.(iso);\n };\n\n const commit = (next?: Date) => {\n if (!controlled) setLocalValue(next);\n syncDraftFromDate(next);\n emit(next);\n };\n\n const updateDraftDate = (nextParts: DateParts) => {\n setDraftParts(nextParts);\n\n const nextMonth = clampMonth(visibleMonthFromParts(nextParts, month), minDay, maxDay);\n if (nextMonth.getTime() !== month.getTime()) setMonth(nextMonth);\n\n if (!nextParts.day && !nextParts.month && !nextParts.year) {\n commit(undefined);\n return;\n }\n\n const parsedDate = parseManualDate(nextParts);\n if (!parsedDate || !isWithinDayBounds(parsedDate, minDay, maxDay)) return;\n\n const nextDateTime = withTime(parsedDate, draftTime || DEFAULT_TIME, timeZone);\n if (!isWithinDateTimeBounds(nextDateTime, minDateTimeValue, maxDateTimeValue)) return;\n\n commit(nextDateTime);\n };\n\n return (\n <Field data-disabled={disabled} className={className}>\n {label && <FieldLabel htmlFor={inputId}>{label}</FieldLabel>}\n <div className=\"relative\">\n <Input\n ref={ref}\n id={inputId}\n value={selected ? formatInTimeZone(selected, displayFormat, timeZone, locale) : ''}\n disabled={disabled}\n readOnly\n aria-invalid={!!error}\n placeholder={placeholder}\n className=\"w-full pr-10\"\n onClick={() => !disabled && setOpen(true)}\n onBlur={() => onBlur?.()}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowDown') return;\n e.preventDefault();\n setOpen(true);\n }}\n {...props}\n />\n <div className=\"absolute inset-y-0 right-1 flex items-center\">\n <Popover open={isOpen} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label=\"Select date and time\"\n disabled={disabled}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <CalendarIcon />\n <span className=\"sr-only\">Select date and time</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"end\" sideOffset={10}>\n <div className=\"border-b p-2\">\n <div className=\"flex items-center justify-center\">\n <div className=\"inline-flex items-center gap-1 rounded-lg border border-border/70 bg-muted/40 p-1\">\n <Input\n value={draftParts.day}\n placeholder=\"DD\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const day = digits(e.target.value, 2);\n if (day === '00') return;\n if (day.length === 2) {\n const nextDay = Number(day);\n if (nextDay < 1 || nextDay > maxDayForParts(draftParts, month)) return;\n }\n updateDraftDate({ ...draftParts, day });\n }}\n />\n <Input\n value={draftParts.month}\n placeholder=\"MM\"\n inputMode=\"numeric\"\n maxLength={2}\n className=\"!h-6 w-10 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => {\n const monthValue = digits(e.target.value, 2);\n if (monthValue === '00') return;\n if (monthValue.length === 2) {\n const nextMonth = Number(monthValue);\n if (nextMonth < 1 || nextMonth > 12) return;\n }\n\n let day = draftParts.day;\n if (day.length === 2) {\n const cappedDay = Math.min(\n Number(day),\n maxDayForParts({ ...draftParts, month: monthValue }, month),\n );\n day = String(cappedDay).padStart(2, '0');\n }\n\n updateDraftDate({ ...draftParts, day, month: monthValue });\n }}\n />\n <Input\n value={draftParts.year}\n placeholder=\"YYYY\"\n inputMode=\"numeric\"\n maxLength={4}\n className=\"!h-6 w-16 rounded-md border-transparent bg-background px-1.5 py-0 text-center text-xs font-semibold shadow-xs\"\n onChange={(e) => updateDraftDate({ ...draftParts, year: digits(e.target.value, 4) })}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return;\n e.preventDefault();\n updateDraftDate(draftParts);\n }}\n />\n </div>\n </div>\n </div>\n <Calendar\n {...calendarRestProps}\n locale={locale}\n mode=\"single\"\n captionLayout=\"label\"\n startMonth={startMonth}\n endMonth={endMonth}\n disabled={calendarDisabled}\n month={month}\n onMonthChange={(nextMonth) => {\n const safeMonth = clampMonth(nextMonth, minDay, maxDay);\n setMonth(safeMonth);\n setDraftParts((current) => ({\n ...current,\n month: format(safeMonth, 'MM'),\n year: format(safeMonth, 'yyyy'),\n }));\n calendarOnMonthChange?.(safeMonth);\n }}\n selected={calendarSelected}\n onSelect={(next) => {\n if (!next) {\n commit(undefined);\n return;\n }\n if (!isWithinDayBounds(next, minDay, maxDay)) return;\n\n setMonth(next);\n setDraftParts(toParts(next));\n\n const nextDateTime = withTime(next, draftTime || DEFAULT_TIME, timeZone);\n if (!isWithinDateTimeBounds(nextDateTime, minDateTimeValue, maxDateTimeValue)) return;\n\n commit(nextDateTime);\n onBlur?.();\n }}\n />\n <div className=\"border-t p-2\">\n <div className=\"flex items-center justify-center gap-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">Time</span>\n <Input\n type=\"time\"\n step={60}\n value={draftTime}\n disabled={disabled || !activeDate}\n className=\"h-7 w-[112px] appearance-none pr-2 [color-scheme:light] [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-clear-button]:hidden [&::-webkit-inner-spin-button]:hidden\"\n onChange={(e) => {\n const nextTime = e.target.value;\n setDraftTime(nextTime);\n\n if (!activeDate || !TIME_PATTERN.test(nextTime)) return;\n\n const nextDateTime = withTime(activeDate, nextTime, timeZone);\n if (!isWithinDateTimeBounds(nextDateTime, minDateTimeValue, maxDateTimeValue)) return;\n\n commit(nextDateTime);\n }}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return;\n e.preventDefault();\n\n if (activeDate && TIME_PATTERN.test(draftTime)) {\n const nextDateTime = withTime(activeDate, draftTime, timeZone);\n if (isWithinDateTimeBounds(nextDateTime, minDateTimeValue, maxDateTimeValue)) {\n commit(nextDateTime);\n }\n }\n\n onBlur?.();\n setOpen(false);\n }}\n />\n </div>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n </div>\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n});\n\nDateTimePicker.displayName = 'DateTimePicker';\n"],"names":["latestDate","earliestDate","CalendarIcon","Calendar"],"mappings":"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"}
|
package/dist/Switch.js
CHANGED
|
@@ -182,19 +182,17 @@ const Switch = React__default.forwardRef(
|
|
|
182
182
|
const fieldId = id || generatedId;
|
|
183
183
|
const hasError = !!error;
|
|
184
184
|
return /* @__PURE__ */ jsxs(Field, { "data-disabled": props.disabled, "data-invalid": hasError, children: [
|
|
185
|
-
/* @__PURE__ */
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
)
|
|
197
|
-
] }),
|
|
185
|
+
label && /* @__PURE__ */ jsx(FieldLabel, { htmlFor: fieldId, className: "cursor-pointer", children: label }),
|
|
186
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-h-9 items-center gap-3", children: [
|
|
187
|
+
description && /* @__PURE__ */ jsx(
|
|
188
|
+
"label",
|
|
189
|
+
{
|
|
190
|
+
htmlFor: fieldId,
|
|
191
|
+
id: `${fieldId}-description`,
|
|
192
|
+
className: "flex-1 cursor-pointer text-sm leading-snug text-muted-foreground",
|
|
193
|
+
children: description
|
|
194
|
+
}
|
|
195
|
+
),
|
|
198
196
|
/* @__PURE__ */ jsx(
|
|
199
197
|
Switch$1,
|
|
200
198
|
{
|
package/dist/Switch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.js","sources":["../node_modules/.pnpm/@radix-ui+react-switch@1.2.6_@types+react-dom@19.2.3_@types+react@19.2.14__@types+react_c3445f43106be928beab9f2bef095c25/node_modules/@radix-ui/react-switch/dist/index.mjs","../shadcn/shadcnSwitch/Switch.tsx","../lib/components/Switch/Switch.tsx"],"sourcesContent":["\"use client\";\n\n// src/switch.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { usePrevious } from \"@radix-ui/react-use-previous\";\nimport { useSize } from \"@radix-ui/react-use-size\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar SWITCH_NAME = \"Switch\";\nvar [createSwitchContext, createSwitchScope] = createContextScope(SWITCH_NAME);\nvar [SwitchProvider, useSwitchContext] = createSwitchContext(SWITCH_NAME);\nvar Switch = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeSwitch,\n name,\n checked: checkedProp,\n defaultChecked,\n required,\n disabled,\n value = \"on\",\n onCheckedChange,\n form,\n ...switchProps\n } = props;\n const [button, setButton] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setButton(node));\n const hasConsumerStoppedPropagationRef = React.useRef(false);\n const isFormControl = button ? form || !!button.closest(\"form\") : true;\n const [checked, setChecked] = useControllableState({\n prop: checkedProp,\n defaultProp: defaultChecked ?? false,\n onChange: onCheckedChange,\n caller: SWITCH_NAME\n });\n return /* @__PURE__ */ jsxs(SwitchProvider, { scope: __scopeSwitch, checked, disabled, children: [\n /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"switch\",\n \"aria-checked\": checked,\n \"aria-required\": required,\n \"data-state\": getState(checked),\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n value,\n ...switchProps,\n ref: composedRefs,\n onClick: composeEventHandlers(props.onClick, (event) => {\n setChecked((prevChecked) => !prevChecked);\n if (isFormControl) {\n hasConsumerStoppedPropagationRef.current = event.isPropagationStopped();\n if (!hasConsumerStoppedPropagationRef.current) event.stopPropagation();\n }\n })\n }\n ),\n isFormControl && /* @__PURE__ */ jsx(\n SwitchBubbleInput,\n {\n control: button,\n bubbles: !hasConsumerStoppedPropagationRef.current,\n name,\n value,\n checked,\n required,\n disabled,\n form,\n style: { transform: \"translateX(-100%)\" }\n }\n )\n ] });\n }\n);\nSwitch.displayName = SWITCH_NAME;\nvar THUMB_NAME = \"SwitchThumb\";\nvar SwitchThumb = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSwitch, ...thumbProps } = props;\n const context = useSwitchContext(THUMB_NAME, __scopeSwitch);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n \"data-state\": getState(context.checked),\n \"data-disabled\": context.disabled ? \"\" : void 0,\n ...thumbProps,\n ref: forwardedRef\n }\n );\n }\n);\nSwitchThumb.displayName = THUMB_NAME;\nvar BUBBLE_INPUT_NAME = \"SwitchBubbleInput\";\nvar SwitchBubbleInput = React.forwardRef(\n ({\n __scopeSwitch,\n control,\n checked,\n bubbles = true,\n ...props\n }, forwardedRef) => {\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(ref, forwardedRef);\n const prevChecked = usePrevious(checked);\n const controlSize = useSize(control);\n React.useEffect(() => {\n const input = ref.current;\n if (!input) return;\n const inputProto = window.HTMLInputElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(\n inputProto,\n \"checked\"\n );\n const setChecked = descriptor.set;\n if (prevChecked !== checked && setChecked) {\n const event = new Event(\"click\", { bubbles });\n setChecked.call(input, checked);\n input.dispatchEvent(event);\n }\n }, [prevChecked, checked, bubbles]);\n return /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n \"aria-hidden\": true,\n defaultChecked: checked,\n ...props,\n tabIndex: -1,\n ref: composedRefs,\n style: {\n ...props.style,\n ...controlSize,\n position: \"absolute\",\n pointerEvents: \"none\",\n opacity: 0,\n margin: 0\n }\n }\n );\n }\n);\nSwitchBubbleInput.displayName = BUBBLE_INPUT_NAME;\nfunction getState(checked) {\n return checked ? \"checked\" : \"unchecked\";\n}\nvar Root = Switch;\nvar Thumb = SwitchThumb;\nexport {\n Root,\n Switch,\n SwitchThumb,\n Thumb,\n createSwitchScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as SwitchPrimitive from '@radix-ui/react-switch';\nimport type * as React from 'react';\n\nimport { cn } from '../utils';\n\nfunction Switch({\n className,\n size = 'default',\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> & {\n size?: 'sm' | 'default' | 'lg';\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n 'peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent outline-none transition-all focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] data-[size=lg]:h-[24px] data-[size=lg]:w-[40px]',\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"bg-primary-foreground shadow-sm pointer-events-none block rounded-full ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=lg]/switch:size-5 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import React from 'react';\nimport { Field, FieldError, FieldLabel } from '../../../shadcn/shadcnField';\nimport { Switch as ShadcnSwitch } from '../../../shadcn/shadcnSwitch';\n\nexport interface SwitchProps extends React.ComponentPropsWithoutRef<typeof ShadcnSwitch> {\n label?: React.ReactNode;\n\n description: React.ReactNode;\n\n error?: string;\n}\n\n// Switch for toggling on/off; label + description stack left with the toggle pinned right (description required)\nexport const Switch = React.forwardRef<React.ElementRef<typeof ShadcnSwitch>, SwitchProps>(\n ({ label, description, error, id, size = 'lg', ...props }, ref) => {\n const generatedId = React.useId();\n const fieldId = id || generatedId;\n const hasError = !!error;\n\n return (\n <Field data-disabled={props.disabled} data-invalid={hasError}>\n <div className=\"flex min-h-9 items-center justify-between gap-4\">\n <div className=\"flex flex-col gap-0.5\">\n {label && (\n <FieldLabel htmlFor={fieldId} className=\"font-normal cursor-pointer\">\n {label}\n </FieldLabel>\n )}\n <label\n htmlFor={fieldId}\n id={`${fieldId}-description`}\n className=\"text-sm text-muted-foreground leading-normal cursor-pointer\"\n >\n {description}\n </label>\n </div>\n <ShadcnSwitch\n {...props}\n ref={ref}\n id={fieldId}\n size={size}\n aria-describedby={description || error ? `${fieldId}-description ${fieldId}-error` : undefined}\n aria-invalid={hasError}\n />\n </div>\n\n {error && <FieldError id={`${fieldId}-error`}>{error}</FieldError>}\n </Field>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n\nexport type CompactSwitchProps = React.ComponentProps<typeof ShadcnSwitch>;\n\n// Bare compact switch with no Field wrapper, defaults to sm size for dense layouts like table/matrix cells\nexport const CompactSwitch: React.FC<CompactSwitchProps> = ({ size = 'sm', ...props }) => (\n <ShadcnSwitch size={size} {...props} />\n);\n\nCompactSwitch.displayName = 'CompactSwitch';\n"],"names":["Switch","SwitchPrimitive.Root","SwitchPrimitive.Thumb","React","ShadcnSwitch"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"Switch.js","sources":["../node_modules/.pnpm/@radix-ui+react-switch@1.2.6_@types+react-dom@19.2.3_@types+react@19.2.14__@types+react_c3445f43106be928beab9f2bef095c25/node_modules/@radix-ui/react-switch/dist/index.mjs","../shadcn/shadcnSwitch/Switch.tsx","../lib/components/Switch/Switch.tsx"],"sourcesContent":["\"use client\";\n\n// src/switch.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { usePrevious } from \"@radix-ui/react-use-previous\";\nimport { useSize } from \"@radix-ui/react-use-size\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar SWITCH_NAME = \"Switch\";\nvar [createSwitchContext, createSwitchScope] = createContextScope(SWITCH_NAME);\nvar [SwitchProvider, useSwitchContext] = createSwitchContext(SWITCH_NAME);\nvar Switch = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeSwitch,\n name,\n checked: checkedProp,\n defaultChecked,\n required,\n disabled,\n value = \"on\",\n onCheckedChange,\n form,\n ...switchProps\n } = props;\n const [button, setButton] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setButton(node));\n const hasConsumerStoppedPropagationRef = React.useRef(false);\n const isFormControl = button ? form || !!button.closest(\"form\") : true;\n const [checked, setChecked] = useControllableState({\n prop: checkedProp,\n defaultProp: defaultChecked ?? false,\n onChange: onCheckedChange,\n caller: SWITCH_NAME\n });\n return /* @__PURE__ */ jsxs(SwitchProvider, { scope: __scopeSwitch, checked, disabled, children: [\n /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"switch\",\n \"aria-checked\": checked,\n \"aria-required\": required,\n \"data-state\": getState(checked),\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n value,\n ...switchProps,\n ref: composedRefs,\n onClick: composeEventHandlers(props.onClick, (event) => {\n setChecked((prevChecked) => !prevChecked);\n if (isFormControl) {\n hasConsumerStoppedPropagationRef.current = event.isPropagationStopped();\n if (!hasConsumerStoppedPropagationRef.current) event.stopPropagation();\n }\n })\n }\n ),\n isFormControl && /* @__PURE__ */ jsx(\n SwitchBubbleInput,\n {\n control: button,\n bubbles: !hasConsumerStoppedPropagationRef.current,\n name,\n value,\n checked,\n required,\n disabled,\n form,\n style: { transform: \"translateX(-100%)\" }\n }\n )\n ] });\n }\n);\nSwitch.displayName = SWITCH_NAME;\nvar THUMB_NAME = \"SwitchThumb\";\nvar SwitchThumb = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSwitch, ...thumbProps } = props;\n const context = useSwitchContext(THUMB_NAME, __scopeSwitch);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n \"data-state\": getState(context.checked),\n \"data-disabled\": context.disabled ? \"\" : void 0,\n ...thumbProps,\n ref: forwardedRef\n }\n );\n }\n);\nSwitchThumb.displayName = THUMB_NAME;\nvar BUBBLE_INPUT_NAME = \"SwitchBubbleInput\";\nvar SwitchBubbleInput = React.forwardRef(\n ({\n __scopeSwitch,\n control,\n checked,\n bubbles = true,\n ...props\n }, forwardedRef) => {\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(ref, forwardedRef);\n const prevChecked = usePrevious(checked);\n const controlSize = useSize(control);\n React.useEffect(() => {\n const input = ref.current;\n if (!input) return;\n const inputProto = window.HTMLInputElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(\n inputProto,\n \"checked\"\n );\n const setChecked = descriptor.set;\n if (prevChecked !== checked && setChecked) {\n const event = new Event(\"click\", { bubbles });\n setChecked.call(input, checked);\n input.dispatchEvent(event);\n }\n }, [prevChecked, checked, bubbles]);\n return /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n \"aria-hidden\": true,\n defaultChecked: checked,\n ...props,\n tabIndex: -1,\n ref: composedRefs,\n style: {\n ...props.style,\n ...controlSize,\n position: \"absolute\",\n pointerEvents: \"none\",\n opacity: 0,\n margin: 0\n }\n }\n );\n }\n);\nSwitchBubbleInput.displayName = BUBBLE_INPUT_NAME;\nfunction getState(checked) {\n return checked ? \"checked\" : \"unchecked\";\n}\nvar Root = Switch;\nvar Thumb = SwitchThumb;\nexport {\n Root,\n Switch,\n SwitchThumb,\n Thumb,\n createSwitchScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as SwitchPrimitive from '@radix-ui/react-switch';\nimport type * as React from 'react';\n\nimport { cn } from '../utils';\n\nfunction Switch({\n className,\n size = 'default',\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> & {\n size?: 'sm' | 'default' | 'lg';\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n 'peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent outline-none transition-all focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] data-[size=lg]:h-[24px] data-[size=lg]:w-[40px]',\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"bg-primary-foreground shadow-sm pointer-events-none block rounded-full ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=lg]/switch:size-5 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import React from 'react';\nimport { Field, FieldError, FieldLabel } from '../../../shadcn/shadcnField';\nimport { Switch as ShadcnSwitch } from '../../../shadcn/shadcnSwitch';\n\nexport interface SwitchProps extends React.ComponentPropsWithoutRef<typeof ShadcnSwitch> {\n label?: React.ReactNode;\n\n description: React.ReactNode;\n\n error?: string;\n}\n\n// Switch for toggling on/off; label + description on the left with the toggle pinned right (description required)\nexport const Switch = React.forwardRef<React.ElementRef<typeof ShadcnSwitch>, SwitchProps>(\n ({ label, description, error, id, size = 'lg', ...props }, ref) => {\n const generatedId = React.useId();\n const fieldId = id || generatedId;\n const hasError = !!error;\n\n return (\n <Field data-disabled={props.disabled} data-invalid={hasError}>\n {label && (\n <FieldLabel htmlFor={fieldId} className=\"cursor-pointer\">\n {label}\n </FieldLabel>\n )}\n <div className=\"flex min-h-9 items-center gap-3\">\n {description && (\n <label\n htmlFor={fieldId}\n id={`${fieldId}-description`}\n className=\"flex-1 cursor-pointer text-sm leading-snug text-muted-foreground\"\n >\n {description}\n </label>\n )}\n <ShadcnSwitch\n {...props}\n ref={ref}\n id={fieldId}\n size={size}\n aria-describedby={description || error ? `${fieldId}-description ${fieldId}-error` : undefined}\n aria-invalid={hasError}\n />\n </div>\n {error && <FieldError id={`${fieldId}-error`}>{error}</FieldError>}\n </Field>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n\nexport type CompactSwitchProps = React.ComponentProps<typeof ShadcnSwitch>;\n\n// Bare compact switch with no Field wrapper, defaults to sm size for dense layouts like table/matrix cells\nexport const CompactSwitch: React.FC<CompactSwitchProps> = ({ size = 'sm', ...props }) => (\n <ShadcnSwitch size={size} {...props} />\n);\n\nCompactSwitch.displayName = 'CompactSwitch';\n"],"names":["Switch","SwitchPrimitive.Root","SwitchPrimitive.Thumb","React","ShadcnSwitch"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/UploadFile.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { useRef,
|
|
2
|
+
import { useRef, useMemo, useEffect } from 'react';
|
|
3
3
|
import { c as cn } from './utils.js';
|
|
4
4
|
import { B as Button } from './Button.js';
|
|
5
5
|
import { F as FilePreview } from './FilePreview.js';
|
|
@@ -8,40 +8,35 @@ import { U as Upload } from './upload.js';
|
|
|
8
8
|
import { C as Camera, U as User } from './user.js';
|
|
9
9
|
import { X } from './x.js';
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
const
|
|
11
|
+
function useImageObjectUrl(file) {
|
|
12
|
+
const objectUrl = useMemo(() => file?.type.startsWith("image/") ? URL.createObjectURL(file) : null, [file]);
|
|
13
13
|
useEffect(() => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return /* @__PURE__ */ jsx(
|
|
20
|
-
"img",
|
|
21
|
-
{
|
|
22
|
-
src: objectUrl,
|
|
23
|
-
alt: file.name,
|
|
24
|
-
className: "rounded-full object-cover w-full h-full",
|
|
25
|
-
style: { width: size, height: size }
|
|
26
|
-
}
|
|
27
|
-
);
|
|
28
|
-
};
|
|
14
|
+
if (!objectUrl) return;
|
|
15
|
+
return () => URL.revokeObjectURL(objectUrl);
|
|
16
|
+
}, [objectUrl]);
|
|
17
|
+
return objectUrl;
|
|
18
|
+
}
|
|
29
19
|
const UploadFile = ({
|
|
30
20
|
anchor = "dropzone",
|
|
31
21
|
multiple = false,
|
|
32
22
|
accept,
|
|
23
|
+
className,
|
|
33
24
|
disabled,
|
|
34
25
|
label,
|
|
35
26
|
error,
|
|
36
27
|
placeholder,
|
|
37
28
|
hint,
|
|
38
29
|
value,
|
|
30
|
+
previewUrl,
|
|
39
31
|
onChange,
|
|
40
32
|
isLoading
|
|
41
33
|
}) => {
|
|
42
34
|
const inputRef = useRef(null);
|
|
43
35
|
const files = !value ? [] : Array.isArray(value) ? value : [value];
|
|
44
36
|
const hasFiles = files.length > 0;
|
|
37
|
+
const firstFile = files[0];
|
|
38
|
+
const selectedImageUrl = useImageObjectUrl(firstFile);
|
|
39
|
+
const imageSrc = hasFiles ? selectedImageUrl : previewUrl ?? null;
|
|
45
40
|
const isPreset = anchor === "dropzone" || anchor === "button" || anchor === "avatar";
|
|
46
41
|
function handleClick() {
|
|
47
42
|
if (disabled) return;
|
|
@@ -94,7 +89,7 @@ const UploadFile = ({
|
|
|
94
89
|
disabled ? "cursor-default opacity-50" : "cursor-pointer hover:bg-muted/50"
|
|
95
90
|
),
|
|
96
91
|
children: [
|
|
97
|
-
/* @__PURE__ */ jsx(Upload, { className: "h-6 w-6 text-muted-foreground" }),
|
|
92
|
+
imageSrc ? /* @__PURE__ */ jsx("img", { src: imageSrc, alt: "", className: "h-16 w-16 rounded object-cover" }) : /* @__PURE__ */ jsx(Upload, { className: "h-6 w-6 text-muted-foreground" }),
|
|
98
93
|
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: placeholder ?? "Click or drag to upload" }),
|
|
99
94
|
hint && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: hint })
|
|
100
95
|
]
|
|
@@ -110,8 +105,6 @@ const UploadFile = ({
|
|
|
110
105
|
}
|
|
111
106
|
if (anchor === "avatar") {
|
|
112
107
|
const avatarSize = 80;
|
|
113
|
-
const firstFile = files[0];
|
|
114
|
-
const hasImage = hasFiles && firstFile.type.startsWith("image/");
|
|
115
108
|
return (
|
|
116
109
|
// Wrapper provides positioning context for the badge outside overflow-hidden
|
|
117
110
|
/* @__PURE__ */ jsxs("div", { className: "relative inline-block", style: { width: avatarSize, height: avatarSize }, children: [
|
|
@@ -123,15 +116,25 @@ const UploadFile = ({
|
|
|
123
116
|
disabled,
|
|
124
117
|
className: cn(
|
|
125
118
|
"group relative h-full w-full overflow-hidden rounded-full bg-muted",
|
|
126
|
-
disabled ? "cursor-default
|
|
119
|
+
disabled ? "cursor-default" : "cursor-pointer",
|
|
120
|
+
// A shown image is content, not an affordance — only dim the empty placeholder
|
|
121
|
+
disabled && !imageSrc && "opacity-50"
|
|
127
122
|
),
|
|
128
|
-
children:
|
|
129
|
-
/* @__PURE__ */ jsx(
|
|
130
|
-
|
|
123
|
+
children: imageSrc ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
124
|
+
/* @__PURE__ */ jsx(
|
|
125
|
+
"img",
|
|
126
|
+
{
|
|
127
|
+
src: imageSrc,
|
|
128
|
+
alt: firstFile?.name ?? "",
|
|
129
|
+
className: "rounded-full object-cover w-full h-full",
|
|
130
|
+
style: { width: avatarSize, height: avatarSize }
|
|
131
|
+
}
|
|
132
|
+
),
|
|
133
|
+
!disabled && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center rounded-full bg-black/40 opacity-0 transition-opacity group-hover:opacity-100", children: /* @__PURE__ */ jsx(Camera, { className: "h-5 w-5 text-white" }) })
|
|
131
134
|
] }) : /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center", children: /* @__PURE__ */ jsx(User, { className: "h-8 w-8 text-muted-foreground" }) })
|
|
132
135
|
}
|
|
133
136
|
),
|
|
134
|
-
!
|
|
137
|
+
!imageSrc && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute -bottom-0.5 -right-0.5 flex h-6 w-6 items-center justify-center rounded-full bg-primary ring-2 ring-background", children: /* @__PURE__ */ jsx(Upload, { className: "h-3 w-3 text-primary-foreground" }) })
|
|
135
138
|
] })
|
|
136
139
|
);
|
|
137
140
|
}
|
|
@@ -172,26 +175,30 @@ const UploadFile = ({
|
|
|
172
175
|
`${file.name}-${file.size}`
|
|
173
176
|
)) });
|
|
174
177
|
}
|
|
175
|
-
return
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
178
|
+
return (
|
|
179
|
+
// Field is w-full by default; the avatar is a fixed 80px circle, so it hugs its content
|
|
180
|
+
// instead of claiming the whole row and pushing sibling content to the far edge
|
|
181
|
+
/* @__PURE__ */ jsxs(Field, { "data-disabled": disabled, className: cn(anchor === "avatar" && "w-fit", className), children: [
|
|
182
|
+
label && /* @__PURE__ */ jsx(FieldLabel, { children: label }),
|
|
183
|
+
renderAnchor(),
|
|
184
|
+
renderFileList(),
|
|
185
|
+
/* @__PURE__ */ jsx(
|
|
186
|
+
"input",
|
|
187
|
+
{
|
|
188
|
+
ref: inputRef,
|
|
189
|
+
type: "file",
|
|
190
|
+
multiple,
|
|
191
|
+
accept,
|
|
192
|
+
disabled,
|
|
193
|
+
onChange: handleChange,
|
|
194
|
+
style: { display: "none" },
|
|
195
|
+
"aria-hidden": "true",
|
|
196
|
+
tabIndex: -1
|
|
197
|
+
}
|
|
198
|
+
),
|
|
199
|
+
error && /* @__PURE__ */ jsx(FieldError, { children: error })
|
|
200
|
+
] })
|
|
201
|
+
);
|
|
195
202
|
};
|
|
196
203
|
UploadFile.displayName = "UploadFile";
|
|
197
204
|
|
package/dist/UploadFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadFile.js","sources":["../lib/components/UploadFile/UploadFile.tsx"],"sourcesContent":["import { Camera, Upload, User, X } from 'lucide-react';\nimport type React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Button } from '../Button';\nimport { Field, FieldError, FieldLabel } from '../Field';\nimport { FilePreview } from '../FilePreview';\n\ntype AnchorPreset = 'dropzone' | 'button' | 'avatar';\n\ninterface UploadFileBaseProps {\n anchor?: AnchorPreset | React.ReactNode;\n multiple?: boolean;\n accept?: string;\n disabled?: boolean;\n label?: string;\n error?: string;\n placeholder?: string;\n hint?: string;\n value?: File | File[] | null;\n isLoading?: boolean;\n}\n\ninterface UploadFileStandaloneProps extends UploadFileBaseProps {\n name?: never;\n onChange: (files: File | File[] | undefined) => void;\n}\n\ninterface UploadFileFormProps extends UploadFileBaseProps {\n name: string;\n onChange?: (files: File | File[] | undefined) => void;\n}\n\nexport type UploadFileProps = UploadFileStandaloneProps | UploadFileFormProps;\n\n// Circular avatar preview used by the avatar anchor preset\nconst AvatarPreview: React.FC<{ file: File; size: number }> = ({ file, size }) => {\n const [objectUrl, setObjectUrl] = useState<string | null>(null);\n\n useEffect(() => {\n const url = URL.createObjectURL(file);\n setObjectUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [file]);\n\n if (!objectUrl) return null;\n\n return (\n <img\n src={objectUrl}\n alt={file.name}\n className=\"rounded-full object-cover w-full h-full\"\n style={{ width: size, height: size }}\n />\n );\n};\n\n// File upload trigger with optional preset anchors and built-in file preview\nexport const UploadFile: React.FC<UploadFileProps> = ({\n anchor = 'dropzone',\n multiple = false,\n accept,\n disabled,\n label,\n error,\n placeholder,\n hint,\n value,\n onChange,\n isLoading,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Normalize value to an array for consistent handling\n const files: File[] = !value ? [] : Array.isArray(value) ? value : [value];\n const hasFiles = files.length > 0;\n\n // True when using a preset string anchor (not a custom ReactNode)\n const isPreset = anchor === 'dropzone' || anchor === 'button' || anchor === 'avatar';\n\n // Opens the native file picker\n function handleClick() {\n if (disabled) return;\n inputRef.current?.click();\n }\n\n // Forwards selected files to consumer and resets input\n function handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const fileList = event.target.files;\n if (!fileList || fileList.length === 0) return;\n\n if (multiple) {\n // Merge with existing files, avoiding duplicates by name+size\n const incoming = Array.from(fileList);\n const merged = [...files, ...incoming.filter((f) => !files.some((e) => e.name === f.name && e.size === f.size))];\n onChange?.(merged);\n } else {\n onChange?.(fileList[0]);\n }\n\n // Reset so the same file can be re-selected\n event.target.value = '';\n }\n\n // Removes a specific file from the selection\n function handleRemove(file: File) {\n if (multiple) {\n const remaining = files.filter((f) => f !== file);\n onChange?.(remaining.length ? remaining : undefined);\n } else {\n onChange?.(undefined);\n }\n }\n\n // Renders the clickable anchor element based on the anchor prop\n function renderAnchor() {\n // Custom ReactNode — preserve original headless behaviour\n if (!isPreset) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n style={{ all: 'unset', display: 'inline-block', cursor: disabled ? 'default' : 'pointer' }}\n >\n {anchor as React.ReactNode}\n </button>\n );\n }\n\n if (anchor === 'dropzone') {\n // In single mode with a file selected, the file row replaces the dropzone\n if (!multiple && hasFiles) return null;\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-8 transition-colors',\n error ? 'border-destructive' : 'border-border',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer hover:bg-muted/50',\n )}\n >\n <Upload className=\"h-6 w-6 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">{placeholder ?? 'Click or drag to upload'}</p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </button>\n );\n }\n\n if (anchor === 'button') {\n // In single mode with a file selected, the file row replaces the button\n if (!multiple && hasFiles) return null;\n\n return (\n <Button type=\"button\" variant=\"outline\" onClick={handleClick} disabled={disabled}>\n <Upload className=\"h-4 w-4\" />\n {placeholder ?? 'Upload file'}\n </Button>\n );\n }\n\n if (anchor === 'avatar') {\n const avatarSize = 80;\n const firstFile = files[0];\n const hasImage = hasFiles && firstFile.type.startsWith('image/');\n\n return (\n // Wrapper provides positioning context for the badge outside overflow-hidden\n <div className=\"relative inline-block\" style={{ width: avatarSize, height: avatarSize }}>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'group relative h-full w-full overflow-hidden rounded-full bg-muted',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer',\n )}\n >\n {hasImage ? (\n <>\n <AvatarPreview file={firstFile} size={avatarSize} />\n {/* Camera overlay on hover */}\n <div className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/40 opacity-0 transition-opacity group-hover:opacity-100\">\n <Camera className=\"h-5 w-5 text-white\" />\n </div>\n </>\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n <User className=\"h-8 w-8 text-muted-foreground\" />\n </div>\n )}\n </button>\n\n {/* Badge sits outside overflow-hidden so it's never clipped */}\n {!hasImage && (\n <div className=\"pointer-events-none absolute -bottom-0.5 -right-0.5 flex h-6 w-6 items-center justify-center rounded-full bg-primary ring-2 ring-background\">\n <Upload className=\"h-3 w-3 text-primary-foreground\" />\n </div>\n )}\n </div>\n );\n }\n\n return null;\n }\n\n // Renders the file list below the anchor for preset anchors (not avatar)\n function renderFileList() {\n if (!isPreset || !hasFiles || anchor === 'avatar') return null;\n\n return (\n <div className=\"flex flex-col gap-2\">\n {files.map((file) => (\n <div\n key={`${file.name}-${file.size}`}\n className={cn(\n 'relative overflow-hidden flex items-center gap-3 rounded-lg border border-dashed p-3',\n isLoading ? 'border-primary/40 animate-pulse' : 'border-border',\n )}\n >\n {isLoading && <div className=\"absolute inset-0 bg-primary/5\" />}\n <div className=\"relative flex items-center gap-3 flex-1 min-w-0\">\n <FilePreview file={file} size={40} />\n <div className=\"flex-1 min-w-0\">\n <span className=\"block truncate text-sm\">{file.name}</span>\n {isLoading && <span className=\"text-xs text-muted-foreground\">Uploading...</span>}\n </div>\n {!isLoading && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n onClick={() => handleRemove(file)}\n disabled={disabled}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n {renderAnchor()}\n {renderFileList()}\n\n <input\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={handleChange}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n};\n\nUploadFile.displayName = 'UploadFile';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UploadFile.js","sources":["../lib/components/UploadFile/UploadFile.tsx"],"sourcesContent":["import { Camera, Upload, User, X } from 'lucide-react';\nimport type React from 'react';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Button } from '../Button';\nimport { Field, FieldError, FieldLabel } from '../Field';\nimport { FilePreview } from '../FilePreview';\n\ntype AnchorPreset = 'dropzone' | 'button' | 'avatar';\n\ninterface UploadFileBaseProps {\n anchor?: AnchorPreset | React.ReactNode;\n multiple?: boolean;\n accept?: string;\n className?: string;\n disabled?: boolean;\n label?: string;\n error?: string;\n placeholder?: string;\n hint?: string;\n value?: File | File[] | null;\n /** URL of an already-persisted file (e.g. a saved avatar). Shown as the preview until a new file is picked. */\n previewUrl?: string;\n isLoading?: boolean;\n}\n\ninterface UploadFileStandaloneProps extends UploadFileBaseProps {\n name?: never;\n onChange: (files: File | File[] | undefined) => void;\n}\n\ninterface UploadFileFormProps extends UploadFileBaseProps {\n name: string;\n onChange?: (files: File | File[] | undefined) => void;\n}\n\nexport type UploadFileProps = UploadFileStandaloneProps | UploadFileFormProps;\n\n// Creates a revocable object URL for an image File; null for non-images or no file.\n// Built during render, not in an effect, so the preview never flashes a placeholder first.\nfunction useImageObjectUrl(file: File | undefined): string | null {\n const objectUrl = useMemo(() => (file?.type.startsWith('image/') ? URL.createObjectURL(file) : null), [file]);\n\n useEffect(() => {\n if (!objectUrl) return;\n return () => URL.revokeObjectURL(objectUrl);\n }, [objectUrl]);\n\n return objectUrl;\n}\n\n// File upload trigger with optional preset anchors and built-in file preview\nexport const UploadFile: React.FC<UploadFileProps> = ({\n anchor = 'dropzone',\n multiple = false,\n accept,\n className,\n disabled,\n label,\n error,\n placeholder,\n hint,\n value,\n previewUrl,\n onChange,\n isLoading,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Normalize value to an array for consistent handling\n const files: File[] = !value ? [] : Array.isArray(value) ? value : [value];\n const hasFiles = files.length > 0;\n\n const firstFile: File | undefined = files[0];\n const selectedImageUrl = useImageObjectUrl(firstFile);\n // A picked file always wins; previewUrl only fills in when nothing is selected, so\n // picking a non-image never falls back to the stale remote image\n const imageSrc = hasFiles ? selectedImageUrl : (previewUrl ?? null);\n\n // True when using a preset string anchor (not a custom ReactNode)\n const isPreset = anchor === 'dropzone' || anchor === 'button' || anchor === 'avatar';\n\n // Opens the native file picker\n function handleClick() {\n if (disabled) return;\n inputRef.current?.click();\n }\n\n // Forwards selected files to consumer and resets input\n function handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const fileList = event.target.files;\n if (!fileList || fileList.length === 0) return;\n\n if (multiple) {\n // Merge with existing files, avoiding duplicates by name+size\n const incoming = Array.from(fileList);\n const merged = [...files, ...incoming.filter((f) => !files.some((e) => e.name === f.name && e.size === f.size))];\n onChange?.(merged);\n } else {\n onChange?.(fileList[0]);\n }\n\n // Reset so the same file can be re-selected\n event.target.value = '';\n }\n\n // Removes a specific file from the selection\n function handleRemove(file: File) {\n if (multiple) {\n const remaining = files.filter((f) => f !== file);\n onChange?.(remaining.length ? remaining : undefined);\n } else {\n onChange?.(undefined);\n }\n }\n\n // Renders the clickable anchor element based on the anchor prop\n function renderAnchor() {\n // Custom ReactNode — preserve original headless behaviour\n if (!isPreset) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n style={{ all: 'unset', display: 'inline-block', cursor: disabled ? 'default' : 'pointer' }}\n >\n {anchor as React.ReactNode}\n </button>\n );\n }\n\n if (anchor === 'dropzone') {\n // In single mode with a file selected, the file row replaces the dropzone\n if (!multiple && hasFiles) return null;\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-8 transition-colors',\n error ? 'border-destructive' : 'border-border',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer hover:bg-muted/50',\n )}\n >\n {imageSrc ? (\n <img src={imageSrc} alt=\"\" className=\"h-16 w-16 rounded object-cover\" />\n ) : (\n <Upload className=\"h-6 w-6 text-muted-foreground\" />\n )}\n <p className=\"text-sm text-muted-foreground\">{placeholder ?? 'Click or drag to upload'}</p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </button>\n );\n }\n\n if (anchor === 'button') {\n // In single mode with a file selected, the file row replaces the button\n if (!multiple && hasFiles) return null;\n\n return (\n <Button type=\"button\" variant=\"outline\" onClick={handleClick} disabled={disabled}>\n <Upload className=\"h-4 w-4\" />\n {placeholder ?? 'Upload file'}\n </Button>\n );\n }\n\n if (anchor === 'avatar') {\n const avatarSize = 80;\n\n return (\n // Wrapper provides positioning context for the badge outside overflow-hidden\n <div className=\"relative inline-block\" style={{ width: avatarSize, height: avatarSize }}>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'group relative h-full w-full overflow-hidden rounded-full bg-muted',\n disabled ? 'cursor-default' : 'cursor-pointer',\n // A shown image is content, not an affordance — only dim the empty placeholder\n disabled && !imageSrc && 'opacity-50',\n )}\n >\n {imageSrc ? (\n <>\n <img\n src={imageSrc}\n alt={firstFile?.name ?? ''}\n className=\"rounded-full object-cover w-full h-full\"\n style={{ width: avatarSize, height: avatarSize }}\n />\n {/* Camera overlay on hover — omitted when read-only, since nothing can be picked */}\n {!disabled && (\n <div className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/40 opacity-0 transition-opacity group-hover:opacity-100\">\n <Camera className=\"h-5 w-5 text-white\" />\n </div>\n )}\n </>\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n <User className=\"h-8 w-8 text-muted-foreground\" />\n </div>\n )}\n </button>\n\n {/* Badge sits outside overflow-hidden so it's never clipped */}\n {!imageSrc && (\n <div className=\"pointer-events-none absolute -bottom-0.5 -right-0.5 flex h-6 w-6 items-center justify-center rounded-full bg-primary ring-2 ring-background\">\n <Upload className=\"h-3 w-3 text-primary-foreground\" />\n </div>\n )}\n </div>\n );\n }\n\n return null;\n }\n\n // Renders the file list below the anchor for preset anchors (not avatar)\n function renderFileList() {\n if (!isPreset || !hasFiles || anchor === 'avatar') return null;\n\n return (\n <div className=\"flex flex-col gap-2\">\n {files.map((file) => (\n <div\n key={`${file.name}-${file.size}`}\n className={cn(\n 'relative overflow-hidden flex items-center gap-3 rounded-lg border border-dashed p-3',\n isLoading ? 'border-primary/40 animate-pulse' : 'border-border',\n )}\n >\n {isLoading && <div className=\"absolute inset-0 bg-primary/5\" />}\n <div className=\"relative flex items-center gap-3 flex-1 min-w-0\">\n <FilePreview file={file} size={40} />\n <div className=\"flex-1 min-w-0\">\n <span className=\"block truncate text-sm\">{file.name}</span>\n {isLoading && <span className=\"text-xs text-muted-foreground\">Uploading...</span>}\n </div>\n {!isLoading && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n onClick={() => handleRemove(file)}\n disabled={disabled}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n // Field is w-full by default; the avatar is a fixed 80px circle, so it hugs its content\n // instead of claiming the whole row and pushing sibling content to the far edge\n <Field data-disabled={disabled} className={cn(anchor === 'avatar' && 'w-fit', className)}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n {renderAnchor()}\n {renderFileList()}\n\n <input\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={handleChange}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n};\n\nUploadFile.displayName = 'UploadFile';\n"],"names":[],"mappings":"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"}
|
|
@@ -5296,8 +5296,8 @@ select:-webkit-autofill:active {
|
|
|
5296
5296
|
padding-top: calc(var(--spacing) * 0);
|
|
5297
5297
|
}
|
|
5298
5298
|
|
|
5299
|
-
.last
|
|
5300
|
-
margin-top: calc(var(--spacing) *
|
|
5299
|
+
.last\:-mt-1:last-child {
|
|
5300
|
+
margin-top: calc(var(--spacing) * -1);
|
|
5301
5301
|
}
|
|
5302
5302
|
|
|
5303
5303
|
.last\:mb-0:last-child {
|
package/dist/field.js
CHANGED
|
@@ -127,8 +127,8 @@ function FieldDescription({ className, ...props }) {
|
|
|
127
127
|
{
|
|
128
128
|
"data-slot": "field-description",
|
|
129
129
|
className: cn(
|
|
130
|
-
"text-muted-foreground text-
|
|
131
|
-
"last
|
|
130
|
+
"text-muted-foreground text-xs leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance",
|
|
131
|
+
"last:-mt-1 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5",
|
|
132
132
|
"[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4",
|
|
133
133
|
className
|
|
134
134
|
),
|
package/dist/field.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field.js","sources":["../shadcn/shadcnField/field.tsx"],"sourcesContent":["'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useMemo } from 'react';\nimport { Label } from '../shadcnLabel';\nimport { Separator } from '../shadcnSeparator';\nimport { cn } from '../utils';\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<'fieldset'>) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n 'flex flex-col gap-4',\n 'has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldLegend({\n className,\n variant = 'legend',\n ...props\n}: React.ComponentProps<'legend'> & { variant?: 'legend' | 'label' }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn('mb-3 font-medium', 'data-[variant=legend]:text-base', 'data-[variant=label]:text-sm', className)}\n {...props}\n />\n );\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n 'group/field-group @container/field-group flex w-full flex-col gap-2 data-[slot=checkbox-group]:gap-1 [&>[data-slot=field-group]]:gap-2',\n className,\n )}\n {...props}\n />\n );\n}\n\nconst fieldVariants = cva('group/field flex w-full gap-2 data-[invalid=true]:text-destructive', {\n variants: {\n orientation: {\n vertical: ['flex-col [&>*]:w-full [&>.sr-only]:w-auto'],\n horizontal: [\n 'flex-row items-center',\n '[&>[data-slot=field-label]]:flex-auto',\n 'has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n responsive: [\n 'flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto',\n '@md/field-group:[&>[data-slot=field-label]]:flex-auto',\n '@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n});\n\nfunction Field({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n );\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn('group/field-content flex flex-1 flex-col gap-1.5 leading-snug', className)}\n {...props}\n />\n );\n}\n\nfunction FieldLabel({ className, ...props }: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n 'group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50',\n 'has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4',\n 'has-data-[state=checked]:bg-primary/5 has-data-[state=checked]:border-primary dark:has-data-[state=checked]:bg-primary/10',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n 'flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<'p'>) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n 'text-muted-foreground text-
|
|
1
|
+
{"version":3,"file":"field.js","sources":["../shadcn/shadcnField/field.tsx"],"sourcesContent":["'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useMemo } from 'react';\nimport { Label } from '../shadcnLabel';\nimport { Separator } from '../shadcnSeparator';\nimport { cn } from '../utils';\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<'fieldset'>) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n 'flex flex-col gap-4',\n 'has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldLegend({\n className,\n variant = 'legend',\n ...props\n}: React.ComponentProps<'legend'> & { variant?: 'legend' | 'label' }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn('mb-3 font-medium', 'data-[variant=legend]:text-base', 'data-[variant=label]:text-sm', className)}\n {...props}\n />\n );\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n 'group/field-group @container/field-group flex w-full flex-col gap-2 data-[slot=checkbox-group]:gap-1 [&>[data-slot=field-group]]:gap-2',\n className,\n )}\n {...props}\n />\n );\n}\n\nconst fieldVariants = cva('group/field flex w-full gap-2 data-[invalid=true]:text-destructive', {\n variants: {\n orientation: {\n vertical: ['flex-col [&>*]:w-full [&>.sr-only]:w-auto'],\n horizontal: [\n 'flex-row items-center',\n '[&>[data-slot=field-label]]:flex-auto',\n 'has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n responsive: [\n 'flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto',\n '@md/field-group:[&>[data-slot=field-label]]:flex-auto',\n '@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px',\n ],\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n});\n\nfunction Field({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n );\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn('group/field-content flex flex-1 flex-col gap-1.5 leading-snug', className)}\n {...props}\n />\n );\n}\n\nfunction FieldLabel({ className, ...props }: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n 'group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50',\n 'has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4',\n 'has-data-[state=checked]:bg-primary/5 has-data-[state=checked]:border-primary dark:has-data-[state=checked]:bg-primary/10',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n 'flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<'p'>) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n 'text-muted-foreground text-xs leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance',\n 'last:-mt-1 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5',\n '[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<'div'> & {\n children?: React.ReactNode;\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn('relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2', className)}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"bg-background text-muted-foreground relative mx-auto block w-fit px-2\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n );\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<'div'> & {\n errors?: Array<{ message?: string } | undefined>;\n}) {\n const content = useMemo(() => {\n if (children) {\n return children;\n }\n\n if (!errors?.length) {\n return null;\n }\n\n if (errors?.length === 1) {\n return errors[0]?.message;\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {errors.map((error) => error?.message && <li key={error.message}>{error.message}</li>)}\n </ul>\n );\n }, [children, errors]);\n\n if (!content) {\n return null;\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn('text-destructive text-sm font-normal', className)}\n {...props}\n >\n {content}\n </div>\n );\n}\n\nexport {\n Field,\n FieldContent,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldTitle,\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../../lib/components/Switch/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEtE,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,YAAY,CAAC;IACtF,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAExB,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;IAE7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,eAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../../lib/components/Switch/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEtE,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,YAAY,CAAC;IACtF,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAExB,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;IAE7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,eAAO,MAAM,MAAM,uFAoClB,CAAC;AAIF,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AAG3E,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAEtD,CAAC"}
|
|
@@ -4,12 +4,14 @@ interface UploadFileBaseProps {
|
|
|
4
4
|
anchor?: AnchorPreset | React.ReactNode;
|
|
5
5
|
multiple?: boolean;
|
|
6
6
|
accept?: string;
|
|
7
|
+
className?: string;
|
|
7
8
|
disabled?: boolean;
|
|
8
9
|
label?: string;
|
|
9
10
|
error?: string;
|
|
10
11
|
placeholder?: string;
|
|
11
12
|
hint?: string;
|
|
12
13
|
value?: File | File[] | null;
|
|
14
|
+
previewUrl?: string;
|
|
13
15
|
isLoading?: boolean;
|
|
14
16
|
}
|
|
15
17
|
interface UploadFileStandaloneProps extends UploadFileBaseProps {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadFile.d.ts","sourceRoot":"","sources":["../../../../lib/components/UploadFile/UploadFile.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,KAAK,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErD,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"UploadFile.d.ts","sourceRoot":"","sources":["../../../../lib/components/UploadFile/UploadFile.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,KAAK,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErD,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAE7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,yBAA0B,SAAQ,mBAAmB;IAC7D,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,SAAS,KAAK,IAAI,CAAC;CACtD;AAED,UAAU,mBAAoB,SAAQ,mBAAmB;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,SAAS,KAAK,IAAI,CAAC;CACvD;AAED,MAAM,MAAM,eAAe,GAAG,yBAAyB,GAAG,mBAAmB,CAAC;AAgB9E,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA0OhD,CAAC"}
|