{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "date-picker",
  "title": "Date Picker",
  "description": "A compact single-date and range picker with direct month and year selection, accessible calendar navigation, constraints, and form values.",
  "dependencies": [
    "@base-ui/react",
    "lucide-react",
    "react-day-picker"
  ],
  "files": [
    {
      "path": "registry/rivetui/components/date-picker/date-picker.tsx",
      "content": "\"use client\";\n\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport { CalendarDays, CalendarRange, ChevronDown, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport * as React from \"react\";\nimport {\n  type DateRange,\n  DayPicker,\n  getDefaultClassNames,\n  type PropsBase,\n  type PropsRange,\n  type PropsSingle,\n} from \"react-day-picker\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Calendar({\n  captionLayout = \"dropdown\",\n  className,\n  classNames,\n  components,\n  defaultMonth,\n  endMonth,\n  month,\n  showOutsideDays = true,\n  startMonth,\n  ...props\n}: React.ComponentProps<typeof DayPicker>) {\n  const defaultClassNames = getDefaultClassNames();\n  const referenceYear = (month ?? defaultMonth ?? new Date()).getFullYear();\n\n  return (\n    <DayPicker\n      captionLayout={captionLayout}\n      showOutsideDays={showOutsideDays}\n      defaultMonth={defaultMonth}\n      endMonth={endMonth ?? new Date(referenceYear + 20, 11)}\n      month={month}\n      startMonth={startMonth ?? new Date(referenceYear - 100, 0)}\n      className={cn(\"w-[17.25rem] max-w-full bg-popover p-3 text-popover-foreground\", className)}\n      classNames={{\n        root: cn(\"w-full\", defaultClassNames.root),\n        months: cn(\"relative flex flex-col gap-4 sm:flex-row\", defaultClassNames.months),\n        month: cn(\"flex w-full flex-col gap-2\", defaultClassNames.month),\n        nav: cn(\n          \"absolute inset-x-0 top-0 flex h-8 items-center justify-between\",\n          defaultClassNames.nav,\n        ),\n        button_previous: cn(\n          \"inline-flex size-8 cursor-pointer items-center justify-center border border-transparent text-muted-foreground outline-none transition-[background-color,border-color,box-shadow,color] duration-100 hover:border-border hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-40 motion-reduce:transition-none\",\n          defaultClassNames.button_previous,\n        ),\n        button_next: cn(\n          \"inline-flex size-8 cursor-pointer items-center justify-center border border-transparent text-muted-foreground outline-none transition-[background-color,border-color,box-shadow,color] duration-100 hover:border-border hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 disabled:pointer-events-none disabled:opacity-40 motion-reduce:transition-none\",\n          defaultClassNames.button_next,\n        ),\n        month_caption: cn(\n          \"flex h-8 items-center justify-center px-10\",\n          defaultClassNames.month_caption,\n        ),\n        caption_label: cn(\n          \"inline-flex items-center gap-1 font-mono text-[0.6875rem] font-medium uppercase tracking-[0.12em]\",\n          defaultClassNames.caption_label,\n        ),\n        dropdowns: cn(\"flex h-8 items-center justify-center gap-1\", defaultClassNames.dropdowns),\n        dropdown_root: cn(\n          \"relative inline-flex h-8 items-center gap-1 border border-transparent px-2 text-foreground outline-none transition-[background-color,border-color,box-shadow] duration-100 hover:border-border hover:bg-muted has-[:focus-visible]:border-ring has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-ring/40 motion-reduce:transition-none\",\n          defaultClassNames.dropdown_root,\n        ),\n        dropdown: cn(\n          \"absolute inset-0 cursor-pointer opacity-0 outline-none\",\n          defaultClassNames.dropdown,\n        ),\n        month_grid: cn(\"w-full table-fixed border-collapse\", defaultClassNames.month_grid),\n        weekdays: cn(defaultClassNames.weekdays),\n        weekday: cn(\n          \"h-8 w-9 text-center font-mono text-[0.625rem] font-medium uppercase tracking-[0.12em] text-muted-foreground\",\n          defaultClassNames.weekday,\n        ),\n        week: cn(defaultClassNames.week),\n        week_number_header: cn(\"size-9\", defaultClassNames.week_number_header),\n        week_number: cn(\n          \"size-9 text-center font-mono text-[0.625rem] text-muted-foreground\",\n          defaultClassNames.week_number,\n        ),\n        day: cn(\n          \"relative size-9 p-0 text-center text-sm [&:has([aria-selected])]:bg-muted\",\n          defaultClassNames.day,\n        ),\n        day_button: cn(\n          \"inline-flex size-9 cursor-pointer items-center justify-center border border-transparent bg-transparent text-sm outline-none transition-[background-color,border-color,box-shadow,color] duration-100 hover:border-border hover:bg-muted focus-visible:relative focus-visible:z-10 focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 motion-reduce:transition-none\",\n          defaultClassNames.day_button,\n        ),\n        selected: cn(\n          \"[&_button]:border-primary [&_button]:bg-primary [&_button]:text-primary-foreground\",\n          defaultClassNames.selected,\n        ),\n        range_start: cn(\n          \"[&_button]:border-primary [&_button]:bg-primary [&_button]:text-primary-foreground\",\n          defaultClassNames.range_start,\n        ),\n        range_middle: cn(\n          \"bg-muted [&_button]:border-transparent [&_button]:bg-muted [&_button]:text-foreground\",\n          defaultClassNames.range_middle,\n        ),\n        range_end: cn(\n          \"[&_button]:border-primary [&_button]:bg-primary [&_button]:text-primary-foreground\",\n          defaultClassNames.range_end,\n        ),\n        today: cn(\"[&_button]:border-border [&_button]:font-semibold\", defaultClassNames.today),\n        outside: cn(\"[&_button]:text-muted-foreground/45\", defaultClassNames.outside),\n        disabled: cn(\n          \"[&_button]:pointer-events-none [&_button]:opacity-30\",\n          defaultClassNames.disabled,\n        ),\n        hidden: cn(\"invisible\", defaultClassNames.hidden),\n        footer: cn(\n          \"mt-2 border-t border-border pt-3 text-sm text-muted-foreground\",\n          defaultClassNames.footer,\n        ),\n        ...classNames,\n      }}\n      components={{\n        Root: ({ className: rootClassName, rootRef, ...rootProps }) => (\n          <div ref={rootRef} data-slot=\"calendar\" className={cn(rootClassName)} {...rootProps} />\n        ),\n        Chevron: ({ className: chevronClassName, orientation }) => {\n          const Icon = orientation === \"left\" ? ChevronLeft : ChevronRight;\n\n          if (orientation === \"up\" || orientation === \"down\") {\n            return (\n              <ChevronDown\n                className={cn(\"size-3.5\", orientation === \"up\" && \"rotate-180\", chevronClassName)}\n                aria-hidden=\"true\"\n              />\n            );\n          }\n\n          return <Icon className={cn(\"size-4\", chevronClassName)} aria-hidden=\"true\" />;\n        },\n        ...components,\n      }}\n      {...props}\n    />\n  );\n}\n\ntype DatePickerProps = Omit<\n  React.ComponentProps<\"button\">,\n  \"defaultValue\" | \"name\" | \"onChange\" | \"value\"\n> & {\n  calendarProps?: Omit<PropsBase & PropsSingle, \"mode\" | \"onSelect\" | \"selected\">;\n  dateFormat?: Intl.DateTimeFormatOptions;\n  defaultOpen?: boolean;\n  defaultValue?: Date;\n  formatLocale?: Intl.LocalesArgument;\n  name?: string;\n  onOpenChange?: PopoverPrimitive.Root.Props[\"onOpenChange\"];\n  onValueChange?: (date: Date | undefined) => void;\n  open?: boolean;\n  placeholder?: string;\n  value?: Date;\n};\n\ntype DateRangePickerProps = Omit<\n  React.ComponentProps<\"button\">,\n  \"defaultValue\" | \"name\" | \"onChange\" | \"value\"\n> & {\n  calendarProps?: Omit<PropsBase & PropsRange, \"mode\" | \"onSelect\" | \"selected\">;\n  dateFormat?: Intl.DateTimeFormatOptions;\n  defaultOpen?: boolean;\n  defaultValue?: DateRange;\n  formatLocale?: Intl.LocalesArgument;\n  fromName?: string;\n  onOpenChange?: PopoverPrimitive.Root.Props[\"onOpenChange\"];\n  onValueChange?: (range: DateRange | undefined) => void;\n  open?: boolean;\n  placeholder?: string;\n  toName?: string;\n  value?: DateRange;\n};\n\nfunction DatePicker({\n  calendarProps,\n  children,\n  className,\n  dateFormat = { dateStyle: \"medium\" },\n  defaultOpen,\n  defaultValue,\n  disabled,\n  formatLocale,\n  name,\n  onOpenChange,\n  onValueChange,\n  open,\n  placeholder = \"Select date\",\n  value,\n  ...props\n}: DatePickerProps) {\n  const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n  const selected = value ?? uncontrolledValue;\n  const actionsRef = React.useRef<PopoverPrimitive.Root.Actions>(null);\n  const formatter = React.useMemo(\n    () => new Intl.DateTimeFormat(formatLocale, dateFormat),\n    [dateFormat, formatLocale],\n  );\n\n  const handleSelect = (nextDate: Date | undefined) => {\n    if (value === undefined) {\n      setUncontrolledValue(nextDate);\n    }\n\n    onValueChange?.(nextDate);\n\n    if (nextDate) {\n      actionsRef.current?.close();\n    }\n  };\n\n  const handleClear = () => {\n    if (value === undefined) {\n      setUncontrolledValue(undefined);\n    }\n\n    onValueChange?.(undefined);\n    actionsRef.current?.close();\n  };\n\n  return (\n    <PopoverPrimitive.Root\n      actionsRef={actionsRef}\n      defaultOpen={defaultOpen}\n      open={open}\n      onOpenChange={onOpenChange}\n    >\n      <PopoverPrimitive.Trigger\n        render={\n          <button\n            type=\"button\"\n            data-slot=\"date-picker-trigger\"\n            className={cn(\n              \"flex h-10 w-full min-w-0 cursor-pointer items-center gap-2 border border-input bg-background px-3 text-left text-sm outline-none transition-[background-color,border-color,box-shadow,color] duration-100 hover:border-foreground/40 focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 disabled:cursor-not-allowed disabled:bg-muted disabled:text-muted-foreground disabled:opacity-60 aria-invalid:border-destructive aria-invalid:focus-visible:border-destructive aria-invalid:focus-visible:ring-destructive/25 motion-reduce:transition-none\",\n              !selected && \"text-muted-foreground\",\n              className,\n            )}\n            disabled={disabled}\n            {...props}\n          />\n        }\n      >\n        {children ?? (\n          <>\n            <CalendarDays className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n            <span className=\"min-w-0 flex-1 truncate\">\n              {selected ? formatter.format(selected) : placeholder}\n            </span>\n            <ChevronDown className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n          </>\n        )}\n      </PopoverPrimitive.Trigger>\n\n      <PopoverPrimitive.Portal>\n        <PopoverPrimitive.Positioner\n          align=\"start\"\n          side=\"bottom\"\n          sideOffset={6}\n          className=\"isolate z-50\"\n        >\n          <PopoverPrimitive.Popup\n            data-slot=\"date-picker-content\"\n            aria-label={props[\"aria-label\"] ? `${props[\"aria-label\"]} options` : \"Date picker\"}\n            className=\"w-[min(17.25rem,var(--available-width))] overflow-auto border border-border bg-popover text-popover-foreground outline-none transition-opacity duration-100 data-ending-style:opacity-0 data-instant:transition-none data-starting-style:opacity-0 motion-reduce:transition-none\"\n          >\n            <div className=\"flex items-center justify-between gap-3 border-b border-border px-3 py-3\">\n              <span className=\"font-mono text-[0.625rem] uppercase tracking-[0.14em] text-muted-foreground\">\n                Date\n              </span>\n              <output className=\"truncate font-mono text-xs tabular-nums\" aria-live=\"polite\">\n                {selected ? formatter.format(selected) : \"Not selected\"}\n              </output>\n            </div>\n            <Calendar\n              {...calendarProps}\n              mode=\"single\"\n              selected={selected}\n              autoFocus={calendarProps?.autoFocus ?? true}\n              defaultMonth={calendarProps?.defaultMonth ?? selected}\n              onSelect={handleSelect}\n            />\n            <div className=\"flex items-center border-t border-border p-2\">\n              <button\n                type=\"button\"\n                className=\"h-8 cursor-pointer px-2.5 font-mono text-[0.625rem] uppercase tracking-[0.12em] text-muted-foreground outline-none transition-colors duration-100 hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring/40 motion-reduce:transition-none\"\n                onClick={() => handleSelect(new Date())}\n              >\n                Today\n              </button>\n              {selected ? (\n                <button\n                  type=\"button\"\n                  className=\"h-8 cursor-pointer px-2.5 font-mono text-[0.625rem] uppercase tracking-[0.12em] text-muted-foreground outline-none transition-colors duration-100 hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring/40 motion-reduce:transition-none\"\n                  onClick={handleClear}\n                >\n                  Clear\n                </button>\n              ) : null}\n            </div>\n          </PopoverPrimitive.Popup>\n        </PopoverPrimitive.Positioner>\n      </PopoverPrimitive.Portal>\n\n      {name ? (\n        <input\n          type=\"hidden\"\n          name={name}\n          value={selected ? formatInputDate(selected) : \"\"}\n          disabled={disabled}\n        />\n      ) : null}\n    </PopoverPrimitive.Root>\n  );\n}\n\nfunction DateRangePicker({\n  calendarProps,\n  children,\n  className,\n  dateFormat = { dateStyle: \"medium\" },\n  defaultOpen,\n  defaultValue,\n  disabled,\n  formatLocale,\n  fromName,\n  onOpenChange,\n  onValueChange,\n  open,\n  placeholder = \"Select date range\",\n  toName,\n  value,\n  ...props\n}: DateRangePickerProps) {\n  const [uncontrolledValue, setUncontrolledValue] = React.useState<DateRange | undefined>(\n    defaultValue,\n  );\n  const selected = value ?? uncontrolledValue;\n  const actionsRef = React.useRef<PopoverPrimitive.Root.Actions>(null);\n  const formatter = React.useMemo(\n    () => new Intl.DateTimeFormat(formatLocale, dateFormat),\n    [dateFormat, formatLocale],\n  );\n\n  const handleSelect = (nextRange: DateRange | undefined) => {\n    if (value === undefined) {\n      setUncontrolledValue(nextRange);\n    }\n\n    onValueChange?.(nextRange);\n\n    if (nextRange?.from && nextRange.to) {\n      actionsRef.current?.close();\n    }\n  };\n\n  const handleClear = () => {\n    if (value === undefined) {\n      setUncontrolledValue(undefined);\n    }\n\n    onValueChange?.(undefined);\n    actionsRef.current?.close();\n  };\n\n  return (\n    <PopoverPrimitive.Root\n      actionsRef={actionsRef}\n      defaultOpen={defaultOpen}\n      open={open}\n      onOpenChange={onOpenChange}\n    >\n      <PopoverPrimitive.Trigger\n        render={\n          <button\n            type=\"button\"\n            data-slot=\"date-range-picker-trigger\"\n            className={cn(\n              \"flex h-10 w-full min-w-0 cursor-pointer items-center gap-2 border border-input bg-background px-3 text-left text-sm outline-none transition-[background-color,border-color,box-shadow,color] duration-100 hover:border-foreground/40 focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 disabled:cursor-not-allowed disabled:bg-muted disabled:text-muted-foreground disabled:opacity-60 aria-invalid:border-destructive aria-invalid:focus-visible:border-destructive aria-invalid:focus-visible:ring-destructive/25 motion-reduce:transition-none\",\n              !selected?.from && \"text-muted-foreground\",\n              className,\n            )}\n            disabled={disabled}\n            {...props}\n          />\n        }\n      >\n        {children ?? (\n          <>\n            <CalendarRange className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n            <span className=\"min-w-0 flex-1 truncate\">\n              {formatRange(selected, formatter, placeholder)}\n            </span>\n            <ChevronDown className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n          </>\n        )}\n      </PopoverPrimitive.Trigger>\n\n      <PopoverPrimitive.Portal>\n        <PopoverPrimitive.Positioner\n          align=\"start\"\n          side=\"bottom\"\n          sideOffset={6}\n          className=\"isolate z-50\"\n        >\n          <PopoverPrimitive.Popup\n            data-slot=\"date-range-picker-content\"\n            aria-label={\n              props[\"aria-label\"] ? `${props[\"aria-label\"]} options` : \"Date range picker\"\n            }\n            className=\"w-[min(17.25rem,var(--available-width))] overflow-auto border border-border bg-popover text-popover-foreground outline-none transition-opacity duration-100 data-ending-style:opacity-0 data-instant:transition-none data-starting-style:opacity-0 motion-reduce:transition-none\"\n          >\n            <div className=\"flex items-center justify-between gap-3 border-b border-border px-3 py-3\">\n              <span className=\"font-mono text-[0.625rem] uppercase tracking-[0.14em] text-muted-foreground\">\n                Date range\n              </span>\n              <output className=\"truncate font-mono text-xs tabular-nums\" aria-live=\"polite\">\n                {formatRange(selected, formatter, \"Not selected\")}\n              </output>\n            </div>\n            <Calendar\n              {...calendarProps}\n              mode=\"range\"\n              selected={selected}\n              autoFocus={calendarProps?.autoFocus ?? true}\n              defaultMonth={calendarProps?.defaultMonth ?? selected?.from}\n              min={calendarProps?.min ?? 1}\n              resetOnSelect={calendarProps?.resetOnSelect ?? true}\n              onSelect={handleSelect}\n            />\n            <div className=\"flex items-center border-t border-border p-2\">\n              <button\n                type=\"button\"\n                className=\"h-8 cursor-pointer px-2.5 font-mono text-[0.625rem] uppercase tracking-[0.12em] text-muted-foreground outline-none transition-colors duration-100 hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring/40 motion-reduce:transition-none\"\n                onClick={() => {\n                  const today = new Date();\n                  handleSelect({ from: today, to: today });\n                }}\n              >\n                Today\n              </button>\n              {selected?.from ? (\n                <button\n                  type=\"button\"\n                  className=\"h-8 cursor-pointer px-2.5 font-mono text-[0.625rem] uppercase tracking-[0.12em] text-muted-foreground outline-none transition-colors duration-100 hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring/40 motion-reduce:transition-none\"\n                  onClick={handleClear}\n                >\n                  Clear\n                </button>\n              ) : null}\n            </div>\n          </PopoverPrimitive.Popup>\n        </PopoverPrimitive.Positioner>\n      </PopoverPrimitive.Portal>\n\n      {fromName ? (\n        <input\n          type=\"hidden\"\n          name={fromName}\n          value={selected?.from ? formatInputDate(selected.from) : \"\"}\n          disabled={disabled}\n        />\n      ) : null}\n      {toName ? (\n        <input\n          type=\"hidden\"\n          name={toName}\n          value={selected?.to ? formatInputDate(selected.to) : \"\"}\n          disabled={disabled}\n        />\n      ) : null}\n    </PopoverPrimitive.Root>\n  );\n}\n\nfunction formatRange(\n  range: DateRange | undefined,\n  formatter: Intl.DateTimeFormat,\n  placeholder: string,\n) {\n  if (!range?.from) {\n    return placeholder;\n  }\n\n  if (!range.to) {\n    return `${formatter.format(range.from)} – …`;\n  }\n\n  return `${formatter.format(range.from)} – ${formatter.format(range.to)}`;\n}\n\nfunction formatInputDate(date: Date) {\n  const year = date.getFullYear();\n  const month = String(date.getMonth() + 1).padStart(2, \"0\");\n  const day = String(date.getDate()).padStart(2, \"0\");\n\n  return `${year}-${month}-${day}`;\n}\n\nexport type { DatePickerProps, DateRangePickerProps };\nexport { Calendar, DatePicker, DateRangePicker };\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}