svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n
\n )\n}\n\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n
\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertAction }\n",
+ "type": "registry:ui"
+ }
+ ],
+ "meta": {
+ "links": {
+ "docs": "https://ui.shadcn.com/docs/components/base/alert",
+ "examples": "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/alert-example.tsx"
+ }
+ },
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/aspect-ratio-example.json b/apps/v4/public/r/styles/base-sera/aspect-ratio-example.json
new file mode 100644
index 0000000000..aca47b3bc1
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/aspect-ratio-example.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "aspect-ratio-example",
+ "title": "Aspect Ratio",
+ "registryDependencies": [
+ "aspect-ratio",
+ "example"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/examples/aspect-ratio-example.tsx",
+ "content": "import Image from \"next/image\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport { AspectRatio } from \"@/registry/base-sera/ui/aspect-ratio\"\n\nexport default function AspectRatioExample() {\n return (\n
\n \n \n \n \n \n )\n}\n\nfunction AspectRatio16x9() {\n return (\n
\n \n \n \n \n )\n}\n\nfunction AspectRatio1x1() {\n return (\n
\n \n \n \n \n )\n}\n\nfunction AspectRatio9x16() {\n return (\n
\n \n \n \n \n )\n}\n\nfunction AspectRatio21x9() {\n return (\n
\n \n \n \n \n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/aspect-ratio.json b/apps/v4/public/r/styles/base-sera/aspect-ratio.json
new file mode 100644
index 0000000000..53d7c919b3
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/aspect-ratio.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "aspect-ratio",
+ "files": [
+ {
+ "path": "registry/base-sera/ui/aspect-ratio.tsx",
+ "content": "import { cn } from \"@/registry/base-sera/lib/utils\"\n\nfunction AspectRatio({\n ratio,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & { ratio: number }) {\n return (\n
\n )\n}\n\nexport { AspectRatio }\n",
+ "type": "registry:ui"
+ }
+ ],
+ "meta": {
+ "links": {
+ "docs": "https://ui.shadcn.com/docs/components/base/aspect-ratio",
+ "examples": "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/aspect-ratio-example.tsx"
+ }
+ },
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/avatar-example.json b/apps/v4/public/r/styles/base-sera/avatar-example.json
new file mode 100644
index 0000000000..31e961f2e5
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/avatar-example.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "avatar-example",
+ "title": "Avatar",
+ "registryDependencies": [
+ "avatar",
+ "button",
+ "empty",
+ "example"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/examples/avatar-example.tsx",
+ "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport {\n Avatar,\n AvatarBadge,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarImage,\n} from \"@/registry/base-sera/ui/avatar\"\nimport { Button } from \"@/registry/base-sera/ui/button\"\nimport {\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from \"@/registry/base-sera/ui/empty\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function AvatarExample() {\n return (\n
\n \n \n \n \n \n \n \n \n )\n}\n\nfunction AvatarSizes() {\n return (\n
\n \n
\n \n CN \n \n
\n \n CN \n \n
\n \n CN \n \n
\n \n
\n CN \n \n
\n CN \n \n
\n CN \n \n
\n \n )\n}\n\nfunction AvatarWithBadge() {\n return (\n
\n \n
\n \n JZ \n \n \n
\n \n JZ \n \n \n
\n \n JZ \n \n \n
\n \n
\n JZ \n \n \n
\n JZ \n \n \n
\n JZ \n \n \n
\n \n )\n}\n\nfunction AvatarWithBadgeIcon() {\n return (\n
\n \n
\n \n PP \n \n \n \n \n
\n \n PP \n \n \n \n \n
\n \n PP \n \n \n \n \n
\n \n
\n PP \n \n \n \n \n
\n PP \n \n \n \n \n
\n PP \n \n \n \n \n
\n \n )\n}\n\nfunction AvatarGroupExample() {\n return (\n
\n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n \n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n \n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n \n \n )\n}\n\nfunction AvatarGroupWithCount() {\n return (\n
\n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n +3 \n \n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n +3 \n \n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n +3 \n \n \n )\n}\n\nfunction AvatarGroupWithIconCount() {\n return (\n
\n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n \n \n \n \n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n \n \n \n \n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n \n \n \n \n \n )\n}\n\nfunction AvatarInEmpty() {\n return (\n
\n \n \n \n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n \n \n \n \n \n No Team Members \n \n Invite your team to collaborate on this project.\n \n \n \n \n \n Invite Members\n \n \n \n \n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/avatar.json b/apps/v4/public/r/styles/base-sera/avatar.json
new file mode 100644
index 0000000000..2f5dd05143
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/avatar.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "avatar",
+ "files": [
+ {
+ "path": "registry/base-sera/ui/avatar.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\"\n\nimport { cn } from \"@/registry/base-sera/lib/utils\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: AvatarPrimitive.Root.Props & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n
\n )\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n return (\n
\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: AvatarPrimitive.Fallback.Props) {\n return (\n
\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n
svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n
\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n 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 {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n",
+ "type": "registry:ui"
+ }
+ ],
+ "meta": {
+ "links": {
+ "docs": "https://ui.shadcn.com/docs/components/base/avatar",
+ "examples": "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/avatar-example.tsx",
+ "api": "https://base-ui.com/react/components/avatar.md"
+ }
+ },
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/badge-example.json b/apps/v4/public/r/styles/base-sera/badge-example.json
new file mode 100644
index 0000000000..c8228ff3ef
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/badge-example.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "badge-example",
+ "title": "Badge",
+ "registryDependencies": [
+ "badge",
+ "spinner",
+ "example"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/examples/badge-example.tsx",
+ "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport { Badge } from \"@/registry/base-sera/ui/badge\"\nimport { Spinner } from \"@/registry/base-sera/ui/spinner\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function BadgeExample() {\n return (\n
\n \n \n \n \n \n \n \n \n )\n}\n\nfunction BadgeVariants() {\n return (\n
\n \n Default \n Secondary \n Destructive \n Outline \n Ghost \n Link \n
\n \n )\n}\n\nfunction BadgeWithIconLeft() {\n return (\n
\n \n \n \n Default\n \n \n \n Secondary\n \n \n \n Destructive\n \n \n \n Outline\n \n \n \n Ghost\n \n \n \n Link\n \n
\n \n )\n}\n\nfunction BadgeWithIconRight() {\n return (\n
\n \n \n Default\n \n \n \n Secondary\n \n \n \n Destructive\n \n \n \n Outline\n \n \n \n Ghost\n \n \n \n Link\n \n \n
\n \n )\n}\n\nfunction BadgeWithSpinner() {\n return (\n
\n \n \n \n Default\n \n \n \n Secondary\n \n \n \n Destructive\n \n \n \n Outline\n \n \n \n Ghost\n \n \n \n Link\n \n
\n \n )\n}\n\nfunction BadgeAsLink() {\n return (\n
\n \n \n Link{\" \"}\n \n \n }\n />\n \n Link{\" \"}\n \n \n }\n />\n \n Link{\" \"}\n \n \n }\n />\n \n Link{\" \"}\n \n \n }\n />\n
\n \n )\n}\n\nfunction BadgeLongText() {\n return (\n
\n \n \n A badge with a lot of text to see how it wraps\n \n
\n \n )\n}\n\nfunction BadgeCustomColors() {\n return (\n
\n \n \n Blue\n \n \n Green\n \n \n Sky\n \n \n Purple\n \n \n Blue\n \n \n Green\n \n \n Sky\n \n \n Purple\n \n \n Red\n \n
\n \n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/badge.json b/apps/v4/public/r/styles/base-sera/badge.json
new file mode 100644
index 0000000000..d7d8960d71
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/badge.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "badge",
+ "files": [
+ {
+ "path": "registry/base-sera/ui/badge.tsx",
+ "content": "import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/registry/base-sera/lib/utils\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1.5 overflow-hidden rounded-none border-0 bg-transparent px-0 py-0 text-[0.625rem] font-semibold tracking-widest whitespace-nowrap uppercase transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-0 has-data-[icon=inline-start]:pl-0 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"text-foreground [a]:hover:text-foreground/70\",\n secondary: \"text-muted-foreground [a]:hover:text-foreground\",\n destructive:\n \"text-destructive focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:text-destructive/70\",\n outline: \"text-foreground [a]:hover:text-foreground/70\",\n ghost: \"text-muted-foreground hover:text-foreground\",\n link: \"text-foreground underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"span\"> & VariantProps
) {\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(\n {\n className: cn(badgeVariants({ variant }), className),\n },\n props\n ),\n render,\n state: {\n slot: \"badge\",\n variant,\n },\n })\n}\n\nexport { Badge, badgeVariants }\n",
+ "type": "registry:ui"
+ }
+ ],
+ "meta": {
+ "links": {
+ "docs": "https://ui.shadcn.com/docs/components/base/badge",
+ "examples": "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/badge-example.tsx"
+ }
+ },
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/breadcrumb-example.json b/apps/v4/public/r/styles/base-sera/breadcrumb-example.json
new file mode 100644
index 0000000000..db5dc8d9f1
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/breadcrumb-example.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "breadcrumb-example",
+ "title": "Breadcrumb",
+ "registryDependencies": [
+ "breadcrumb",
+ "dropdown-menu",
+ "example"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/examples/breadcrumb-example.tsx",
+ "content": "import Link from \"next/link\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/registry/base-sera/ui/breadcrumb\"\nimport { Button } from \"@/registry/base-sera/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/registry/base-sera/ui/dropdown-menu\"\n\nexport default function BreadcrumbExample() {\n return (\n \n \n \n \n \n )\n}\n\nfunction BreadcrumbBasic() {\n return (\n \n \n \n \n Home \n \n \n \n Components \n \n \n \n Breadcrumb \n \n \n \n \n )\n}\n\nfunction BreadcrumbWithDropdown() {\n return (\n \n \n \n \n Home \n \n \n \n \n }\n >\n \n Toggle menu \n \n \n Documentation \n Themes \n GitHub \n \n \n \n \n \n Components \n \n \n \n Breadcrumb \n \n \n \n \n )\n}\n\nfunction BreadcrumbWithLink() {\n return (\n \n \n \n \n Home} />\n \n \n \n \n \n \n \n Components} />\n \n \n \n Breadcrumb \n \n \n \n \n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/breadcrumb.json b/apps/v4/public/r/styles/base-sera/breadcrumb.json
new file mode 100644
index 0000000000..84a9bfae7d
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/breadcrumb.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "breadcrumb",
+ "files": [
+ {
+ "path": "registry/base-sera/ui/breadcrumb.tsx",
+ "content": "import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\n\nimport { cn } from \"@/registry/base-sera/lib/utils\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n \n )\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n \n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n \n )\n}\n\nfunction BreadcrumbLink({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"a\">) {\n return useRender({\n defaultTagName: \"a\",\n props: mergeProps<\"a\">(\n {\n className: cn(\"transition-colors hover:text-foreground\", className),\n },\n props\n ),\n render,\n state: {\n slot: \"breadcrumb-link\",\n },\n })\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n \n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? (\n \n )}\n \n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n svg]:size-4\",\n className\n )}\n {...props}\n >\n \n More \n \n )\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n",
+ "type": "registry:ui"
+ }
+ ],
+ "meta": {
+ "links": {
+ "docs": "https://ui.shadcn.com/docs/components/base/breadcrumb",
+ "examples": "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/breadcrumb-example.tsx"
+ }
+ },
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/button-example.json b/apps/v4/public/r/styles/base-sera/button-example.json
new file mode 100644
index 0000000000..4c55bf9652
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/button-example.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-example",
+ "title": "Button",
+ "registryDependencies": [
+ "button",
+ "example"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/examples/button-example.tsx",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport { Button, buttonVariants } from \"@/registry/base-sera/ui/button\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function ButtonExample() {\n return (\n \n \n \n \n \n \n \n \n )\n}\n\nfunction ButtonVariantsAndSizes() {\n return (\n \n \n Default \n \n Secondary\n \n \n Outline\n \n \n Ghost\n \n \n Destructive\n \n \n Link\n \n
\n \n Default \n \n Secondary\n \n \n Outline\n \n \n Ghost\n \n \n Destructive\n \n \n Link\n \n
\n \n Default \n Secondary \n Outline \n Ghost \n Destructive \n Link \n
\n \n Default \n \n Secondary\n \n \n Outline\n \n \n Ghost\n \n \n Destructive\n \n \n Link\n \n
\n \n )\n}\n\nfunction ButtonIconRight() {\n return (\n \n \n \n Default{\" \"}\n \n \n \n Secondary{\" \"}\n \n \n \n Outline{\" \"}\n \n \n \n Ghost{\" \"}\n \n \n \n Destructive{\" \"}\n \n \n \n Link{\" \"}\n \n \n
\n \n \n Default\n \n \n \n Secondary{\" \"}\n \n \n \n Outline{\" \"}\n \n \n \n Ghost{\" \"}\n \n \n \n Destructive{\" \"}\n \n \n \n Link{\" \"}\n \n \n
\n \n \n Default{\" \"}\n \n \n \n Secondary{\" \"}\n \n \n \n Outline{\" \"}\n \n \n \n Ghost{\" \"}\n \n \n \n Destructive{\" \"}\n \n \n \n Link{\" \"}\n \n \n
\n \n \n Default{\" \"}\n \n \n \n Secondary{\" \"}\n \n \n \n Outline{\" \"}\n \n \n \n Ghost{\" \"}\n \n \n \n Destructive{\" \"}\n \n \n \n Link{\" \"}\n \n \n
\n \n )\n}\n\nfunction ButtonIconLeft() {\n return (\n \n \n \n {\" \"}\n Default\n \n \n {\" \"}\n Secondary\n \n \n {\" \"}\n Outline\n \n \n {\" \"}\n Ghost\n \n \n {\" \"}\n Destructive\n \n \n {\" \"}\n Link\n \n
\n \n \n {\" \"}\n Default\n \n \n {\" \"}\n Secondary\n \n \n {\" \"}\n Outline\n \n \n {\" \"}\n Ghost\n \n \n {\" \"}\n Destructive\n \n \n {\" \"}\n Link\n \n
\n \n \n {\" \"}\n Default\n \n \n {\" \"}\n Secondary\n \n \n {\" \"}\n Outline\n \n \n {\" \"}\n Ghost\n \n \n {\" \"}\n Destructive\n \n \n {\" \"}\n Link\n \n
\n \n \n {\" \"}\n Default\n \n \n {\" \"}\n Secondary\n \n \n {\" \"}\n Outline\n \n \n {\" \"}\n Ghost\n \n \n {\" \"}\n Destructive\n \n \n {\" \"}\n Link\n \n
\n \n )\n}\n\nfunction ButtonIconOnly() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n )\n}\n\nfunction ButtonExamples() {\n return (\n \n \n
\n Cancel \n \n Submit{\" \"}\n \n \n
\n
\n Delete \n \n \n \n
\n
\n Link\n \n
\n \n )\n}\n\nfunction ButtonInvalidStates() {\n return (\n \n \n \n Default\n \n \n Secondary\n \n \n Outline\n \n \n Ghost\n \n \n Destructive\n \n \n Link\n \n
\n \n \n Default\n \n \n Secondary\n \n \n Outline\n \n \n Ghost\n \n \n Destructive\n \n \n Link\n \n
\n \n Default \n \n Secondary\n \n \n Outline\n \n \n Ghost\n \n \n Destructive\n \n \n Link\n \n
\n \n \n Default\n \n \n Secondary\n \n \n Outline\n \n \n Ghost\n \n \n Destructive\n \n \n Link\n \n
\n \n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/button-group-example.json b/apps/v4/public/r/styles/base-sera/button-group-example.json
new file mode 100644
index 0000000000..6ca84f6e7d
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/button-group-example.json
@@ -0,0 +1,26 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-example",
+ "title": "Button Group",
+ "registryDependencies": [
+ "button",
+ "button-group",
+ "dropdown-menu",
+ "field",
+ "input",
+ "input-group",
+ "label",
+ "popover",
+ "select",
+ "tooltip",
+ "example"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/examples/button-group-example.tsx",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport { Button } from \"@/registry/base-sera/ui/button\"\nimport {\n ButtonGroup,\n ButtonGroupText,\n} from \"@/registry/base-sera/ui/button-group\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-sera/ui/dropdown-menu\"\nimport { Field, FieldGroup } from \"@/registry/base-sera/ui/field\"\nimport { Input } from \"@/registry/base-sera/ui/input\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/registry/base-sera/ui/input-group\"\nimport { Label } from \"@/registry/base-sera/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/base-sera/ui/select\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/registry/base-sera/ui/tooltip\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function ButtonGroupExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction ButtonGroupBasic() {\n return (\n \n \n \n Button \n Another Button \n \n
\n \n )\n}\n\nfunction ButtonGroupWithInput() {\n return (\n \n \n \n Button \n \n \n \n \n Button \n \n
\n \n )\n}\n\nfunction ButtonGroupWithText() {\n return (\n \n \n \n Text \n Another Button \n \n \n }>\n GPU Size\n \n \n \n
\n \n )\n}\n\nfunction ButtonGroupWithDropdown() {\n return (\n \n \n \n Update \n \n }\n >\n \n \n \n Disable \n \n Uninstall\n \n \n \n \n \n Follow \n \n }\n >\n \n \n \n \n \n \n Mute Conversation\n \n \n \n Mark as Read\n \n \n \n Report Conversation\n \n \n \n Block User\n \n \n \n Share Conversation\n \n \n \n Copy Conversation\n \n \n \n \n \n \n Delete Conversation\n \n \n \n \n \n
\n \n )\n}\n\nconst currencyItems = [\n { label: \"$\", value: \"$\" },\n { label: \"€\", value: \"€\" },\n { label: \"£\", value: \"£\" },\n]\n\nfunction ButtonGroupWithSelect() {\n return (\n \n \n Amount \n \n \n \n \n \n \n \n {currencyItems.map((item) => (\n \n {item.label}\n \n ))}\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction ButtonGroupWithIcons() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n )\n}\n\nfunction ButtonGroupWithInputGroup() {\n return (\n \n \n \n \n \n \n \n \n
\n \n )\n}\n\nfunction ButtonGroupWithFields() {\n return (\n \n \n \n Width \n \n \n \n \n W\n \n \n px\n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction ButtonGroupWithLike() {\n return (\n \n \n \n {\" \"}\n Like\n \n }\n nativeButton={false}\n >\n 1.2K\n \n \n \n )\n}\n\nconst durationItems = [\n { label: \"Hours\", value: \"hours\" },\n { label: \"Days\", value: \"days\" },\n { label: \"Weeks\", value: \"weeks\" },\n]\n\nfunction ButtonGroupWithSelectAndInput() {\n return (\n \n \n \n \n \n \n \n \n {durationItems.map((item) => (\n \n {item.label}\n \n ))}\n \n \n \n \n \n \n )\n}\n\nfunction ButtonGroupNested() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n }>\n \n \n Voice Mode \n \n \n \n \n \n )\n}\n\nfunction ButtonGroupPagination() {\n return (\n \n \n \n \n Previous\n \n \n 1\n \n \n 2\n \n \n 3\n \n \n 4\n \n \n 5\n \n \n Next\n \n \n \n \n )\n}\n\nfunction ButtonGroupPaginationSplit() {\n return (\n \n \n \n \n 1\n \n \n 2\n \n \n 3\n \n \n 4\n \n \n 5\n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction ButtonGroupNavigation() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction ButtonGroupTextAlignment() {\n return (\n \n \n Text Alignment \n \n \n Left\n \n \n Center\n \n \n Right\n \n \n Justify\n \n \n \n \n )\n}\n\nfunction ButtonGroupVertical() {\n return (\n \n \n \n \n \n \n \n \n \n \n
\n \n )\n}\n\nfunction ButtonGroupVerticalNested() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/button-group.json b/apps/v4/public/r/styles/base-sera/button-group.json
new file mode 100644
index 0000000000..0aa153ce08
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/button-group.json
@@ -0,0 +1,21 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group",
+ "registryDependencies": [
+ "separator"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/ui/button-group.tsx",
+ "content": "import { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/registry/base-sera/lib/utils\"\nimport { Separator } from \"@/registry/base-sera/ui/separator\"\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 *:data-[slot=input]:px-4 has-[>[data-variant=outline]]:*:data-[slot=input-group]:border-border has-[>[data-variant=outline]]:*:data-[slot=input-group]:px-2.5 has-[>[data-variant=outline]]:*:data-[slot=select-trigger]:border-border has-[>[data-variant=outline]]:*:[[role=combobox]]:px-2.5 has-[>[data-variant=outline]]:[&>[data-slot=input-group]:has(:focus-visible)]:border-ring has-[>[data-variant=outline]]:[&>[data-slot=select-trigger]:focus-visible]:border-ring has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-none [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[>[data-variant=outline]]:[&>input]:border-border has-[>[data-variant=outline]]:[&>input:focus-visible]:border-ring\",\n {\n variants: {\n orientation: {\n horizontal:\n \"*:data-slot:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-none! [&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0\",\n vertical:\n \"flex-col *:data-slot:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-none! [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\nfunction ButtonGroup({\n className,\n orientation,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps) {\n return (\n
\n )\n}\n\nfunction ButtonGroupText({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(\n \"flex items-center gap-2 border border-transparent border-b-input bg-transparent px-2.5 text-xs font-semibold uppercase group-has-[>[data-variant=outline]]/button-group:border-border [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-3.5\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: \"button-group-text\",\n },\n })\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps) {\n return (\n \n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n",
+ "type": "registry:ui"
+ }
+ ],
+ "meta": {
+ "links": {
+ "docs": "https://ui.shadcn.com/docs/components/base/button-group",
+ "examples": "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/button-group-example.tsx"
+ }
+ },
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/button.json b/apps/v4/public/r/styles/base-sera/button.json
new file mode 100644
index 0000000000..02aeacdd3d
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/button.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button",
+ "files": [
+ {
+ "path": "registry/base-sera/ui/button.tsx",
+ "content": "import { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/registry/base-sera/lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-none border border-transparent bg-clip-padding text-xs font-semibold tracking-widest whitespace-nowrap uppercase transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/30 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-transparent hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-input/30\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-10 gap-1.5 px-6 has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4\",\n xs: \"h-7 gap-1 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-9 gap-1 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n lg: \"h-11 gap-1.5 px-8 has-data-[icon=inline-end]:pr-5 has-data-[icon=inline-start]:pl-5\",\n icon: \"size-10\",\n \"icon-xs\": \"size-7 [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-9\",\n \"icon-lg\": \"size-11\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps) {\n return (\n \n )\n}\n\nexport { Button, buttonVariants }\n",
+ "type": "registry:ui"
+ }
+ ],
+ "meta": {
+ "links": {
+ "docs": "https://ui.shadcn.com/docs/components/base/button",
+ "examples": "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/button-example.tsx"
+ }
+ },
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/calendar-example.json b/apps/v4/public/r/styles/base-sera/calendar-example.json
new file mode 100644
index 0000000000..da4acbea7f
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/calendar-example.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "calendar-example",
+ "title": "Calendar",
+ "registryDependencies": [
+ "button",
+ "calendar",
+ "card",
+ "field",
+ "input",
+ "label",
+ "popover",
+ "example"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/examples/calendar-example.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { addDays, format } from \"date-fns\"\nimport { type DateRange } from \"react-day-picker\"\nimport { es } from \"react-day-picker/locale\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport { Button } from \"@/registry/base-sera/ui/button\"\nimport { Calendar, CalendarDayButton } from \"@/registry/base-sera/ui/calendar\"\nimport { Card, CardContent, CardFooter } from \"@/registry/base-sera/ui/card\"\nimport { Field, FieldGroup, FieldLabel } from \"@/registry/base-sera/ui/field\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/registry/base-sera/ui/input-group\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/base-sera/ui/popover\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function CalendarExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction CalendarInCard() {\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction CalendarInPopover() {\n return (\n \n \n }\n >\n \n Open Calendar\n \n \n \n \n \n \n )\n}\n\nfunction CalendarSingle() {\n const [date, setDate] = React.useState(\n new Date(new Date().getFullYear(), new Date().getMonth(), 12)\n )\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction CalendarMultiple() {\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction CalendarRange() {\n const [dateRange, setDateRange] = React.useState({\n from: new Date(new Date().getFullYear(), 0, 12),\n to: addDays(new Date(new Date().getFullYear(), 0, 12), 30),\n })\n\n return (\n \n \n \n \n date > new Date() || date < new Date(\"1900-01-01\")\n }\n />\n \n \n \n )\n}\n\nfunction CalendarRangeMultipleMonths() {\n const [range, setRange] = React.useState({\n from: new Date(new Date().getFullYear(), 3, 12),\n to: addDays(new Date(new Date().getFullYear(), 3, 12), 60),\n })\n\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction CalendarBookedDates() {\n const [date, setDate] = React.useState(\n new Date(new Date().getFullYear(), 1, 3)\n )\n const bookedDates = Array.from(\n { length: 15 },\n (_, i) => new Date(new Date().getFullYear(), 1, 12 + i)\n )\n\n return (\n \n \n \n button]:line-through opacity-100\",\n }}\n />\n \n \n \n )\n}\n\nfunction CalendarWithTime() {\n const [date, setDate] = React.useState(\n new Date(new Date().getFullYear(), new Date().getMonth(), 12)\n )\n\n return (\n \n \n \n \n \n \n \n \n Start Time \n \n \n \n \n \n \n \n \n End Time \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction CalendarCustomDays() {\n const [range, setRange] = React.useState({\n from: new Date(new Date().getFullYear(), 11, 8),\n to: addDays(new Date(new Date().getFullYear(), 11, 8), 10),\n })\n\n return (\n \n \n \n {\n return date.toLocaleString(\"default\", { month: \"long\" })\n },\n }}\n components={{\n DayButton: ({ children, modifiers, day, ...props }) => {\n const isWeekend =\n day.date.getDay() === 0 || day.date.getDay() === 6\n\n return (\n \n {children}\n {!modifiers.outside && (\n {isWeekend ? \"$120\" : \"$100\"} \n )}\n \n )\n },\n }}\n />\n \n \n \n )\n}\n\nfunction CalendarWithPresets() {\n const [date, setDate] = React.useState(\n new Date(new Date().getFullYear(), 1, 12)\n )\n const [currentMonth, setCurrentMonth] = React.useState(\n new Date(new Date().getFullYear(), new Date().getMonth(), 1)\n )\n\n return (\n \n \n \n \n \n \n {[\n { label: \"Today\", value: 0 },\n { label: \"Tomorrow\", value: 1 },\n { label: \"In 3 days\", value: 3 },\n { label: \"In a week\", value: 7 },\n { label: \"In 2 weeks\", value: 14 },\n ].map((preset) => (\n {\n const newDate = addDays(new Date(), preset.value)\n setDate(newDate)\n setCurrentMonth(\n new Date(newDate.getFullYear(), newDate.getMonth(), 1)\n )\n }}\n >\n {preset.label}\n \n ))}\n \n \n \n )\n}\n\nfunction DatePickerSimple() {\n const [date, setDate] = React.useState()\n\n return (\n \n \n Date \n \n \n }\n >\n \n {date ? format(date, \"PPP\") : Pick a date }\n \n \n \n \n \n \n \n )\n}\n\nfunction DatePickerWithRange() {\n const [date, setDate] = React.useState({\n from: new Date(new Date().getFullYear(), 0, 20),\n to: addDays(new Date(new Date().getFullYear(), 0, 20), 20),\n })\n\n return (\n \n \n Date Picker Range \n \n \n }\n >\n \n {date?.from ? (\n date.to ? (\n <>\n {format(date.from, \"LLL dd, y\")} -{\" \"}\n {format(date.to, \"LLL dd, y\")}\n >\n ) : (\n format(date.from, \"LLL dd, y\")\n )\n ) : (\n Pick a date \n )}\n \n \n \n \n \n \n \n )\n}\n\nfunction DataPickerWithDropdowns() {\n const [date, setDate] = React.useState()\n const [open, setOpen] = React.useState(false)\n\n return (\n \n \n \n \n Date\n \n \n }\n >\n {date ? format(date, \"PPP\") : Pick a date }\n \n \n \n \n \n setOpen(false)}\n >\n Done\n \n
\n \n \n \n \n )\n}\n\nfunction CalendarWeekNumbers() {\n const [date, setDate] = React.useState(\n new Date(new Date().getFullYear(), 1, 3)\n )\n\n return (\n \n \n \n \n \n \n \n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/calendar.json b/apps/v4/public/r/styles/base-sera/calendar.json
new file mode 100644
index 0000000000..25011d5d24
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/calendar.json
@@ -0,0 +1,26 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "calendar",
+ "dependencies": [
+ "react-day-picker@latest",
+ "date-fns"
+ ],
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/ui/calendar.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n type Locale,\n} from \"react-day-picker\"\n\nimport { cn } from \"@/registry/base-sera/lib/utils\"\nimport { Button, buttonVariants } from \"@/registry/base-sera/ui/button\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\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 captionLayout={captionLayout}\n locale={locale}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(locale?.code, { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"relative flex flex-col gap-4 md:flex-row\",\n defaultClassNames.months\n ),\n month: cn(\"flex w-full flex-col gap-4\", defaultClassNames.month),\n nav: cn(\n \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n defaultClassNames.nav\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 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 month_caption: cn(\n \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n defaultClassNames.month_caption\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 dropdown_root: cn(\n \"cn-calendar-dropdown-root relative rounded-(--cell-radius)\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute inset-0 bg-popover opacity-0\",\n defaultClassNames.dropdown\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 table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"mt-2 flex w-full\", defaultClassNames.week),\n week_number_header: cn(\n \"w-(--cell-size) select-none\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] text-muted-foreground select-none\",\n defaultClassNames.week_number\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 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 range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\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 today: cn(\n \"rounded-(--cell-radius) bg-muted text-foreground data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n
\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n \n )\n }\n\n if (orientation === \"right\") {\n return (\n \n )\n }\n\n return (\n \n )\n },\n DayButton: ({ ...props }) => (\n \n ),\n WeekNumber: ({ children, ...props }) => {\n return (\n \n \n {children}\n
\n \n )\n },\n ...components,\n }}\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 span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n",
+ "type": "registry:ui"
+ }
+ ],
+ "meta": {
+ "links": {
+ "docs": "https://ui.shadcn.com/docs/components/base/calendar",
+ "examples": "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/calendar-example.tsx",
+ "api": "https://react-day-picker.js.org"
+ }
+ },
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/card-example.json b/apps/v4/public/r/styles/base-sera/card-example.json
new file mode 100644
index 0000000000..2371d39adf
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/card-example.json
@@ -0,0 +1,21 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "card-example",
+ "title": "Card",
+ "registryDependencies": [
+ "avatar",
+ "button",
+ "card",
+ "field",
+ "input",
+ "example"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/examples/card-example.tsx",
+ "content": "import Image from \"next/image\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarImage,\n} from \"@/registry/base-sera/ui/avatar\"\nimport { Button } from \"@/registry/base-sera/ui/button\"\nimport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/registry/base-sera/ui/card\"\nimport { Field, FieldGroup, FieldLabel } from \"@/registry/base-sera/ui/field\"\nimport { Input } from \"@/registry/base-sera/ui/input\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function CardExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction CardLogin() {\n return (\n \n \n \n Login to your account \n \n Enter your email below to login to your account\n \n \n \n \n \n \n \n Login\n \n \n Login with Google\n \n \n \n \n \n )\n}\n\nfunction CardMeetingNotes() {\n return (\n \n \n \n Meeting Notes \n \n Transcript from the meeting with the client.\n \n \n \n \n Transcribe\n \n \n \n \n \n Client requested dashboard redesign with focus on mobile\n responsiveness.\n
\n \n New analytics widgets for daily/weekly metrics \n Simplified navigation menu \n Dark mode support \n Timeline: 6 weeks \n Follow-up meeting scheduled for next Tuesday \n \n \n \n \n \n \n CN \n \n \n \n LR \n \n \n \n ER \n \n +8 \n \n \n \n \n )\n}\n\nfunction CardWithImage() {\n return (\n \n \n
\n \n \n Beautiful Landscape \n \n A stunning view that captures the essence of natural beauty.\n \n \n \n \n \n Button\n \n \n \n \n )\n}\n\nfunction CardWithImageSmall() {\n return (\n \n \n
\n \n \n Beautiful Landscape \n \n A stunning view that captures the essence of natural beauty.\n \n \n \n \n \n Button\n \n \n \n \n )\n}\n\nfunction CardHeaderWithBorder() {\n return (\n \n \n \n Header with Border \n \n This is a card with a header that has a bottom border.\n \n \n \n \n The header has a border-b class applied, creating a visual\n separation between the header and content sections.\n
\n \n \n \n )\n}\n\nfunction CardFooterWithBorder() {\n return (\n \n \n \n \n The footer has a border-t class applied, creating a visual\n separation between the content and footer sections.\n
\n \n \n \n Footer with Border\n \n \n \n \n )\n}\n\nfunction CardDefault() {\n return (\n \n \n \n Default Card \n \n This card uses the default size variant.\n \n \n \n \n The card component supports a size prop that defaults to\n "default" for standard spacing and sizing.\n
\n \n \n \n Action\n \n \n \n \n )\n}\n\nfunction CardSmall() {\n return (\n \n \n \n Small Card \n \n This card uses the small size variant.\n \n \n \n \n The card component supports a size prop that can be set to\n "sm" for a more compact appearance.\n
\n \n \n \n Action\n \n \n \n \n )\n}\n\nfunction CardHeaderWithBorderSmall() {\n return (\n \n \n \n Header with Border \n \n This is a small card with a header that has a bottom border.\n \n \n \n \n The header has a border-b class applied, creating a visual\n separation between the header and content sections.\n
\n \n \n \n )\n}\n\nfunction CardFooterWithBorderSmall() {\n return (\n \n \n \n \n The footer has a border-t class applied, creating a visual\n separation between the content and footer sections.\n
\n \n \n \n Footer with Border\n \n \n \n \n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/card.json b/apps/v4/public/r/styles/base-sera/card.json
new file mode 100644
index 0000000000..1c6098e450
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/card.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "card",
+ "files": [
+ {
+ "path": "registry/base-sera/ui/card.tsx",
+ "content": "import * as React from \"react\"\n\nimport { cn } from \"@/registry/base-sera/lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n img:first-child]:pt-0 data-[size=sm]:gap-5 data-[size=sm]:py-5 *:[img:first-child]:rounded-none *:[img:last-child]:rounded-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n
\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n
\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n
\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n
\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n
\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n
\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n",
+ "type": "registry:ui"
+ }
+ ],
+ "meta": {
+ "links": {
+ "docs": "https://ui.shadcn.com/docs/components/base/card",
+ "examples": "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/card-example.tsx"
+ }
+ },
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/carousel-example.json b/apps/v4/public/r/styles/base-sera/carousel-example.json
new file mode 100644
index 0000000000..2469a6f10c
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/carousel-example.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "carousel-example",
+ "title": "Carousel",
+ "registryDependencies": [
+ "card",
+ "carousel",
+ "example"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/examples/carousel-example.tsx",
+ "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport { Card, CardContent } from \"@/registry/base-sera/ui/card\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/registry/base-sera/ui/carousel\"\n\nexport default function CarouselExample() {\n return (\n
\n \n \n \n \n )\n}\n\nfunction CarouselBasic() {\n return (\n
\n \n \n {Array.from({ length: 5 }).map((_, index) => (\n \n \n \n \n {index + 1} \n \n \n
\n \n ))}\n \n \n \n \n \n )\n}\n\nfunction CarouselMultiple() {\n return (\n
\n \n \n {Array.from({ length: 5 }).map((_, index) => (\n \n \n \n \n {index + 1} \n \n \n
\n \n ))}\n \n \n \n \n \n )\n}\n\nfunction CarouselWithGap() {\n return (\n
\n \n \n {Array.from({ length: 5 }).map((_, index) => (\n \n \n \n \n {index + 1} \n \n \n
\n \n ))}\n \n \n \n \n \n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/carousel.json b/apps/v4/public/r/styles/base-sera/carousel.json
new file mode 100644
index 0000000000..4038c27b50
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/carousel.json
@@ -0,0 +1,25 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "carousel",
+ "dependencies": [
+ "embla-carousel-react"
+ ],
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/ui/carousel.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\n\nimport { cn } from \"@/registry/base-sera/lib/utils\"\nimport { Button } from \"@/registry/base-sera/ui/button\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters
\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n opts?: CarouselOptions\n plugins?: CarouselPlugin\n orientation?: \"horizontal\" | \"vertical\"\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n carouselRef: ReturnType[0]\n api: ReturnType[1]\n scrollPrev: () => void\n scrollNext: () => void\n canScrollPrev: boolean\n canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext(null)\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext)\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a \")\n }\n\n return context\n}\n\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return\n setCanScrollPrev(api.canScrollPrev())\n setCanScrollNext(api.canScrollNext())\n }, [])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext]\n )\n\n React.useEffect(() => {\n if (!api || !setApi) return\n setApi(api)\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) return\n onSelect(api)\n api.on(\"reInit\", onSelect)\n api.on(\"select\", onSelect)\n\n return () => {\n api?.off(\"select\", onSelect)\n }\n }, [api, onSelect])\n\n return (\n \n \n {children}\n
\n \n )\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n \n )\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel()\n\n return (\n
\n )\n}\n\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n \n \n Previous slide \n \n )\n}\n\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon-sm\",\n ...props\n}: React.ComponentProps) {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n \n \n Next slide \n \n )\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n useCarousel,\n}\n",
+ "type": "registry:ui"
+ }
+ ],
+ "meta": {
+ "links": {
+ "docs": "https://ui.shadcn.com/docs/components/base/carousel",
+ "examples": "https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/base/examples/carousel-example.tsx",
+ "api": "https://www.embla-carousel.com/get-started/react"
+ }
+ },
+ "type": "registry:ui"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/chart-example.json b/apps/v4/public/r/styles/base-sera/chart-example.json
new file mode 100644
index 0000000000..6168a38ca4
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/chart-example.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "chart-example",
+ "title": "Chart",
+ "registryDependencies": [
+ "chart",
+ "card",
+ "example"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/examples/chart-example.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n Area,\n AreaChart,\n Bar,\n BarChart,\n CartesianGrid,\n Label,\n Line,\n LineChart,\n Pie,\n PieChart,\n PolarAngleAxis,\n PolarGrid,\n PolarRadiusAxis,\n Radar,\n RadarChart,\n RadialBar,\n RadialBarChart,\n XAxis,\n} from \"recharts\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/registry/base-sera/ui/card\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-sera/ui/chart\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nconst areaChartData = [\n { month: \"January\", desktop: 186 },\n { month: \"February\", desktop: 305 },\n { month: \"March\", desktop: 237 },\n { month: \"April\", desktop: 73 },\n { month: \"May\", desktop: 209 },\n { month: \"June\", desktop: 214 },\n]\n\nconst areaChartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"var(--chart-1)\",\n },\n} satisfies ChartConfig\n\nexport default function ChartExample() {\n return (\n \n \n \n \n \n \n \n \n )\n}\n\nfunction ChartAreaExample() {\n return (\n \n \n \n Area Chart \n \n Showing total visitors for the last 6 months\n \n \n \n \n \n \n value.slice(0, 3)}\n />\n }\n />\n \n \n \n \n \n \n
\n
\n Trending up by 5.2% this month{\" \"}\n \n
\n
\n January - June 2024\n
\n
\n
\n \n \n \n )\n}\n\nconst barChartData = [\n { month: \"January\", desktop: 186, mobile: 80 },\n { month: \"February\", desktop: 305, mobile: 200 },\n { month: \"March\", desktop: 237, mobile: 120 },\n { month: \"April\", desktop: 73, mobile: 190 },\n { month: \"May\", desktop: 209, mobile: 130 },\n { month: \"June\", desktop: 214, mobile: 140 },\n]\n\nconst barChartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"var(--chart-1)\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"var(--chart-2)\",\n },\n} satisfies ChartConfig\n\nfunction ChartBarExample() {\n return (\n \n \n \n Bar Chart - Multiple \n January - June 2024 \n \n \n \n \n \n value.slice(0, 3)}\n />\n }\n />\n \n \n \n \n \n \n \n Trending up by 5.2% this month{\" \"}\n \n
\n \n Showing total visitors for the last 6 months\n
\n \n \n \n )\n}\n\nconst lineChartData = [\n { month: \"January\", desktop: 186, mobile: 80 },\n { month: \"February\", desktop: 305, mobile: 200 },\n { month: \"March\", desktop: 237, mobile: 120 },\n { month: \"April\", desktop: 73, mobile: 190 },\n { month: \"May\", desktop: 209, mobile: 130 },\n { month: \"June\", desktop: 214, mobile: 140 },\n]\n\nconst lineChartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"var(--chart-1)\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"var(--chart-2)\",\n },\n} satisfies ChartConfig\n\nfunction ChartLineExample() {\n return (\n \n \n \n Line Chart - Multiple \n January - June 2024 \n \n \n \n \n \n value.slice(0, 3)}\n />\n } />\n \n \n \n \n \n \n \n
\n
\n Trending up by 5.2% this month{\" \"}\n \n
\n
\n Showing total visitors for the last 6 months\n
\n
\n
\n \n \n \n )\n}\n\nconst pieChartData = [\n { browser: \"chrome\", visitors: 275, fill: \"var(--color-chrome)\" },\n { browser: \"safari\", visitors: 200, fill: \"var(--color-safari)\" },\n { browser: \"firefox\", visitors: 287, fill: \"var(--color-firefox)\" },\n { browser: \"edge\", visitors: 173, fill: \"var(--color-edge)\" },\n { browser: \"other\", visitors: 190, fill: \"var(--color-other)\" },\n]\n\nconst pieChartConfig = {\n visitors: {\n label: \"Visitors\",\n },\n chrome: {\n label: \"Chrome\",\n color: \"var(--chart-1)\",\n },\n safari: {\n label: \"Safari\",\n color: \"var(--chart-2)\",\n },\n firefox: {\n label: \"Firefox\",\n color: \"var(--chart-3)\",\n },\n edge: {\n label: \"Edge\",\n color: \"var(--chart-4)\",\n },\n other: {\n label: \"Other\",\n color: \"var(--chart-5)\",\n },\n} satisfies ChartConfig\n\nfunction ChartPieExample() {\n const totalVisitors = React.useMemo(() => {\n return pieChartData.reduce((acc, curr) => acc + curr.visitors, 0)\n }, [])\n\n return (\n \n \n \n Pie Chart - Donut with Text \n January - June 2024 \n \n \n \n \n }\n />\n \n {\n if (viewBox && \"cx\" in viewBox && \"cy\" in viewBox) {\n return (\n \n \n {totalVisitors.toLocaleString()}\n \n \n Visitors\n \n \n )\n }\n }}\n />\n \n \n \n \n \n \n Trending up by 5.2% this month{\" \"}\n \n
\n \n Showing total visitors for the last 6 months\n
\n \n \n \n )\n}\n\nconst radarChartData = [\n { month: \"January\", desktop: 186, mobile: 80 },\n { month: \"February\", desktop: 305, mobile: 200 },\n { month: \"March\", desktop: 237, mobile: 120 },\n { month: \"April\", desktop: 73, mobile: 190 },\n { month: \"May\", desktop: 209, mobile: 130 },\n { month: \"June\", desktop: 214, mobile: 140 },\n]\n\nconst radarChartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"var(--chart-1)\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"var(--chart-2)\",\n },\n} satisfies ChartConfig\n\nfunction ChartRadarExample() {\n return (\n \n \n \n Radar Chart - Multiple \n \n Showing total visitors for the last 6 months\n \n \n \n \n \n }\n />\n \n \n \n \n \n \n \n \n \n Trending up by 5.2% this month{\" \"}\n \n
\n \n January - June 2024\n
\n \n \n \n )\n}\n\nconst radialChartData = [\n { browser: \"safari\", visitors: 1260, fill: \"var(--color-safari)\" },\n]\n\nconst radialChartConfig = {\n visitors: {\n label: \"Visitors\",\n },\n safari: {\n label: \"Safari\",\n color: \"var(--chart-2)\",\n },\n} satisfies ChartConfig\n\nfunction ChartRadialExample() {\n return (\n \n \n \n Radial Chart - Shape \n January - June 2024 \n \n \n \n \n \n \n \n {\n if (viewBox && \"cx\" in viewBox && \"cy\" in viewBox) {\n return (\n \n \n {radialChartData[0].visitors.toLocaleString()}\n \n \n Visitors\n \n \n )\n }\n }}\n />\n \n \n \n \n \n \n Trending up by 5.2% this month{\" \"}\n \n
\n \n Showing total visitors for the last 6 months\n
\n \n \n \n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-sera/chart.json b/apps/v4/public/r/styles/base-sera/chart.json
new file mode 100644
index 0000000000..90708fd1c8
--- /dev/null
+++ b/apps/v4/public/r/styles/base-sera/chart.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "chart",
+ "dependencies": [
+ "recharts@3.8.0"
+ ],
+ "registryDependencies": [
+ "card"
+ ],
+ "files": [
+ {
+ "path": "registry/base-sera/ui/chart.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\nimport type { TooltipValueType } from \"recharts\"\n\nimport { cn } from \"@/registry/base-sera/lib/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const\ntype TooltipNameType = number | string\n\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record }\n )\n>\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error(\"useChart must be used within a \")\n }\n\n return context\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n initialDimension = INITIAL_DIMENSION,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"]\n initialDimension?: {\n width: number\n height: number\n }\n}) {\n const uniqueId = React.useId()\n const chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`\n\n return (\n \n \n \n \n {children}\n \n
\n \n )\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme ?? config.color\n )\n\n if (!colorConfig.length) {\n return null\n }\n\n return (\n