{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "datetime-input",
  "dependencies": [
    "chrono-node@latest",
    "react-day-picker@^8.9.1"
  ],
  "devDependencies": [],
  "registryDependencies": [],
  "files": [
    {
      "path": "./components/ui/datetime-input.tsx",
      "content": "// @ts-nocheck\n'use client';\n\nimport { Button, buttonVariants } from '@/components/website/ui/button';\nimport { Calendar, type CalendarProps } from '@/components/website/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/website/ui/popover';\nimport { ScrollArea } from '@/components/website/ui/scroll-area';\nimport { cn } from '@/lib/utils';\nimport { parseDate } from 'chrono-node';\nimport { Calendar as CalendarIcon, LucideTextCursorInput } from 'lucide-react';\nimport React from 'react';\nimport type { ActiveModifiers } from 'react-day-picker';\n\n/* -------------------------------------------------------------------------- */\n/*                               Inspired By:                                 */\n/*                               @steventey                                   */\n/* ------------------https://dub.co/blog/smart-datetime-picker--------------- */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Utility function that parses dates.\n * Parses a given date string using the `chrono-node` library.\n *\n * @param str - A string representation of a date and time.\n * @returns A `Date` object representing the parsed date and time, or `null` if the string could not be parsed.\n */\nexport const parseDateTime = (str: Date | string) => {\n  if (str instanceof Date) return str;\n  return parseDate(str);\n};\n\n/**\n * Converts a given timestamp or the current date and time to a string representation in the local time zone.\n * format: `HH:mm`, adjusted for the local time zone.\n *\n * @param timestamp {Date | string}\n * @returns A string representation of the timestamp\n */\nexport const getDateTimeLocal = (timestamp?: Date): string => {\n  const d = timestamp ? new Date(timestamp) : new Date();\n  if (d.toString() === 'Invalid Date') return '';\n  return new Date(d.getTime() - d.getTimezoneOffset() * 60000)\n    .toISOString()\n    .split(':')\n    .slice(0, 2)\n    .join(':');\n};\n\n/**\n * Formats a given date and time object or string into a human-readable string representation.\n * \"MMM D, YYYY h:mm A\" (e.g. \"Jan 1, 2023 12:00 PM\").\n *\n * @param datetime - {Date | string}\n * @returns A string representation of the date and time\n */\nconst formatTimeOnly = (datetime: Date | string) => {\n  return new Date(datetime).toLocaleTimeString('en-US', {\n    hour: 'numeric',\n    minute: 'numeric',\n    hour12: true,\n  });\n};\n\nconst formatDateOnly = (datetime: Date | string) => {\n  return new Date(datetime).toLocaleDateString('en-US', {\n    month: 'short',\n    day: 'numeric',\n    year: 'numeric',\n  });\n};\n\nconst formatDateTime = (\n  datetime: Date | string,\n  showCalendar: boolean,\n  showTimePicker: boolean\n) => {\n  if (!showCalendar && showTimePicker) {\n    return formatTimeOnly(datetime);\n  }\n  if (showCalendar && !showTimePicker) {\n    return formatDateOnly(datetime);\n  }\n  return new Date(datetime).toLocaleTimeString('en-US', {\n    month: 'short',\n    day: 'numeric',\n    year: 'numeric',\n    hour: 'numeric',\n    minute: 'numeric',\n    hour12: true,\n  });\n};\n\nconst inputBase =\n  'bg-transparent focus:outline-hidden focus:ring-0 focus-within:outline-hidden focus-within:ring-0 sm:text-sm disabled:cursor-not-allowed disabled:opacity-50';\n\n// @source: https://www.perplexity.ai/search/in-javascript-how-RfI7fMtITxKr5c.V9Lv5KA#1\n// use this pattern to validate the transformed date string for the natural language input\nconst naturalInputValidationPattern = '^[A-Z][a-z]{2}sd{1,2},sd{4},sd{1,2}:d{2}s[AP]M$';\n\nconst DEFAULT_SIZE = 96;\n\n/**\n * Smart time input Docs: {@link: https://shadcn-extension.vercel.app/docs/smart-time-input}\n */\n\ninterface SmartDatetimeInputProps {\n  value?: Date;\n  onValueChange: (date: Date) => void;\n  showCalendar?: boolean;\n  showTimePicker?: boolean;\n}\n\ninterface SmartDatetimeInputContextProps extends SmartDatetimeInputProps {\n  Time: string;\n  onTimeChange: (time: string) => void;\n}\n\nconst SmartDatetimeInputContext = React.createContext<SmartDatetimeInputContextProps | null>(null);\n\nconst useSmartDateInput = () => {\n  const context = React.useContext(SmartDatetimeInputContext);\n  if (!context) {\n    throw new Error('useSmartDateInput must be used within SmartDateInputProvider');\n  }\n  return context;\n};\nexport const SmartDatetimeInput = React.forwardRef<\n  HTMLInputElement,\n  Omit<\n    React.InputHTMLAttributes<HTMLInputElement>,\n    'type' | 'ref' | 'value' | 'defaultValue' | 'onBlur'\n  > &\n    SmartDatetimeInputProps\n>(\n  (\n    {\n      className,\n      value,\n      onValueChange,\n      placeholder,\n      disabled,\n      showCalendar = true,\n      showTimePicker = true,\n    },\n    ref\n  ) => {\n    const [Time, setTime] = React.useState<string>('');\n\n    const onTimeChange = React.useCallback((time: string) => {\n      setTime(time);\n    }, []);\n\n    // If neither calendar nor timepicker is specified, show both\n    const shouldShowBoth = showCalendar === showTimePicker;\n\n    return (\n      <SmartDatetimeInputContext.Provider\n        value={{\n          value,\n          onValueChange,\n          Time,\n          onTimeChange,\n          showCalendar: shouldShowBoth ? true : showCalendar,\n          showTimePicker: shouldShowBoth ? true : showTimePicker,\n        }}\n      >\n        <div className='flex items-center justify-center dark:bg-neutral-950 bg-neutral-50'>\n          <div\n            className={cn(\n              'flex gap-1 w-full p-1 items-center justify-between rounded-md border-2 transition-all',\n              'focus-within:outline-0 focus:outline-0 focus:ring-0',\n              'placeholder:text-muted-foreground focus-visible:outline-0 ',\n              className\n            )}\n          >\n            <DateTimeLocalInput />\n            <NaturalLanguageInput placeholder={placeholder} disabled={disabled} ref={ref} />\n          </div>\n        </div>\n      </SmartDatetimeInputContext.Provider>\n    );\n  }\n);\n\nSmartDatetimeInput.displayName = 'DatetimeInput';\n\n// Make it a standalone component\n\nconst TimePicker = () => {\n  const { value, onValueChange, Time, onTimeChange } = useSmartDateInput();\n  const [activeIndex, setActiveIndex] = React.useState(-1);\n  const timestamp = 15;\n\n  const formateSelectedTime = React.useCallback(\n    (time: string, hour: number, partStamp: number) => {\n      onTimeChange(time);\n\n      const newVal = value ? new Date(value) : new Date();\n\n      // If no value exists, use current date but only set the time\n      newVal.setHours(hour, partStamp === 0 ? Number.parseInt('00') : timestamp * partStamp);\n\n      onValueChange(newVal);\n    },\n    [value, onValueChange, onTimeChange]\n  );\n\n  const handleKeydown = React.useCallback(\n    (e: React.KeyboardEvent<HTMLDivElement>) => {\n      e.stopPropagation();\n\n      if (!document) return;\n\n      const moveNext = () => {\n        const nextIndex = activeIndex + 1 > DEFAULT_SIZE - 1 ? 0 : activeIndex + 1;\n\n        const currentElm = document.getElementById(`time-${nextIndex}`);\n\n        currentElm?.focus();\n\n        setActiveIndex(nextIndex);\n      };\n\n      const movePrev = () => {\n        const prevIndex = activeIndex - 1 < 0 ? DEFAULT_SIZE - 1 : activeIndex - 1;\n\n        const currentElm = document.getElementById(`time-${prevIndex}`);\n\n        currentElm?.focus();\n\n        setActiveIndex(prevIndex);\n      };\n\n      const setElement = () => {\n        const currentElm = document.getElementById(`time-${activeIndex}`);\n\n        if (!currentElm) return;\n\n        currentElm.focus();\n\n        const timeValue = currentElm.textContent ?? '';\n\n        // this should work now haha that hour is what does the trick\n\n        const PM_AM = timeValue.split(' ')[1];\n        const PM_AM_hour = Number.parseInt(timeValue.split(' ')[0].split(':')[0]);\n        const hour =\n          PM_AM === 'AM'\n            ? PM_AM_hour === 12\n              ? 0\n              : PM_AM_hour\n            : PM_AM_hour === 12\n              ? 12\n              : PM_AM_hour + 12;\n\n        const part = Math.floor(Number.parseInt(timeValue.split(' ')[0].split(':')[1]) / 15);\n\n        formateSelectedTime(timeValue, hour, part);\n      };\n\n      const reset = () => {\n        const currentElm = document.getElementById(`time-${activeIndex}`);\n        currentElm?.blur();\n        setActiveIndex(-1);\n      };\n\n      switch (e.key) {\n        case 'ArrowUp':\n          movePrev();\n          break;\n\n        case 'ArrowDown':\n          moveNext();\n          break;\n\n        case 'Escape':\n          reset();\n          break;\n\n        case 'Enter':\n          setElement();\n          break;\n      }\n    },\n    [activeIndex, formateSelectedTime]\n  );\n\n  const handleClick = React.useCallback(\n    (hour: number, part: number, PM_AM: string, currentIndex: number) => {\n      formateSelectedTime(`${hour}:${part === 0 ? '00' : timestamp * part} ${PM_AM}`, hour, part);\n      setActiveIndex(currentIndex);\n    },\n    [formateSelectedTime]\n  );\n\n  const currentTime = React.useMemo(() => {\n    const timeVal = Time.split(' ')[0];\n    return {\n      hours: Number.parseInt(timeVal.split(':')[0]),\n      minutes: Number.parseInt(timeVal.split(':')[1]),\n    };\n  }, [Time]);\n\n  React.useEffect(() => {\n    const getCurrentElementTime = () => {\n      const timeVal = Time.split(' ')[0];\n      const hours = Number.parseInt(timeVal.split(':')[0]);\n      const minutes = Number.parseInt(timeVal.split(':')[1]);\n      const PM_AM = Time.split(' ')[1];\n\n      const formatIndex = PM_AM === 'AM' ? hours : hours === 12 ? hours : hours + 12;\n      const formattedHours = formatIndex;\n\n      console.log(formatIndex);\n\n      for (let j = 0; j <= 3; j++) {\n        const diff = Math.abs(j * timestamp - minutes);\n        const selected =\n          PM_AM === (formattedHours >= 12 ? 'PM' : 'AM') &&\n          (minutes <= 53 ? diff < Math.ceil(timestamp / 2) : diff < timestamp);\n\n        if (selected) {\n          const trueIndex = activeIndex === -1 ? formattedHours * 4 + j : activeIndex;\n\n          setActiveIndex(trueIndex);\n\n          const currentElm = document.getElementById(`time-${trueIndex}`);\n          currentElm?.scrollIntoView({\n            block: 'center',\n            behavior: 'smooth',\n          });\n        }\n      }\n    };\n\n    getCurrentElementTime();\n  }, [Time, activeIndex]);\n\n  const height = React.useMemo(() => {\n    if (!document) return;\n    const calendarElm = document.getElementById('calendar');\n    if (!calendarElm) return;\n    return calendarElm.style.height;\n  }, []);\n\n  return (\n    <div className='space-y-2 pr-3 py-3 relative '>\n      <h3 className='text-sm font-medium text-center'>Time</h3>\n      <ScrollArea\n        onKeyDown={handleKeydown}\n        className='h-[90%] w-full focus-visible:outline-0 focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:border-0 py-0.5'\n        style={{\n          height,\n        }}\n      >\n        <ul className={cn('flex items-center flex-col gap-1 h-full max-h-56 w-28 px-1 py-0.5')}>\n          {Array.from({ length: 24 }).map((_, i) => {\n            const PM_AM = i >= 12 ? 'PM' : 'AM';\n            const formatIndex = i > 12 ? i % 12 : i === 0 || i === 12 ? 12 : i;\n            return Array.from({ length: 4 }).map((_, part) => {\n              const diff = Math.abs(part * timestamp - currentTime.minutes);\n\n              const trueIndex = i * 4 + part;\n\n              // ? refactor : add the select of the default time on the current device (H:MM)\n              const isSelected =\n                (currentTime.hours === i || currentTime.hours === formatIndex) &&\n                Time.split(' ')[1] === PM_AM &&\n                (currentTime.minutes <= 53 ? diff < Math.ceil(timestamp / 2) : diff < timestamp);\n\n              const isSuggested = !value && isSelected;\n\n              const currentValue = `${formatIndex}:${\n                part === 0 ? '00' : timestamp * part\n              } ${PM_AM}`;\n\n              return (\n                <li\n                  tabIndex={isSelected ? 0 : -1}\n                  id={`time-${trueIndex}`}\n                  key={`time-${trueIndex}`}\n                  aria-label='currentTime'\n                  className={cn(\n                    buttonVariants({\n                      variant: isSuggested ? 'secondary' : isSelected ? 'default' : 'outline-solid',\n                    }),\n                    'h-8 px-3 w-full text-sm focus-visible:outline-0 outline-0 focus-visible:border-0 cursor-default ring-0'\n                  )}\n                  onClick={() => handleClick(i, part, PM_AM, trueIndex)}\n                  onFocus={() => isSuggested && setActiveIndex(trueIndex)}\n                >\n                  {currentValue}\n                </li>\n              );\n            });\n          })}\n        </ul>\n      </ScrollArea>\n    </div>\n  );\n};\nconst getDefaultPlaceholder = (showCalendar: boolean, showTimePicker: boolean) => {\n  if (!showCalendar && showTimePicker) {\n    return 'e.g. \"5pm\" or \"in 2 hours\"';\n  }\n  if (showCalendar && !showTimePicker) {\n    return 'e.g. \"tomorrow\" or \"next monday\"';\n  }\n  return 'e.g. \"tomorrow at 5pm\" or \"in 2 hours\"';\n};\nconst NaturalLanguageInput = React.forwardRef<\n  HTMLInputElement,\n  {\n    placeholder?: string;\n    disabled?: boolean;\n  }\n>(({ placeholder, ...props }, ref) => {\n  const { value, onValueChange, Time, onTimeChange, showCalendar, showTimePicker } =\n    useSmartDateInput();\n\n  const _placeholder = placeholder ?? getDefaultPlaceholder(showCalendar, showTimePicker);\n\n  const [inputValue, setInputValue] = React.useState<string>('');\n\n  React.useEffect(() => {\n    if (!value) {\n      setInputValue('');\n      return;\n    }\n\n    const formattedValue = formatDateTime(value, showCalendar, showTimePicker);\n    setInputValue(formattedValue);\n\n    // Only update time if time picker is shown\n    if (showTimePicker) {\n      const hour = value.getHours();\n      const timeVal = `${hour >= 12 ? hour % 12 || 12 : hour || 12}:${String(\n        value.getMinutes()\n      ).padStart(2, '0')} ${hour >= 12 ? 'PM' : 'AM'}`;\n      onTimeChange(timeVal);\n    }\n  }, [value, showCalendar, showTimePicker]);\n\n  const handleParse = React.useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      const parsedDateTime = parseDateTime(e.currentTarget.value);\n      if (parsedDateTime) {\n        // If only showing time picker, preserve the current date\n        if (!showCalendar && showTimePicker && value) {\n          parsedDateTime.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());\n        }\n        // If only showing calendar, preserve the current time\n        if (showCalendar && !showTimePicker && value) {\n          parsedDateTime.setHours(0, 0, 0, 0);\n        }\n        // console.log(parsedDateTime);\n\n        onValueChange(parsedDateTime);\n        setInputValue(formatDateTime(parsedDateTime, showCalendar, showTimePicker));\n\n        if (showTimePicker) {\n          const PM_AM = parsedDateTime.getHours() >= 12 ? 'PM' : 'AM';\n          const PM_AM_hour = parsedDateTime.getHours();\n          const hour =\n            PM_AM_hour > 12\n              ? PM_AM_hour % 12\n              : PM_AM_hour === 0 || PM_AM_hour === 12\n                ? 12\n                : PM_AM_hour;\n          onTimeChange(`${hour}:${String(parsedDateTime.getMinutes()).padStart(2, '0')} ${PM_AM}`);\n        }\n      }\n    },\n    [value, showCalendar, showTimePicker]\n  );\n\n  const handleKeydown = React.useCallback(\n    (e: React.KeyboardEvent<HTMLInputElement>) => {\n      if (e.key === 'Enter') {\n        handleParse(e as any);\n      }\n    },\n    [handleParse]\n  );\n\n  return (\n    <input\n      ref={ref}\n      type='text'\n      placeholder={_placeholder}\n      value={inputValue}\n      onChange={(e) => setInputValue(e.currentTarget.value)}\n      onKeyDown={handleKeydown}\n      onBlur={handleParse}\n      className={cn(\n        'px-2 mr-0.5 dark:bg-neutral-800 bg-neutral-50 flex-1 border-none h-8 rounded-sm',\n        inputBase\n      )}\n      {...props}\n    />\n  );\n});\n\nNaturalLanguageInput.displayName = 'NaturalLanguageInput';\n\ntype DateTimeLocalInputProps = {} & CalendarProps;\n\nconst DateTimeLocalInput = ({ className, ...props }: DateTimeLocalInputProps) => {\n  const { value, onValueChange, Time, showCalendar, showTimePicker } = useSmartDateInput();\n\n  const formateSelectedDate = React.useCallback(\n    (date: Date | undefined, selectedDate: Date, m: ActiveModifiers, e: React.MouseEvent) => {\n      const parsedDateTime = new Date(selectedDate);\n\n      if (!showTimePicker) {\n        // If only calendar is shown, set time to start of day\n        parsedDateTime.setHours(0, 0, 0, 0);\n      } else if (value) {\n        // If time picker is shown, preserve existing time\n        parsedDateTime.setHours(\n          value.getHours(),\n          value.getMinutes(),\n          value.getSeconds(),\n          value.getMilliseconds()\n        );\n      }\n\n      onValueChange(parsedDateTime);\n    },\n    [value, showTimePicker, onValueChange]\n  );\n\n  return (\n    <Popover>\n      <PopoverTrigger asChild>\n        <Button\n          variant={'outline'}\n          size={'icon'}\n          className={cn(\n            'size-9 flex items-center justify-center font-normal dark:bg-neutral-800 bg-neutral-200',\n            !value && 'text-muted-foreground'\n          )}\n        >\n          <CalendarIcon className='size-4' />\n          <span className='sr-only'>calendar</span>\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent className='w-auto p-0 dark:bg-neutral-800 bg-neutral-50' sideOffset={8}>\n        <div className='flex gap-1'>\n          {showCalendar && (\n            <Calendar\n              {...props}\n              id={'calendar'}\n              className={cn('peer flex justify-end', inputBase, className)}\n              mode='single'\n              selected={value}\n              onSelect={formateSelectedDate}\n              initialFocus\n            />\n          )}\n          {showTimePicker && <TimePicker />}\n        </div>\n      </PopoverContent>\n    </Popover>\n  );\n};\n\nDateTimeLocalInput.displayName = 'DateTimeLocalInput';\n",
      "type": "registry:component"
    },
    {
      "path": "./components/website/ui/button.tsx",
      "content": "import { Slot } from '@radix-ui/react-slot';\nimport { type VariantProps, cva } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst buttonVariants = cva(\n  'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n  {\n    variants: {\n      variant: {\n        default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n        destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n        outline:\n          'border border-input dark:bg-neutral-800 bg-neutral-50 hover:bg-accent hover:text-accent-foreground',\n        secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n        ghost: 'hover:bg-accent hover:text-accent-foreground',\n        link: 'text-primary underline-offset-4 hover:underline',\n        uilayouts:\n          'dark:bg-zinc-900 bg-neutral-200 dark:text-white text-black border dark:border-neutral-800',\n      },\n      size: {\n        default: 'h-10 px-4 py-2',\n        sm: 'h-9 rounded-md px-3',\n        lg: 'h-11 rounded-md px-8',\n        icon: 'h-10 w-10',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n    VariantProps<typeof buttonVariants> {\n  asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ className, variant, size, asChild = false, ...props }, ref) => {\n    const Comp = asChild ? Slot : 'button';\n    return (\n      <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n    );\n  }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n",
      "type": "registry:component"
    },
    {
      "path": "./components/website/ui/calendar.tsx",
      "content": "'use client';\n\nimport { buttonVariants } from '@/components/website/ui/button';\nimport { cn } from '@/lib/utils';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport type * as React from 'react';\nimport { DayPicker } from 'react-day-picker';\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>;\n\nfunction Calendar({ className, classNames, showOutsideDays = true, ...props }: CalendarProps) {\n  return (\n    <DayPicker\n      showOutsideDays={showOutsideDays}\n      className={cn('p-3', className)}\n      classNames={{\n        months: 'flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0',\n        month: 'space-y-4',\n        caption: 'flex justify-center pt-1 relative items-center',\n        caption_label: 'text-sm font-medium',\n        nav: 'space-x-1 flex items-center',\n        nav_button: cn(\n          buttonVariants({ variant: 'outline' }),\n          'h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100'\n        ),\n        nav_button_previous: 'absolute left-1',\n        nav_button_next: 'absolute right-1',\n        table: 'w-full border-collapse space-y-1',\n        head_row: 'flex',\n        head_cell: 'text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]',\n        row: 'flex w-full mt-2',\n        cell: 'h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20',\n        day: cn(\n          buttonVariants({ variant: 'ghost' }),\n          'h-9 w-9 p-0 font-normal aria-selected:opacity-100'\n        ),\n        day_range_end: 'day-range-end',\n        day_selected:\n          'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground',\n        day_today: 'bg-accent text-accent-foreground',\n        day_outside:\n          'day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30',\n        day_disabled: 'text-muted-foreground opacity-50',\n        day_range_middle: 'aria-selected:bg-accent aria-selected:text-accent-foreground',\n        day_hidden: 'invisible',\n        ...classNames,\n      }}\n      components={{\n        IconLeft: ({ ...props }) => <ChevronLeft className='h-4 w-4' />,\n        IconRight: ({ ...props }) => <ChevronRight className='h-4 w-4' />,\n      }}\n      {...props}\n    />\n  );\n}\nCalendar.displayName = 'Calendar';\n\nexport { Calendar };\n",
      "type": "registry:component"
    },
    {
      "path": "./components/website/ui/popover.tsx",
      "content": "'use client';\n\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverContent = React.forwardRef<\n  React.ElementRef<typeof PopoverPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n  <PopoverPrimitive.Portal>\n    <PopoverPrimitive.Content\n      ref={ref}\n      align={align}\n      sideOffset={sideOffset}\n      className={cn(\n        'z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n        className\n      )}\n      {...props}\n    />\n  </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverContent, PopoverTrigger };\n",
      "type": "registry:component"
    },
    {
      "path": "./components/website/ui/scroll-area.tsx",
      "content": "'use client';\n\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst ScrollArea = React.forwardRef<\n  React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n  <ScrollAreaPrimitive.Root\n    ref={ref}\n    className={cn('relative overflow-hidden', className)}\n    {...props}\n  >\n    <ScrollAreaPrimitive.Viewport className='h-full w-full rounded-[inherit]'>\n      {children}\n    </ScrollAreaPrimitive.Viewport>\n    <ScrollBar />\n    <ScrollAreaPrimitive.Corner />\n  </ScrollAreaPrimitive.Root>\n));\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n  React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n  React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = 'vertical', ...props }, ref) => (\n  <ScrollAreaPrimitive.ScrollAreaScrollbar\n    ref={ref}\n    orientation={orientation}\n    className={cn(\n      'flex touch-none select-none transition-colors',\n      orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent p-px',\n      orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent p-px',\n      className\n    )}\n    {...props}\n  >\n    <ScrollAreaPrimitive.ScrollAreaThumb className='relative flex-1 rounded-full dark:bg-neutral-800 bg-neutral-200' />\n  </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n",
      "type": "registry:component"
    }
  ],
  "type": "registry:component"
}