svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3',\n className,\n )}\n data-slot=\"avatar-group-count\"\n ref={ref}\n {...props}\n />\n ),\n);\nAvatarGroupCount.displayName = 'AvatarGroupCount';\n\nexport { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage };\n",
+ "type": "registry:ui",
+ "target": "@ui/avatar.tsx"
+ }
+ ],
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/docs/public/r/badge.json b/docs/public/r/badge.json
new file mode 100644
index 0000000..5e32480
--- /dev/null
+++ b/docs/public/r/badge.json
@@ -0,0 +1,21 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "badge",
+ "title": "Badge",
+ "description": "A small status descriptor with multiple visual variants.",
+ "dependencies": [
+ "class-variance-authority"
+ ],
+ "registryDependencies": [
+ "@kombase/utils"
+ ],
+ "files": [
+ {
+ "path": "registry/ui/badge.tsx",
+ "content": "'use client';\n\nimport * as Slot from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3',\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground [a&]:hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90',\n ghost: '[a&]:hover:bg-accent [a&]:hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 [a&]:hover:underline',\n outline:\n 'border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90',\n },\n },\n },\n);\n\nconst Badge = React.forwardRef<\n HTMLSpanElement,\n React.ComponentPropsWithoutRef<'span'> &\n VariantProps
& { asChild?: boolean }\n>(({ className, variant = 'default', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : 'span';\n\n return (\n \n );\n});\nBadge.displayName = 'Badge';\n\nexport { Badge, badgeVariants };\n",
+ "type": "registry:ui",
+ "target": "@ui/badge.tsx"
+ }
+ ],
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/docs/public/r/button.json b/docs/public/r/button.json
new file mode 100644
index 0000000..46c52db
--- /dev/null
+++ b/docs/public/r/button.json
@@ -0,0 +1,22 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button",
+ "title": "Button",
+ "description": "An interactive button with multiple size and variant options.",
+ "dependencies": [
+ "@radix-ui/react-slot",
+ "class-variance-authority"
+ ],
+ "registryDependencies": [
+ "@kombase/utils"
+ ],
+ "files": [
+ {
+ "path": "registry/ui/button.tsx",
+ "content": "'use client';\n\nimport * as Slot from '@radix-ui/react-slot';\nimport { cva, type VariantProps } 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 gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive cursor-pointer\",\n {\n defaultVariants: {\n size: 'default',\n variant: 'default',\n },\n variants: {\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n icon: 'size-9',\n 'icon-lg': 'size-10',\n 'icon-sm': 'size-8',\n 'icon-xs': \"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3\",\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n xs: \"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3\",\n },\n variant: {\n default: 'bg-primary text-white hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n },\n },\n },\n);\n\nconst Button = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<'button'> &\n VariantProps & {\n asChild?: boolean;\n }\n>(({ className, variant = 'default', size = 'default', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : 'button';\n\n return (\n \n );\n});\n\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n",
+ "type": "registry:ui",
+ "target": "@ui/button.tsx"
+ }
+ ],
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/docs/public/r/calendar.json b/docs/public/r/calendar.json
new file mode 100644
index 0000000..f0790b5
--- /dev/null
+++ b/docs/public/r/calendar.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "calendar",
+ "title": "Calendar",
+ "description": "A date picker calendar with range selection, presets, and RTL support.",
+ "dependencies": [
+ "react-day-picker",
+ "dayjs"
+ ],
+ "registryDependencies": [
+ "button",
+ "@kombase/utils"
+ ],
+ "files": [
+ {
+ "path": "registry/ui/calendar.tsx",
+ "content": "'use client';\n\nimport { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { type DayButton, DayPicker, getDefaultClassNames, type Locale } from 'react-day-picker';\nimport { Button, buttonVariants } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = 'label',\n buttonVariant = 'ghost',\n locale,\n formatters,\n components,\n ...props\n}: React.ComponentProps & {\n buttonVariant?: React.ComponentProps['variant'];\n}) {\n const defaultClassNames = getDefaultClassNames();\n\n return (\n svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className,\n )}\n classNames={{\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n 'size-(--cell-size) p-0 select-none aria-disabled:opacity-50',\n defaultClassNames.button_next,\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n 'size-(--cell-size) p-0 select-none aria-disabled:opacity-50',\n defaultClassNames.button_previous,\n ),\n caption_label: cn(\n 'font-medium select-none',\n captionLayout === 'label'\n ? 'cn-calendar-caption text-sm'\n : 'cn-calendar-caption-label flex items-center gap-1 rounded-(--cell-radius) text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground',\n defaultClassNames.caption_label,\n ),\n day: cn(\n 'group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius)',\n props.showWeekNumber\n ? '[&:nth-child(2)[data-selected=true]_button]:rounded-l-(--cell-radius)'\n : '[&:first-child[data-selected=true]_button]:rounded-l-(--cell-radius)',\n defaultClassNames.day,\n ),\n disabled: cn('text-muted-foreground opacity-50', defaultClassNames.disabled),\n dropdown: cn('absolute inset-0 bg-popover opacity-0', defaultClassNames.dropdown),\n dropdown_root: cn(\n 'cn-calendar-dropdown-root relative rounded-(--cell-radius)',\n defaultClassNames.dropdown_root,\n ),\n dropdowns: cn(\n 'flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium',\n defaultClassNames.dropdowns,\n ),\n hidden: cn('invisible', defaultClassNames.hidden),\n month: cn('flex w-full flex-col gap-4', defaultClassNames.month),\n month_caption: cn(\n 'flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)',\n defaultClassNames.month_caption,\n ),\n month_grid: cn('w-full border-collapse', defaultClassNames.month_grid),\n months: cn('relative flex flex-col gap-4 md:flex-row', defaultClassNames.months),\n nav: cn(\n 'absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1',\n defaultClassNames.nav,\n ),\n outside: cn(\n 'text-muted-foreground aria-selected:text-muted-foreground',\n defaultClassNames.outside,\n ),\n range_end: cn(\n 'relative isolate z-0 rounded-r-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:left-0 after:w-4 after:bg-muted',\n defaultClassNames.range_end,\n ),\n range_middle: cn('rounded-none', defaultClassNames.range_middle),\n range_start: cn(\n 'relative isolate z-0 rounded-l-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:right-0 after:w-4 after:bg-muted',\n defaultClassNames.range_start,\n ),\n root: cn('w-fit', defaultClassNames.root),\n today: cn(\n 'rounded-(--cell-radius) bg-muted text-foreground data-[selected=true]:rounded-none',\n defaultClassNames.today,\n ),\n week: cn('mt-2 flex w-full', defaultClassNames.week),\n week_number: cn(\n 'text-[0.8rem] text-muted-foreground select-none',\n defaultClassNames.week_number,\n ),\n week_number_header: cn('w-(--cell-size) select-none', defaultClassNames.week_number_header),\n weekday: cn(\n 'flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none',\n defaultClassNames.weekday,\n ),\n weekdays: cn('flex', defaultClassNames.weekdays),\n ...classNames,\n }}\n components={{\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === 'left') {\n return ;\n }\n\n if (orientation === 'right') {\n return ;\n }\n\n return ;\n },\n DayButton: ({ ...props }) => ,\n Root: ({ className, rootRef, ...props }) => {\n return ;\n },\n WeekNumber: ({ children, ...props }) => {\n return (\n \n \n {children}\n \n | \n );\n },\n ...components,\n }}\n formatters={{\n formatMonthDropdown: (date) => date.toLocaleString(locale?.code, { month: 'short' }),\n ...formatters,\n }}\n locale={locale}\n showOutsideDays={showOutsideDays}\n {...props}\n />\n );\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n locale,\n ...props\n}: React.ComponentProps & { locale?: Partial }) {\n const defaultClassNames = getDefaultClassNames();\n\n const ref = React.useRef(null);\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus();\n }, [modifiers.focused]);\n\n return (\n