{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "glass-calendar",
  "title": "Glass Calendar",
  "author": "Alex Chih (https://alexchih.com)",
  "description": "Calendar on the washi ground with ruri selection, built on react-day-picker.",
  "dependencies": [
    "react-day-picker",
    "lucide-react"
  ],
  "registryDependencies": [
    "https://washiveil.alexchih.com/r/theme.json"
  ],
  "files": [
    {
      "path": "registry/washiveil/ui/glass-calendar.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport { DayPicker } from 'react-day-picker'\nimport type { DayPickerProps } from 'react-day-picker'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\n// Consumers should pass `today` and `defaultMonth` explicitly for TZ-stable rendering.\nfunction GlassCalendar({ className, classNames, showOutsideDays = true, today, defaultMonth, ...props }: DayPickerProps & { today?: Date; defaultMonth?: Date }) {\n  return (\n    <DayPicker\n      showOutsideDays={showOutsideDays}\n      today={today}\n      defaultMonth={defaultMonth}\n      className={cn('p-3', className)}\n      classNames={{\n        // UI elements\n        root: '',\n        months: 'relative flex flex-col sm:flex-row gap-2',\n        month: 'flex flex-col gap-4',\n        month_caption: 'flex h-8 items-center justify-center',\n        caption_label: 'font-display font-medium text-sm',\n        nav: 'absolute inset-x-0 top-0 flex items-center justify-between',\n        button_previous: cn(\n          'inline-flex size-8 items-center justify-center rounded-full border border-foreground/10 bg-transparent text-sm transition-colors',\n          'hover:border-ruri hover:text-ruri dark:hover:border-ruri-soft dark:hover:text-ruri-soft',\n          'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n        ),\n        button_next: cn(\n          'inline-flex size-8 items-center justify-center rounded-full border border-foreground/10 bg-transparent text-sm transition-colors',\n          'hover:border-ruri hover:text-ruri dark:hover:border-ruri-soft dark:hover:text-ruri-soft',\n          'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n        ),\n        month_grid: 'w-full border-collapse',\n        weekdays: 'flex',\n        weekday: 'font-mono text-[0.6875rem] tracking-[0.15em] uppercase text-muted-foreground rounded-md w-9 font-normal',\n        week: 'flex w-full mt-2',\n        day: cn(\n          'relative size-9 p-0 text-center text-sm focus-within:relative focus-within:z-20',\n          'flex items-center justify-center rounded-full',\n          'hover:bg-foreground/6',\n        ),\n        day_button: cn(\n          'inline-flex size-9 items-center justify-center rounded-full text-sm',\n          'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n        ),\n        // Selection states\n        selected: 'bg-ruri text-white dark:bg-ruri-soft dark:text-deep hover:bg-ruri hover:text-white dark:hover:bg-ruri-soft dark:hover:text-deep',\n        range_start: 'bg-ruri text-white dark:bg-ruri-soft dark:text-deep rounded-l-full',\n        range_end: 'bg-ruri text-white dark:bg-ruri-soft dark:text-deep rounded-r-full',\n        range_middle: 'bg-accent text-accent-foreground',\n        // Day flags\n        today: 'border border-ruri/40 dark:border-ruri-soft/40',\n        outside: 'text-muted-foreground/60 aria-selected:bg-accent/50 aria-selected:text-muted-foreground',\n        disabled: 'text-muted-foreground opacity-40',\n        hidden: 'invisible',\n        focused: '',\n        // Remaining UI elements\n        chevron: 'size-4',\n        dropdowns: '',\n        dropdown: '',\n        dropdown_root: '',\n        footer: '',\n        weeks: '',\n        week_number: '',\n        week_number_header: '',\n        months_dropdown: '',\n        years_dropdown: '',\n        // Animation states\n        weeks_before_enter: '',\n        weeks_before_exit: '',\n        weeks_after_enter: '',\n        weeks_after_exit: '',\n        caption_after_enter: '',\n        caption_after_exit: '',\n        caption_before_enter: '',\n        caption_before_exit: '',\n        ...classNames,\n      }}\n      components={{\n        Chevron: ({ orientation, ...chevronProps }) => {\n          if (orientation === 'left') {\n            return <ChevronLeft className=\"size-4\" {...chevronProps} />\n          }\n          return <ChevronRight className=\"size-4\" {...chevronProps} />\n        },\n      }}\n      {...props}\n    />\n  )\n}\nGlassCalendar.displayName = 'GlassCalendar'\n\nexport { GlassCalendar }\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}