@gridui/date-picker 0.0.0-stage → 1.0.0
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/README.md +68 -2
- package/dist/date-picker/date-picker.d.ts +10 -0
- package/dist/date-picker-panel/date-picker-panel.d.ts +22 -0
- package/dist/date-picker-panel/month.d.ts +29 -0
- package/dist/date-picker-panel/style.d.ts +10 -0
- package/dist/date-picker-panel/use-panel.d.ts +32 -0
- package/dist/date-range-picker/date-range-picker.d.ts +10 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +1004 -0
- package/dist/index.js.map +7 -0
- package/dist/shared/date.d.ts +20 -0
- package/dist/shared/picker-types.d.ts +39 -0
- package/dist/shared/picker.d.ts +14 -0
- package/dist/shared/types.d.ts +33 -0
- package/dist/styles.css +260 -0
- package/package.json +53 -3
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/shared/date.ts", "../src/date-picker-panel/month.tsx", "../src/date-picker-panel/style.ts", "../src/date-picker-panel/use-panel.ts", "../src/date-picker-panel/date-picker-panel.tsx", "../src/shared/picker.tsx", "../src/date-picker/date-picker.tsx", "../src/date-range-picker/date-range-picker.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * @author WMXPY\n * @package Date Picker\n * @namespace Shared\n * @description Date\n */\n\nimport type { DateConstraints, DateRange, DateValue } from \"./types\";\n\nexport const parseDate = (value: DateValue): Date => {\n const date = new Date(`${value}T00:00:00Z`);\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || !Number.isFinite(date.getTime()) || date.toISOString().slice(0, 10) !== value) {\n throw new RangeError(`Invalid date-picker date: ${value}`);\n }\n return date;\n};\n\nexport const addDays = (value: DateValue, amount: number): DateValue => {\n const date = parseDate(value);\n date.setUTCDate(date.getUTCDate() + amount);\n return date.toISOString().slice(0, 10);\n};\n\nexport const monthStart = (value: DateValue): DateValue => {\n parseDate(value);\n return `${value.slice(0, 7)}-01`;\n};\n\nexport const addMonths = (value: DateValue, amount: number): DateValue => {\n const date = parseDate(value);\n const day = date.getUTCDate();\n date.setUTCDate(1);\n date.setUTCMonth(date.getUTCMonth() + amount);\n const last = new Date(date);\n last.setUTCMonth(last.getUTCMonth() + 1, 0);\n date.setUTCDate(Math.min(day, last.getUTCDate()));\n return date.toISOString().slice(0, 10);\n};\n\nexport const formatDate = (value: DateValue, locale: string, options: Intl.DateTimeFormatOptions): string => {\n return new Intl.DateTimeFormat(locale, {\n ...options,\n timeZone: \"UTC\",\n }).format(parseDate(value));\n};\n\nexport const validateConstraints = (constraints: DateConstraints): void => {\n if (constraints.min) {\n parseDate(constraints.min);\n }\n if (constraints.max) {\n parseDate(constraints.max);\n }\n if (constraints.min && constraints.max && constraints.min > constraints.max) {\n throw new RangeError(\"Date-picker min must not be after max.\");\n }\n};\n\nexport const isDisabled = (value: DateValue, constraints: DateConstraints): boolean => {\n return Boolean((constraints.min && value < constraints.min) || (constraints.max && value > constraints.max) || constraints.isDateDisabled?.(value));\n};\n\nexport const validateRange = (range: DateRange | null): void => {\n if (!range) {\n return;\n }\n parseDate(range.start);\n if (range.end) {\n parseDate(range.end);\n if (range.end < range.start) {\n throw new RangeError(\"Date range end must not be before start.\");\n }\n }\n};\n\nexport const rangeAllowed = (range: DateRange, constraints: DateConstraints): boolean => {\n if (isDisabled(range.start, constraints) || (range.end && isDisabled(range.end, constraints))) {\n return false;\n }\n if (constraints.isDateDisabled && range.end) {\n for (let day = addDays(range.start, 1); day < range.end; day = addDays(day, 1)) {\n if (constraints.isDateDisabled(day)) {\n return false;\n }\n }\n }\n return true;\n};\n\n/** A blocked interval starts a new draft rather than silently selecting unavailable days. */\nexport const selectRange = (current: DateRange | null, day: DateValue, constraints: DateConstraints): DateRange => {\n if (!current || current.end) {\n return { start: day };\n }\n const next = day < current.start ? {\n start: day,\n end: current.start,\n } : {\n start: current.start,\n end: day,\n };\n return rangeAllowed(next, constraints) ? next : { start: day };\n};\n\nexport const monthDays = (month: DateValue, weekStartsOn: number): DateValue[] => {\n if (!Number.isInteger(weekStartsOn) || weekStartsOn < 0 || weekStartsOn > 6) {\n throw new RangeError(\"weekStartsOn must be an integer from 0 to 6.\");\n }\n const first = monthStart(month);\n const start = addDays(first, -((parseDate(first).getUTCDay() - weekStartsOn + 7) % 7));\n return Array.from({ length: 42 }, (_, index) => {\n return addDays(start, index);\n });\n};\n\nexport const keyboardDate = (date: DateValue, key: string, weekStartsOn: number, rtl: boolean, shift: boolean): DateValue | undefined => {\n switch (key) {\n case \"ArrowLeft\": return addDays(date, rtl ? 1 : -1);\n case \"ArrowRight\": return addDays(date, rtl ? -1 : 1);\n case \"ArrowUp\": return addDays(date, -7);\n case \"ArrowDown\": return addDays(date, 7);\n case \"Home\": return addDays(date, -((parseDate(date).getUTCDay() - weekStartsOn + 7) % 7));\n case \"End\": return addDays(date, 6 - ((parseDate(date).getUTCDay() - weekStartsOn + 7) % 7));\n case \"PageUp\": return addMonths(date, shift ? -12 : -1);\n case \"PageDown\": return addMonths(date, shift ? 12 : 1);\n default: return undefined;\n }\n};\n", "/**\n * @author WMXPY\n * @package Date Picker\n * @namespace DatePickerPanel\n * @description Month\n */\n\nimport type { DateRange, DateValue } from \"../shared/types\";\nimport type { FC, KeyboardEvent } from \"react\";\n\nexport type MonthProps = {\n readonly month: DateValue;\n readonly label: string;\n readonly days: readonly DateValue[];\n readonly weekdays: readonly string[];\n readonly getLabel: (day: DateValue) => string;\n readonly getDayNumber: (day: DateValue) => number;\n readonly focused: DateValue;\n readonly today?: DateValue | undefined;\n readonly selected: DateValue | null;\n readonly range: DateRange | null;\n readonly rangeMode: boolean;\n readonly disabled: boolean;\n readonly isAvailable: (day: DateValue) => boolean;\n readonly onSelect: (day: DateValue) => void;\n readonly onFocus: (day: DateValue) => void;\n readonly onHover: (day: DateValue) => void;\n readonly onKeyDown: (event: KeyboardEvent<HTMLButtonElement>, day: DateValue) => void;\n readonly showCaption: boolean;\n};\n\nexport const Month: FC<MonthProps> = (props: MonthProps) => {\n return (<table\n role=\"grid\"\n className=\"gridui-date-month\"\n aria-label={props.label}\n aria-multiselectable={props.rangeMode || undefined}\n >\n {props.showCaption && (<caption\n className=\"type-ui\"\n >\n {props.label}\n </caption>)}\n <thead>\n <tr>\n {props.weekdays.map((day, index) => {\n return (<th\n key={index}\n scope=\"col\"\n className=\"type-caption text-muted\"\n >\n {day}\n </th>);\n })}\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: 6 }, (_, row) => {\n return (<tr\n key={row}\n >\n {props.days.slice(row * 7, row * 7 + 7).map((day) => {\n const inMonth = day.startsWith(props.month.slice(0, 7));\n const selected = props.selected === day\n || Boolean(props.range && day >= props.range.start && day <= (props.range.end ?? props.range.start));\n const endpoint = props.range?.start === day || props.range?.end === day;\n const available = props.isAvailable(day);\n return (<td\n key={day}\n aria-selected={selected}\n data-in-range={selected && props.range !== null || undefined}\n data-range-start={props.range?.start === day || undefined}\n data-range-end={props.range?.end === day || undefined}\n >\n <button\n type=\"button\"\n className=\"gridui-date-day gridui-focus-contained gridui-hover-surface\"\n data-date={day}\n data-in-month={inMonth}\n data-selected={props.selected === day || endpoint || undefined}\n aria-label={props.getLabel(day)}\n aria-current={day === props.today ? \"date\" : undefined}\n aria-disabled={!available || undefined}\n disabled={props.disabled}\n tabIndex={!props.disabled && inMonth && day === props.focused ? 0 : -1}\n onClick={() => {\n if (available) {\n props.onSelect(day);\n }\n }}\n onFocus={() => {\n props.onFocus(day);\n }}\n onPointerEnter={() => {\n if (available) {\n props.onHover(day);\n }\n }}\n onKeyDown={(event) => {\n props.onKeyDown(event, day);\n }}\n >\n {props.getDayNumber(day)}\n </button>\n </td>);\n })}\n </tr>);\n })}\n </tbody>\n </table>);\n};\n", "/**\n * @author WMXPY\n * @package Date Picker\n * @namespace DatePickerPanel\n * @description Style\n */\n\nimport { cva } from \"class-variance-authority\";\n\nexport const panelStyles = cva(\"gridui-date-panel min-w-0 bg-background text-foreground\", {\n variants: {\n frame: {\n none: \"\",\n outline: \"border border-solid border-border rounded-control\",\n },\n size: {\n standard: \"gridui-date-panel-standard\",\n small: \"gridui-date-panel-small\",\n },\n },\n defaultVariants: {\n frame: \"none\",\n size: \"standard\",\n },\n});\n", "/**\n * @author WMXPY\n * @package Date Picker\n * @namespace DatePickerPanel\n * @description Use Panel\n */\n\nimport { addDays, addMonths, isDisabled, keyboardDate, monthDays, monthStart, parseDate, selectRange, validateConstraints, validateRange } from \"../shared/date\";\nimport type { DatePanelOptions, DateRange, DateValue } from \"../shared/types\";\nimport type { KeyboardEvent } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\ntype PanelStateOptions = DatePanelOptions & {\n readonly mode: \"single\" | \"range\" | undefined;\n readonly value: DateValue | DateRange | null | undefined;\n readonly defaultValue: DateValue | DateRange | null | undefined;\n readonly onValueChange: (value: DateValue | DateRange | null) => void;\n};\n\nexport const usePanel = (props: PanelStateOptions) => {\n const { defaultMonth, month: controlledMonth, onMonthChange, months = 1, weekStartsOn = 1, disabled, min, max, isDateDisabled } = props;\n validateConstraints(props);\n parseDate(defaultMonth);\n if (props.today) {\n parseDate(props.today);\n }\n if (![\n 1,\n 2,\n ].includes(months)) {\n throw new RangeError(\"DatePickerPanel supports one or two months.\");\n }\n const [\n localValue,\n setLocalValue,\n ] = useState<DateValue | DateRange | null>(props.defaultValue ?? null);\n const value = props.value === undefined ? localValue : props.value;\n if (props.mode === \"range\") {\n validateRange(value as DateRange | null);\n }\n else if (value !== null) {\n parseDate(value as DateValue);\n }\n const selected = typeof value === \"string\" ? value : value?.start;\n const [\n localMonth,\n setLocalMonth,\n ] = useState(monthStart(defaultMonth));\n const month = monthStart(controlledMonth ?? localMonth);\n const [\n focused,\n setFocused,\n ] = useState(selected ?? props.today ?? month);\n const [\n hovered,\n setHovered,\n ] = useState<DateValue | null>(null);\n const pendingFocus = useRef(false);\n const element = useRef<HTMLDivElement>(null);\n const visibleDays = Array.from({ length: months }, (_, index) => {\n return addMonths(month, index);\n });\n const cells = visibleDays.flatMap((visible) => {\n return monthDays(visible, weekStartsOn).filter((day) => {\n return day.startsWith(visible.slice(0, 7));\n });\n });\n const eligible = (day: DateValue): boolean => {\n return !disabled && !isDisabled(day, {\n min,\n max,\n isDateDisabled,\n });\n };\n let focusDate = cells.find(eligible) ?? cells[0] ?? month;\n if (props.today && cells.includes(props.today)) {\n focusDate = props.today;\n }\n if (selected && cells.includes(selected)) {\n focusDate = selected;\n }\n if (cells.includes(focused)) {\n focusDate = focused;\n }\n useEffect(() => {\n if (pendingFocus.current) {\n const button = element.current?.querySelector<HTMLButtonElement>(`button[data-date=\"${focusDate}\"][data-in-month=\"true\"]`);\n if (button) {\n button.focus(); pendingFocus.current = false;\n }\n }\n }, [\n focusDate,\n month,\n ]);\n const setMonth = (next: DateValue) => {\n const normalized = monthStart(next);\n if (normalized === month) {\n return;\n }\n if (controlledMonth === undefined) {\n setLocalMonth(normalized);\n }\n onMonthChange?.(normalized);\n };\n const select = (day: DateValue) => {\n if (!eligible(day)) {\n return;\n }\n if (props.mode === \"range\") {\n const next = selectRange(value as DateRange | null, day, props);\n if (props.value === undefined) {\n setLocalValue(next);\n }\n props.onValueChange(next);\n } else {\n if (props.value === undefined) {\n setLocalValue(day);\n }\n props.onValueChange(day);\n }\n setHovered(null);\n setFocused(day);\n if (!cells.includes(day)) {\n setMonth(day);\n }\n pendingFocus.current = true;\n };\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>, day: DateValue) => {\n const target = keyboardDate(day, event.key, weekStartsOn, getComputedStyle(event.currentTarget).direction === \"rtl\", event.shiftKey);\n if (!target) {\n return;\n }\n event.preventDefault();\n let next = target;\n if (min && next < min) {\n next = min;\n }\n if (max && next > max) {\n next = max;\n }\n setFocused(next);\n if (!cells.includes(next)) {\n setMonth(next);\n }\n pendingFocus.current = true;\n element.current?.querySelector<HTMLButtonElement>(`button[data-date=\"${next}\"][data-in-month=\"true\"]`)?.focus();\n };\n const canPrevious = !disabled && (!min || addDays(month, -1) >= min);\n const canNext = !disabled && (!max || addMonths(month, months) <= max);\n return {\n value,\n month,\n visibleDays,\n focused: focusDate,\n hovered,\n setHovered,\n setFocused,\n element,\n eligible,\n select,\n onKeyDown,\n canPrevious,\n canNext,\n previous: () => {\n setMonth(addMonths(month, -1));\n },\n next: () => {\n setMonth(addMonths(month, 1));\n },\n };\n};\n", "/**\n * @author WMXPY\n * @package Date Picker\n * @namespace DatePickerPanel\n * @description Date Picker Panel\n */\n\nimport { addDays, formatDate, monthDays, parseDate, rangeAllowed } from \"../shared/date\";\nimport type { DatePanelOptions, DateRange, DateValue } from \"../shared/types\";\nimport { Month } from \"./month\";\nimport { panelStyles } from \"./style\";\nimport { usePanel } from \"./use-panel\";\nimport { Button } from \"@gridui/button\";\nimport { cn } from \"@gridui/style-utils\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { type ComponentPropsWithRef, type FC, useImperativeHandle } from \"react\";\n\nexport type DatePickerPanelProps = Omit<ComponentPropsWithRef<\"div\">, \"defaultValue\" | \"onChange\" | \"children\"> & DatePanelOptions & {\n readonly frame?: \"none\" | \"outline\";\n} & ({\n readonly mode?: \"single\";\n readonly value?: DateValue | null;\n readonly defaultValue?: DateValue | null;\n readonly onValueChange?: (value: DateValue | null) => void;\n} | {\n readonly mode: \"range\";\n readonly value?: DateRange | null;\n readonly defaultValue?: DateRange | null;\n readonly onValueChange?: (value: DateRange | null) => void;\n});\n\nexport const DatePickerPanel: FC<DatePickerPanelProps> = (props: DatePickerPanelProps) => {\n const { defaultMonth, month, onMonthChange, months, weekStartsOn = 1, locale = \"en-US\", today, min, max, isDateDisabled, labels,\n mode, value, defaultValue, onValueChange, disabled, size, frame, className, ref, ...restProps } = props;\n const state = usePanel({\n defaultMonth,\n month,\n onMonthChange,\n months,\n weekStartsOn,\n today,\n min,\n max,\n isDateDisabled,\n disabled,\n mode,\n value,\n defaultValue,\n onValueChange: (next) => {\n if (mode === \"range\") {\n onValueChange?.(next as DateRange | null);\n }\n else {\n onValueChange?.(next as DateValue | null);\n }\n },\n });\n useImperativeHandle(ref, () => {\n return state.element.current as HTMLDivElement;\n });\n const range = mode === \"range\" ? state.value as DateRange | null : null;\n let preview = range;\n if (range && !range.end && state.hovered) {\n const candidate = state.hovered < range.start ? {\n start: state.hovered,\n end: range.start,\n } : {\n start: range.start,\n end: state.hovered,\n };\n if (rangeAllowed(candidate, props)) {\n preview = candidate;\n }\n }\n return (<div\n {...restProps}\n ref={state.element}\n className={cn(panelStyles({\n frame,\n size,\n }), className)}\n data-disabled={disabled || undefined}\n >\n <div\n className=\"gridui-date-panel-navigation\"\n >\n <Button\n variant=\"quiet\"\n layout=\"icon\"\n size=\"small\"\n disabled={!state.canPrevious}\n aria-label={labels?.previousMonth ?? \"Previous month\"}\n onClick={state.previous}\n >\n <ChevronLeft\n aria-hidden=\"true\"\n />\n </Button>\n <div\n className=\"type-ui\"\n aria-live=\"polite\"\n >\n {formatDate(state.month, locale, {\n year: \"numeric\",\n month: \"long\",\n })}\n {state.visibleDays.length === 2 && ` \u2013 ${formatDate(state.visibleDays[1]!, locale, {\n year: \"numeric\",\n month: \"long\",\n })}`}\n </div>\n <Button\n variant=\"quiet\"\n layout=\"icon\"\n size=\"small\"\n disabled={!state.canNext}\n aria-label={labels?.nextMonth ?? \"Next month\"}\n onClick={state.next}\n >\n <ChevronRight\n aria-hidden=\"true\"\n />\n </Button>\n </div>\n <div\n className=\"gridui-date-panel-months\"\n data-months={state.visibleDays.length}\n onPointerLeave={() => {\n state.setHovered(null);\n }}\n >\n {state.visibleDays.map((visible) => {\n return (<Month\n key={visible}\n month={visible}\n label={formatDate(visible, locale, {\n year: \"numeric\",\n month: \"long\",\n })}\n days={monthDays(visible, weekStartsOn)}\n weekdays={Array.from({ length: 7 }, (_, day) => {\n return formatDate(addDays(\"2024-01-07\", weekStartsOn + day), locale, { weekday: \"short\" });\n })}\n getLabel={(day) => {\n return formatDate(day, locale, { dateStyle: \"full\" });\n }}\n getDayNumber={(day) => {\n return parseDate(day).getUTCDate();\n }}\n focused={state.focused}\n today={today}\n selected={typeof state.value === \"string\" ? state.value : null}\n range={preview}\n rangeMode={mode === \"range\"}\n disabled={disabled === true}\n isAvailable={state.eligible}\n onSelect={state.select}\n onFocus={state.setFocused}\n onHover={state.setHovered}\n onKeyDown={state.onKeyDown}\n showCaption={state.visibleDays.length > 1}\n />);\n })}\n </div>\n </div>);\n};\n", "/**\n * @author WMXPY\n * @package Date Picker\n * @namespace Shared\n * @description Picker\n */\n\nimport { DatePickerPanel } from \"../date-picker-panel/date-picker-panel\";\nimport { formatDate, isDisabled, parseDate, rangeAllowed, validateConstraints, validateRange } from \"./date\";\nimport type { RangePickerOptions, SinglePickerOptions } from \"./picker-types\";\nimport type { DateRange, DateValue } from \"./types\";\nimport { Button } from \"@gridui/button\";\nimport { useFormReset } from \"@gridui/form\";\nimport { Popover, PopoverPanel, PopoverTrigger } from \"@gridui/popover\";\nimport { cn } from \"@gridui/style-utils\";\nimport { CalendarDays, X } from \"lucide-react\";\nimport { type FC, useEffect, useId, useRef, useState } from \"react\";\n\nexport type PickerProps = ({\n readonly mode: \"single\";\n} & SinglePickerOptions) | ({\n readonly mode: \"range\";\n} & RangePickerOptions);\n\nexport const Picker: FC<PickerProps> = (props: PickerProps) => {\n const { mode, label, name, form, readOnly = false, open: controlledOpen, defaultOpen = false, onOpenChange,\n value: controlledValue, defaultValue = null, onValueChange, formatValue, pickerLabels, footer, clearable = true,\n defaultMonth, month, onMonthChange, months = mode === \"range\" ? 2 : 1, weekStartsOn, locale = \"en-US\", today,\n min, max, isDateDisabled, labels, disabled = false, size = \"standard\", className, dir, ...restProps } = props;\n parseDate(defaultMonth);\n validateConstraints(props);\n if (today) {\n parseDate(today);\n }\n const [\n localValue,\n setLocalValue,\n ] = useState<DateValue | DateRange | null>(defaultValue);\n const value = controlledValue === undefined ? localValue : controlledValue;\n if (mode === \"single\" && value !== null) {\n parseDate(value as DateValue);\n }\n if (mode === \"range\") {\n validateRange(value as DateRange | null);\n }\n const [\n localOpen,\n setLocalOpen,\n ] = useState(defaultOpen);\n const open = !disabled && !readOnly && (controlledOpen ?? localOpen);\n const [\n draft,\n setDraft,\n ] = useState<DateRange | null>(mode === \"range\" ? value as DateRange | null : null);\n const id = useId();\n const input = useRef<HTMLInputElement>(null);\n const control = useRef<HTMLButtonElement>(null);\n const panel = useRef<HTMLDivElement>(null);\n const initial = useRef(defaultValue);\n const returnFocus = useRef(false);\n const rangeStart = typeof value === \"object\" ? value?.start : undefined;\n const rangeEnd = typeof value === \"object\" ? value?.end : undefined;\n useEffect(() => {\n if (open && mode === \"range\") {\n setDraft(rangeStart ? {\n start: rangeStart,\n ...(rangeEnd ? { end: rangeEnd } : {}),\n } : null);\n }\n }, [\n open,\n mode,\n rangeStart,\n rangeEnd,\n ]);\n const text = {\n placeholder: mode === \"range\" ? \"Choose dates\" : \"Choose date\",\n clear: \"Clear date\",\n today: \"Today\",\n apply: \"Apply\",\n cancel: \"Cancel\",\n ...pickerLabels,\n };\n useFormReset(input, () => {\n if (controlledValue === undefined) {\n setLocalValue(initial.current);\n }\n setDraft(mode === \"range\" ? initial.current as DateRange | null : null);\n if (controlledOpen === undefined) {\n setLocalOpen(false);\n }\n }, form);\n const changeOpen = (next: boolean) => {\n if (next && (disabled || readOnly || control.current?.matches(\":disabled\"))) {\n return;\n }\n if (controlledOpen === undefined) {\n setLocalOpen(next);\n }\n onOpenChange?.(next);\n };\n const closeFromAction = () => {\n returnFocus.current = true;\n changeOpen(false);\n };\n const change = (next: DateValue | DateRange | null) => {\n if (disabled || readOnly || control.current?.matches(\":disabled\")) {\n return;\n }\n if (controlledValue === undefined) {\n setLocalValue(next);\n }\n if (mode === \"single\") {\n onValueChange?.(next as DateValue | null);\n }\n else {\n onValueChange?.(next as DateRange | null);\n }\n };\n let display = text.placeholder;\n if (value !== null) {\n if (mode === \"single\") {\n display = formatValue?.(value as DateValue) ?? formatDate(value as DateValue, locale, { dateStyle: \"medium\" });\n }\n else {\n const range = value as DateRange;\n display = formatValue?.(range) ?? `${formatDate(range.start, locale, { dateStyle: \"medium\" })}${range.end ? ` \u2013 ${formatDate(range.end, locale, { dateStyle: \"medium\" })}` : \"\"}`;\n }\n }\n const options = {\n defaultMonth: typeof value === \"string\" ? value : value?.start ?? defaultMonth,\n month,\n onMonthChange,\n months,\n weekStartsOn,\n locale,\n today,\n min,\n max,\n isDateDisabled,\n labels,\n size,\n };\n const range = mode === \"range\" ? value as DateRange | null : null;\n return (<div\n {...restProps}\n dir={dir}\n className={cn(\"gridui-date-picker min-w-0\", className)}\n >\n <span\n id={`${id}-label`}\n className=\"mb-gridui-4 block type-ui\"\n >\n {label}\n </span>\n <Popover\n open={open}\n onOpenChange={changeOpen}\n hoverEnabled={false}\n >\n <div\n className=\"gridui-date-picker-field\"\n >\n <PopoverTrigger\n ref={control}\n variant=\"secondary\"\n size={size}\n disabled={disabled || readOnly}\n className=\"gridui-date-picker-trigger w-full justify-between text-left\"\n aria-labelledby={`${id}-label ${id}-value`}\n >\n <span\n id={`${id}-value`}\n className={cn(\"min-w-0 flex-1 wrap-anywhere\", value === null && \"text-muted\")}\n >\n {display}\n </span>\n <CalendarDays\n aria-hidden=\"true\"\n />\n </PopoverTrigger>\n {clearable && value !== null && (<Button\n variant=\"quiet\"\n layout=\"icon\"\n size={size}\n disabled={disabled || readOnly}\n aria-label={text.clear}\n onClick={() => {\n change(null); setDraft(null);\n }}\n >\n <X\n aria-hidden=\"true\"\n />\n </Button>)}\n </div>\n <PopoverPanel\n ref={panel}\n dir={dir}\n aria-labelledby={`${id}-label`}\n className={cn(\"gridui-date-picker-popup flex flex-col overflow-y-hidden p-0\", months === 2 ? \"w-160\" : \"w-80\")}\n onEscapeKeyDown={() => {\n returnFocus.current = true;\n }}\n onCloseAutoFocus={(event) => {\n if (!returnFocus.current) {\n return;\n }\n event.preventDefault();\n const active = control.current?.ownerDocument.activeElement;\n if (active === control.current?.ownerDocument.body || active === control.current || (active && panel.current?.contains(active))) {\n control.current?.focus();\n }\n returnFocus.current = false;\n }}\n onOpenAutoFocus={(event) => {\n returnFocus.current = false;\n const day = panel.current?.querySelector<HTMLButtonElement>('button[data-date][tabindex=\"0\"]');\n if (day) {\n event.preventDefault(); day.focus();\n }\n }}\n >\n <div\n className=\"min-h-0 overflow-y-auto overscroll-contain\"\n >\n {mode === \"range\" ? (<DatePickerPanel\n {...options}\n mode=\"range\"\n value={draft}\n onValueChange={setDraft}\n />) : (<DatePickerPanel\n {...options}\n value={value as DateValue | null}\n onValueChange={(next) => {\n change(next); closeFromAction();\n }}\n />)}\n </div>\n <div\n className=\"gridui-date-picker-footer\"\n >\n {footer}\n {mode === \"range\" ? (<>\n <span\n className=\"type-caption text-muted\"\n aria-live=\"polite\"\n >\n {draft ? `${formatDate(draft.start, locale, {\n month: \"short\",\n day: \"numeric\",\n })}${draft.end ? ` \u2013 ${formatDate(draft.end, locale, {\n month: \"short\",\n day: \"numeric\",\n })}` : \"\"}` : text.placeholder}\n </span>\n <div\n className=\"flex flex-wrap gap-gridui-8\"\n >\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n closeFromAction();\n }}\n >\n {text.cancel}\n </Button>\n <Button\n size=\"small\"\n disabled={!draft?.end || !rangeAllowed(draft, props)}\n onClick={() => {\n if (draft?.end && rangeAllowed(draft, props)) {\n change(draft); closeFromAction();\n }\n }}\n >\n {text.apply}\n </Button>\n </div>\n </>) : (<>\n {today && (<Button\n variant=\"quiet\"\n size=\"small\"\n disabled={isDisabled(today, props)}\n onClick={() => {\n change(today); closeFromAction();\n }}\n >\n {text.today}\n </Button>)}\n {clearable && (<Button\n variant=\"quiet\"\n size=\"small\"\n onClick={() => {\n change(null); closeFromAction();\n }}\n >\n {text.clear}\n </Button>)}\n </>)}\n </div>\n </PopoverPanel>\n </Popover>\n <input\n ref={input}\n type=\"hidden\"\n name={mode === \"range\" && name ? `${name}.start` : name}\n form={form}\n disabled={disabled}\n value={mode === \"range\" ? range?.start ?? \"\" : (value as DateValue | null) ?? \"\"}\n />\n {mode === \"range\" && (<input\n type=\"hidden\"\n name={name ? `${name}.end` : undefined}\n form={form}\n disabled={disabled}\n value={range?.end ?? \"\"}\n />)}\n </div>);\n};\n", "/**\n * @author WMXPY\n * @package Date Picker\n * @namespace DatePicker\n * @description Date Picker\n */\n\nimport { Picker } from \"../shared/picker\";\nimport type { SinglePickerOptions } from \"../shared/picker-types\";\nimport type { FC } from \"react\";\n\nexport type DatePickerProps = SinglePickerOptions;\n\nexport const DatePicker: FC<DatePickerProps> = (props: DatePickerProps) => {\n return (<Picker\n {...props}\n mode=\"single\"\n />);\n};\n", "/**\n * @author WMXPY\n * @package Date Picker\n * @namespace DateRangePicker\n * @description Date Range Picker\n */\n\nimport { Picker } from \"../shared/picker\";\nimport type { RangePickerOptions } from \"../shared/picker-types\";\nimport type { FC } from \"react\";\n\nexport type DateRangePickerProps = RangePickerOptions;\n\nexport const DateRangePicker: FC<DateRangePickerProps> = (props: DateRangePickerProps) => {\n return (<Picker\n {...props}\n mode=\"range\"\n />);\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["jsx", "jsxs", "Button", "cn", "useEffect", "useRef", "useState", "jsx", "jsxs", "range", "jsx", "jsx"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author WMXPY
|
|
3
|
+
* @package Date Picker
|
|
4
|
+
* @namespace Shared
|
|
5
|
+
* @description Date
|
|
6
|
+
*/
|
|
7
|
+
import type { DateConstraints, DateRange, DateValue } from "./types";
|
|
8
|
+
export declare const parseDate: (value: DateValue) => Date;
|
|
9
|
+
export declare const addDays: (value: DateValue, amount: number) => DateValue;
|
|
10
|
+
export declare const monthStart: (value: DateValue) => DateValue;
|
|
11
|
+
export declare const addMonths: (value: DateValue, amount: number) => DateValue;
|
|
12
|
+
export declare const formatDate: (value: DateValue, locale: string, options: Intl.DateTimeFormatOptions) => string;
|
|
13
|
+
export declare const validateConstraints: (constraints: DateConstraints) => void;
|
|
14
|
+
export declare const isDisabled: (value: DateValue, constraints: DateConstraints) => boolean;
|
|
15
|
+
export declare const validateRange: (range: DateRange | null) => void;
|
|
16
|
+
export declare const rangeAllowed: (range: DateRange, constraints: DateConstraints) => boolean;
|
|
17
|
+
/** A blocked interval starts a new draft rather than silently selecting unavailable days. */
|
|
18
|
+
export declare const selectRange: (current: DateRange | null, day: DateValue, constraints: DateConstraints) => DateRange;
|
|
19
|
+
export declare const monthDays: (month: DateValue, weekStartsOn: number) => DateValue[];
|
|
20
|
+
export declare const keyboardDate: (date: DateValue, key: string, weekStartsOn: number, rtl: boolean, shift: boolean) => DateValue | undefined;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author WMXPY
|
|
3
|
+
* @package Date Picker
|
|
4
|
+
* @namespace Shared
|
|
5
|
+
* @description Picker Types
|
|
6
|
+
*/
|
|
7
|
+
import type { DatePanelOptions, DateRange, DateValue } from "./types";
|
|
8
|
+
import type { ComponentPropsWithRef, ReactNode } from "react";
|
|
9
|
+
export type PickerLabels = {
|
|
10
|
+
readonly placeholder: string;
|
|
11
|
+
readonly clear: string;
|
|
12
|
+
readonly today: string;
|
|
13
|
+
readonly apply: string;
|
|
14
|
+
readonly cancel: string;
|
|
15
|
+
};
|
|
16
|
+
export type PickerOptions = Omit<ComponentPropsWithRef<"div">, "defaultValue" | "onChange" | "children"> & DatePanelOptions & {
|
|
17
|
+
readonly label: string;
|
|
18
|
+
readonly name?: string;
|
|
19
|
+
readonly form?: string;
|
|
20
|
+
readonly readOnly?: boolean;
|
|
21
|
+
readonly open?: boolean;
|
|
22
|
+
readonly defaultOpen?: boolean;
|
|
23
|
+
readonly onOpenChange?: (open: boolean) => void;
|
|
24
|
+
readonly pickerLabels?: Partial<PickerLabels>;
|
|
25
|
+
readonly footer?: ReactNode;
|
|
26
|
+
readonly clearable?: boolean;
|
|
27
|
+
};
|
|
28
|
+
export type SinglePickerOptions = PickerOptions & {
|
|
29
|
+
readonly value?: DateValue | null;
|
|
30
|
+
readonly defaultValue?: DateValue | null;
|
|
31
|
+
readonly onValueChange?: (value: DateValue | null) => void;
|
|
32
|
+
readonly formatValue?: (value: DateValue) => string;
|
|
33
|
+
};
|
|
34
|
+
export type RangePickerOptions = PickerOptions & {
|
|
35
|
+
readonly value?: DateRange | null;
|
|
36
|
+
readonly defaultValue?: DateRange | null;
|
|
37
|
+
readonly onValueChange?: (value: DateRange | null) => void;
|
|
38
|
+
readonly formatValue?: (value: DateRange) => string;
|
|
39
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author WMXPY
|
|
3
|
+
* @package Date Picker
|
|
4
|
+
* @namespace Shared
|
|
5
|
+
* @description Picker
|
|
6
|
+
*/
|
|
7
|
+
import type { RangePickerOptions, SinglePickerOptions } from "./picker-types";
|
|
8
|
+
import { type FC } from "react";
|
|
9
|
+
export type PickerProps = ({
|
|
10
|
+
readonly mode: "single";
|
|
11
|
+
} & SinglePickerOptions) | ({
|
|
12
|
+
readonly mode: "range";
|
|
13
|
+
} & RangePickerOptions);
|
|
14
|
+
export declare const Picker: FC<PickerProps>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author WMXPY
|
|
3
|
+
* @package Date Picker
|
|
4
|
+
* @namespace Shared
|
|
5
|
+
* @description Types
|
|
6
|
+
*/
|
|
7
|
+
/** Gregorian civil date, formatted YYYY-MM-DD without timezone conversion. */
|
|
8
|
+
export type DateValue = string;
|
|
9
|
+
export type DateRange = {
|
|
10
|
+
readonly start: DateValue;
|
|
11
|
+
readonly end?: DateValue;
|
|
12
|
+
};
|
|
13
|
+
export type DateConstraints = {
|
|
14
|
+
readonly min?: DateValue | undefined;
|
|
15
|
+
readonly max?: DateValue | undefined;
|
|
16
|
+
readonly isDateDisabled?: ((date: DateValue) => boolean) | undefined;
|
|
17
|
+
};
|
|
18
|
+
export type DatePanelLabels = {
|
|
19
|
+
readonly previousMonth: string;
|
|
20
|
+
readonly nextMonth: string;
|
|
21
|
+
};
|
|
22
|
+
export type DatePanelOptions = DateConstraints & {
|
|
23
|
+
readonly defaultMonth: DateValue;
|
|
24
|
+
readonly month?: DateValue | undefined;
|
|
25
|
+
readonly onMonthChange?: ((month: DateValue) => void) | undefined;
|
|
26
|
+
readonly months?: 1 | 2 | undefined;
|
|
27
|
+
readonly weekStartsOn?: number | undefined;
|
|
28
|
+
readonly locale?: string | undefined;
|
|
29
|
+
readonly today?: DateValue | undefined;
|
|
30
|
+
readonly labels?: Partial<DatePanelLabels> | undefined;
|
|
31
|
+
readonly disabled?: boolean | undefined;
|
|
32
|
+
readonly size?: "standard" | "small" | undefined;
|
|
33
|
+
};
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties;
|
|
3
|
+
@layer theme, base, components, utilities;
|
|
4
|
+
@layer theme {
|
|
5
|
+
:root, :host {
|
|
6
|
+
--spacing: 0.25rem;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
@layer utilities {
|
|
10
|
+
.mb-gridui-4 {
|
|
11
|
+
margin-bottom: var(--gridui-space-4);
|
|
12
|
+
}
|
|
13
|
+
.block {
|
|
14
|
+
display: block;
|
|
15
|
+
}
|
|
16
|
+
.flex {
|
|
17
|
+
display: flex;
|
|
18
|
+
}
|
|
19
|
+
.grid {
|
|
20
|
+
display: grid;
|
|
21
|
+
}
|
|
22
|
+
.hidden {
|
|
23
|
+
display: none;
|
|
24
|
+
}
|
|
25
|
+
.min-h-0 {
|
|
26
|
+
min-height: 0px;
|
|
27
|
+
}
|
|
28
|
+
.w-80 {
|
|
29
|
+
width: calc(var(--spacing) * 80);
|
|
30
|
+
}
|
|
31
|
+
.w-160 {
|
|
32
|
+
width: calc(var(--spacing) * 160);
|
|
33
|
+
}
|
|
34
|
+
.w-full {
|
|
35
|
+
width: 100%;
|
|
36
|
+
}
|
|
37
|
+
.min-w-0 {
|
|
38
|
+
min-width: 0px;
|
|
39
|
+
}
|
|
40
|
+
.flex-1 {
|
|
41
|
+
flex: 1;
|
|
42
|
+
}
|
|
43
|
+
.flex-col {
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
}
|
|
46
|
+
.flex-wrap {
|
|
47
|
+
flex-wrap: wrap;
|
|
48
|
+
}
|
|
49
|
+
.justify-between {
|
|
50
|
+
justify-content: space-between;
|
|
51
|
+
}
|
|
52
|
+
.gap-gridui-8 {
|
|
53
|
+
gap: var(--gridui-space-8);
|
|
54
|
+
}
|
|
55
|
+
.overflow-y-auto {
|
|
56
|
+
overflow-y: auto;
|
|
57
|
+
}
|
|
58
|
+
.overflow-y-hidden {
|
|
59
|
+
overflow-y: hidden;
|
|
60
|
+
}
|
|
61
|
+
.overscroll-contain {
|
|
62
|
+
overscroll-behavior: contain;
|
|
63
|
+
}
|
|
64
|
+
.rounded-control {
|
|
65
|
+
border-radius: var(--gridui-control-radius);
|
|
66
|
+
}
|
|
67
|
+
.border {
|
|
68
|
+
border-style: var(--tw-border-style);
|
|
69
|
+
border-width: 1px;
|
|
70
|
+
}
|
|
71
|
+
.border-solid {
|
|
72
|
+
--tw-border-style: solid;
|
|
73
|
+
border-style: solid;
|
|
74
|
+
}
|
|
75
|
+
.border-border {
|
|
76
|
+
border-color: var(--gridui-border);
|
|
77
|
+
}
|
|
78
|
+
.bg-background {
|
|
79
|
+
background-color: var(--gridui-background);
|
|
80
|
+
}
|
|
81
|
+
.p-0 {
|
|
82
|
+
padding: 0px;
|
|
83
|
+
}
|
|
84
|
+
.text-left {
|
|
85
|
+
text-align: left;
|
|
86
|
+
}
|
|
87
|
+
.type-caption {
|
|
88
|
+
font: var(--gridui-type-caption);
|
|
89
|
+
letter-spacing: normal;
|
|
90
|
+
}
|
|
91
|
+
.type-ui {
|
|
92
|
+
font: var(--gridui-type-ui);
|
|
93
|
+
letter-spacing: normal;
|
|
94
|
+
}
|
|
95
|
+
.wrap-anywhere {
|
|
96
|
+
overflow-wrap: anywhere;
|
|
97
|
+
}
|
|
98
|
+
.text-foreground {
|
|
99
|
+
color: var(--gridui-foreground);
|
|
100
|
+
}
|
|
101
|
+
.text-muted {
|
|
102
|
+
color: var(--gridui-muted);
|
|
103
|
+
}
|
|
104
|
+
.outline {
|
|
105
|
+
outline-style: var(--tw-outline-style);
|
|
106
|
+
outline-width: 1px;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
@layer components {
|
|
110
|
+
.gridui-date-panel {
|
|
111
|
+
container-type: inline-size;
|
|
112
|
+
}
|
|
113
|
+
.gridui-date-panel-standard {
|
|
114
|
+
--gridui-date-cell-height: 2.75rem;
|
|
115
|
+
}
|
|
116
|
+
.gridui-date-panel-small {
|
|
117
|
+
--gridui-date-cell-height: 2.25rem;
|
|
118
|
+
}
|
|
119
|
+
.gridui-date-panel-navigation {
|
|
120
|
+
display: flex;
|
|
121
|
+
align-items: center;
|
|
122
|
+
justify-content: space-between;
|
|
123
|
+
gap: var(--gridui-space-8);
|
|
124
|
+
padding: var(--gridui-space-8);
|
|
125
|
+
text-align: center;
|
|
126
|
+
overflow-wrap: anywhere;
|
|
127
|
+
}
|
|
128
|
+
.gridui-date-panel-months {
|
|
129
|
+
display: grid;
|
|
130
|
+
grid-template-columns: minmax(0, 1fr);
|
|
131
|
+
gap: var(--gridui-space-16);
|
|
132
|
+
padding: var(--gridui-space-8);
|
|
133
|
+
}
|
|
134
|
+
.gridui-date-month {
|
|
135
|
+
width: 100%;
|
|
136
|
+
border-collapse: separate;
|
|
137
|
+
border-spacing: 0;
|
|
138
|
+
table-layout: fixed;
|
|
139
|
+
}
|
|
140
|
+
.gridui-date-month caption {
|
|
141
|
+
padding-block: var(--gridui-space-8);
|
|
142
|
+
text-align: center;
|
|
143
|
+
}
|
|
144
|
+
.gridui-date-month th {
|
|
145
|
+
height: 2rem;
|
|
146
|
+
padding: 0;
|
|
147
|
+
font-weight: 400;
|
|
148
|
+
text-align: center;
|
|
149
|
+
}
|
|
150
|
+
.gridui-date-month td {
|
|
151
|
+
position: relative;
|
|
152
|
+
padding: 2px 0;
|
|
153
|
+
isolation: isolate;
|
|
154
|
+
}
|
|
155
|
+
.gridui-date-month td[data-in-range]::before {
|
|
156
|
+
position: absolute;
|
|
157
|
+
z-index: var(--gridui-z-background);
|
|
158
|
+
inset: 2px 0;
|
|
159
|
+
background: var(--gridui-accent-background);
|
|
160
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
161
|
+
background: color-mix(in srgb, var(--gridui-accent-background) 14%, var(--gridui-background));
|
|
162
|
+
}
|
|
163
|
+
content: "";
|
|
164
|
+
}
|
|
165
|
+
.gridui-date-month td[data-range-start]::before {
|
|
166
|
+
inset-inline-start: 50%;
|
|
167
|
+
}
|
|
168
|
+
.gridui-date-month td[data-range-end]::before {
|
|
169
|
+
inset-inline-end: 50%;
|
|
170
|
+
}
|
|
171
|
+
.gridui-date-day {
|
|
172
|
+
display: grid;
|
|
173
|
+
position: relative;
|
|
174
|
+
place-items: center;
|
|
175
|
+
width: 100%;
|
|
176
|
+
min-width: 0;
|
|
177
|
+
height: var(--gridui-date-cell-height);
|
|
178
|
+
padding: 0;
|
|
179
|
+
border: 0;
|
|
180
|
+
border-radius: var(--gridui-control-radius);
|
|
181
|
+
background: transparent;
|
|
182
|
+
color: var(--gridui-foreground);
|
|
183
|
+
font: inherit;
|
|
184
|
+
font-variant-numeric: tabular-nums;
|
|
185
|
+
cursor: pointer;
|
|
186
|
+
}
|
|
187
|
+
.gridui-date-day[data-in-month="false"] {
|
|
188
|
+
color: var(--gridui-muted);
|
|
189
|
+
}
|
|
190
|
+
.gridui-date-day[aria-current="date"]::after {
|
|
191
|
+
position: absolute;
|
|
192
|
+
inset-block-end: 3px;
|
|
193
|
+
width: 3px;
|
|
194
|
+
height: 3px;
|
|
195
|
+
border-radius: 50%;
|
|
196
|
+
background: currentColor;
|
|
197
|
+
content: "";
|
|
198
|
+
}
|
|
199
|
+
.gridui-date-day[aria-disabled], .gridui-date-day:disabled {
|
|
200
|
+
opacity: 0.4;
|
|
201
|
+
cursor: not-allowed;
|
|
202
|
+
}
|
|
203
|
+
.gridui-date-day:hover:not([aria-disabled], :disabled) {
|
|
204
|
+
background: var(--gridui-surface-hover);
|
|
205
|
+
}
|
|
206
|
+
.gridui-date-day[data-selected], .gridui-date-day[data-selected]:hover:not([aria-disabled], :disabled) {
|
|
207
|
+
background: var(--gridui-accent-background);
|
|
208
|
+
color: var(--gridui-accent-foreground);
|
|
209
|
+
}
|
|
210
|
+
@container (min-width: 36rem) {
|
|
211
|
+
.gridui-date-panel-months[data-months="2"] {
|
|
212
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
@media (pointer: coarse) {
|
|
216
|
+
.gridui-date-panel-small {
|
|
217
|
+
--gridui-date-cell-height: 2.75rem;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
.gridui-date-picker-field {
|
|
221
|
+
display: flex;
|
|
222
|
+
min-width: 0;
|
|
223
|
+
gap: var(--gridui-space-4);
|
|
224
|
+
align-items: stretch;
|
|
225
|
+
}
|
|
226
|
+
.gridui-date-picker-trigger {
|
|
227
|
+
flex: 1;
|
|
228
|
+
}
|
|
229
|
+
.gridui-date-picker-footer {
|
|
230
|
+
display: flex;
|
|
231
|
+
flex-shrink: 0;
|
|
232
|
+
flex-wrap: wrap;
|
|
233
|
+
align-items: center;
|
|
234
|
+
justify-content: space-between;
|
|
235
|
+
gap: var(--gridui-space-8);
|
|
236
|
+
padding: var(--gridui-space-8);
|
|
237
|
+
border-block-start: 1px solid var(--gridui-border);
|
|
238
|
+
}
|
|
239
|
+
.gridui-date-picker-footer:empty {
|
|
240
|
+
display: none;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
@property --tw-border-style {
|
|
244
|
+
syntax: "*";
|
|
245
|
+
inherits: false;
|
|
246
|
+
initial-value: solid;
|
|
247
|
+
}
|
|
248
|
+
@property --tw-outline-style {
|
|
249
|
+
syntax: "*";
|
|
250
|
+
inherits: false;
|
|
251
|
+
initial-value: solid;
|
|
252
|
+
}
|
|
253
|
+
@layer properties {
|
|
254
|
+
@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
|
|
255
|
+
*, ::before, ::after, ::backdrop {
|
|
256
|
+
--tw-border-style: solid;
|
|
257
|
+
--tw-outline-style: solid;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,56 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gridui/date-picker",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Composable GridUI date and range selection",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md"
|
|
10
|
+
],
|
|
11
|
+
"sideEffects": [
|
|
12
|
+
"**/*.css"
|
|
13
|
+
],
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./styles.css": "./dist/styles.css"
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"react": "^19.2.0",
|
|
26
|
+
"react-dom": "^19.2.0"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@gridui/button": "^2.1.3",
|
|
30
|
+
"@gridui/form": "^2.0.1",
|
|
31
|
+
"@gridui/popover": "^1.1.1",
|
|
32
|
+
"@gridui/style-utils": "^2.1.3",
|
|
33
|
+
"@gridui/theme": "^2.3.1",
|
|
34
|
+
"class-variance-authority": "0.7.1",
|
|
35
|
+
"lucide-react": "1.64.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@gridui-internal/configuration": "0.0.0-internal",
|
|
39
|
+
"@jest/globals": "30.5.2",
|
|
40
|
+
"@storybook/react-vite": "10.6.5",
|
|
41
|
+
"@types/jest": "30.0.0",
|
|
42
|
+
"@types/node": "26.6.6",
|
|
43
|
+
"@types/react": "19.3.0",
|
|
44
|
+
"@types/react-dom": "19.3.0",
|
|
45
|
+
"jest": "30.5.2",
|
|
46
|
+
"react": "19.3.1",
|
|
47
|
+
"react-dom": "19.3.1",
|
|
48
|
+
"typescript": "6.0.3"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "node ../../scripts/compilation/package.ts",
|
|
52
|
+
"compile": "tsc --project tsconfig.json",
|
|
53
|
+
"test": "jest",
|
|
54
|
+
"coverage": "jest --coverage"
|
|
55
|
+
}
|
|
6
56
|
}
|