svg]/alert:col-start-2 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3\",\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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/aspect-ratio-demo.json b/apps/v4/public/r/styles/base-lyra/aspect-ratio-demo.json
new file mode 100644
index 0000000000..188068f069
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/aspect-ratio-demo.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "aspect-ratio-demo",
+ "title": "Aspect Ratio Demo",
+ "registryDependencies": [
+ "aspect-ratio"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/aspect-ratio-demo.tsx",
+ "content": "import Image from \"next/image\"\n\nimport { AspectRatio } from \"@/registry/base-lyra/ui/aspect-ratio\"\n\nexport default function AspectRatioDemo() {\n return (\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-lyra/aspect-ratio-example.json b/apps/v4/public/r/styles/base-lyra/aspect-ratio-example.json
index b258d205b0..444c8c3573 100644
--- a/apps/v4/public/r/styles/base-lyra/aspect-ratio-example.json
+++ b/apps/v4/public/r/styles/base-lyra/aspect-ratio-example.json
@@ -9,7 +9,7 @@
"files": [
{
"path": "registry/base-lyra/examples/aspect-ratio-example.tsx",
- "content": "import Image from \"next/image\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/bases/base/components/example\"\nimport { AspectRatio } from \"@/registry/bases/base/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",
+ "content": "import Image from \"next/image\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport { AspectRatio } from \"@/registry/base-lyra/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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/aspect-ratio.json b/apps/v4/public/r/styles/base-lyra/aspect-ratio.json
index 2a470d4034..af630760ea 100644
--- a/apps/v4/public/r/styles/base-lyra/aspect-ratio.json
+++ b/apps/v4/public/r/styles/base-lyra/aspect-ratio.json
@@ -4,7 +4,7 @@
"files": [
{
"path": "registry/base-lyra/ui/aspect-ratio.tsx",
- "content": "import { cn } from \"@/registry/bases/base/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",
+ "content": "import { cn } from \"@/registry/base-lyra/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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/avatar-demo.json b/apps/v4/public/r/styles/base-lyra/avatar-demo.json
new file mode 100644
index 0000000000..f22bf2da00
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/avatar-demo.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "avatar-demo",
+ "title": "Avatar Demo",
+ "registryDependencies": [
+ "avatar"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/avatar-demo.tsx",
+ "content": "import {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@/registry/base-lyra/ui/avatar\"\n\nexport default function AvatarDemo() {\n return (\n
\n
\n \n CN \n \n
\n \n ER \n \n
\n
\n \n CN \n \n
\n \n LR \n \n
\n \n ER \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-lyra/avatar-example.json b/apps/v4/public/r/styles/base-lyra/avatar-example.json
index 0ee1fdc80d..5652ddbbc7 100644
--- a/apps/v4/public/r/styles/base-lyra/avatar-example.json
+++ b/apps/v4/public/r/styles/base-lyra/avatar-example.json
@@ -11,7 +11,7 @@
"files": [
{
"path": "registry/base-lyra/examples/avatar-example.tsx",
- "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/bases/base/components/example\"\nimport {\n Avatar,\n AvatarBadge,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarImage,\n} from \"@/registry/bases/base/ui/avatar\"\nimport { Button } from \"@/registry/bases/base/ui/button\"\nimport {\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from \"@/registry/bases/base/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",
+ "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport {\n Avatar,\n AvatarBadge,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarImage,\n} from \"@/registry/base-lyra/ui/avatar\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from \"@/registry/base-lyra/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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/avatar.json b/apps/v4/public/r/styles/base-lyra/avatar.json
index cf8e6378c2..871f9ea6ba 100644
--- a/apps/v4/public/r/styles/base-lyra/avatar.json
+++ b/apps/v4/public/r/styles/base-lyra/avatar.json
@@ -4,7 +4,7 @@
"files": [
{
"path": "registry/base-lyra/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/bases/base/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 ring-background relative flex shrink-0 items-center justify-center ring-2\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\"\n\nimport { cn } from \"@/registry/base-lyra/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 ring-background relative flex shrink-0 items-center justify-center ring-2\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n",
"type": "registry:ui"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/badge-demo.json b/apps/v4/public/r/styles/base-lyra/badge-demo.json
new file mode 100644
index 0000000000..53844ccf13
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/badge-demo.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "badge-demo",
+ "title": "Badge Demo",
+ "registryDependencies": [
+ "badge"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/badge-demo.tsx",
+ "content": "import { BadgeCheckIcon } from \"lucide-react\"\n\nimport { Badge } from \"@/registry/base-lyra/ui/badge\"\n\nexport default function BadgeDemo() {\n return (\n
\n
\n Badge \n Secondary \n Destructive \n Outline \n
\n
\n \n \n Verified\n \n \n 8\n \n \n 99\n \n \n 20+\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-lyra/badge-destructive.json b/apps/v4/public/r/styles/base-lyra/badge-destructive.json
new file mode 100644
index 0000000000..281bd844f1
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/badge-destructive.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "badge-destructive",
+ "title": "Badge Destructive",
+ "registryDependencies": [
+ "badge"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/badge-destructive.tsx",
+ "content": "import { Badge } from \"@/registry/base-lyra/ui/badge\"\n\nexport default function BadgeDestructive() {\n return
Destructive \n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/badge-example.json b/apps/v4/public/r/styles/base-lyra/badge-example.json
index 9667dc1755..d0ab241264 100644
--- a/apps/v4/public/r/styles/base-lyra/badge-example.json
+++ b/apps/v4/public/r/styles/base-lyra/badge-example.json
@@ -10,7 +10,7 @@
"files": [
{
"path": "registry/base-lyra/examples/badge-example.tsx",
- "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/bases/base/components/example\"\nimport { Badge } from \"@/registry/bases/base/ui/badge\"\nimport { Spinner } from \"@/registry/bases/base/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",
+ "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport { Badge } from \"@/registry/base-lyra/ui/badge\"\nimport { Spinner } from \"@/registry/base-lyra/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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/badge-outline.json b/apps/v4/public/r/styles/base-lyra/badge-outline.json
new file mode 100644
index 0000000000..f6ef43734e
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/badge-outline.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "badge-outline",
+ "title": "Badge Outline",
+ "registryDependencies": [
+ "badge"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/badge-outline.tsx",
+ "content": "import { Badge } from \"@/registry/base-lyra/ui/badge\"\n\nexport default function BadgeOutline() {\n return
Outline \n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/badge-secondary.json b/apps/v4/public/r/styles/base-lyra/badge-secondary.json
new file mode 100644
index 0000000000..9be71d6f43
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/badge-secondary.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "badge-secondary",
+ "title": "Badge Secondary",
+ "registryDependencies": [
+ "badge"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/badge-secondary.tsx",
+ "content": "import { Badge } from \"@/registry/base-lyra/ui/badge\"\n\nexport default function BadgeSecondary() {\n return
Secondary \n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/badge.json b/apps/v4/public/r/styles/base-lyra/badge.json
index 13c12502b8..b1af5c6a47 100644
--- a/apps/v4/public/r/styles/base-lyra/badge.json
+++ b/apps/v4/public/r/styles/base-lyra/badge.json
@@ -4,7 +4,7 @@
"files": [
{
"path": "registry/base-lyra/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/bases/base/lib/utils\"\n\nconst badgeVariants = cva(\n \"h-5 gap-1 rounded-none border border-transparent px-2 py-0.5 text-xs font-medium transition-all has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&>svg]:size-3! inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>svg]:pointer-events-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 transition-colors overflow-hidden group/badge\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary: \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive: \"bg-destructive/10 [a]:hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 text-destructive dark:bg-destructive/20\",\n outline: \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost: \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary 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({ className, variant })),\n },\n props\n ),\n render,\n state: {\n slot: \"badge\",\n variant,\n },\n })\n}\n\nexport { Badge, badgeVariants }\n",
+ "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-lyra/lib/utils\"\n\nconst badgeVariants = cva(\n \"h-5 gap-1 rounded-none border border-transparent px-2 py-0.5 text-xs font-medium transition-all has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&>svg]:size-3! inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>svg]:pointer-events-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 transition-colors overflow-hidden group/badge\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary: \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive: \"bg-destructive/10 [a]:hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 text-destructive dark:bg-destructive/20\",\n outline: \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost: \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary 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({ className, variant })),\n },\n props\n ),\n render,\n state: {\n slot: \"badge\",\n variant,\n },\n })\n}\n\nexport { Badge, badgeVariants }\n",
"type": "registry:ui"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/breadcrumb-demo.json b/apps/v4/public/r/styles/base-lyra/breadcrumb-demo.json
new file mode 100644
index 0000000000..ce2c93d24f
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/breadcrumb-demo.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "breadcrumb-demo",
+ "title": "Breadcrumb Demo",
+ "registryDependencies": [
+ "breadcrumb",
+ "dropdown-menu"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/breadcrumb-demo.tsx",
+ "content": "import Link from \"next/link\"\n\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/registry/base-lyra/ui/breadcrumb\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/registry/base-lyra/ui/dropdown-menu\"\n\nexport function BreadcrumbDemo() {\n return (\n \n \n \n }>Home\n \n \n \n \n \n \n Toggle menu \n \n \n Documentation \n Themes \n GitHub \n \n \n \n \n \n }>\n Components\n \n \n \n \n Breadcrumb \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-lyra/breadcrumb-dropdown.json b/apps/v4/public/r/styles/base-lyra/breadcrumb-dropdown.json
new file mode 100644
index 0000000000..997064b456
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/breadcrumb-dropdown.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "breadcrumb-dropdown",
+ "title": "Breadcrumb Dropdown",
+ "registryDependencies": [
+ "breadcrumb",
+ "dropdown-menu"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/breadcrumb-dropdown.tsx",
+ "content": "import Link from \"next/link\"\nimport { ChevronDownIcon, SlashIcon } from \"lucide-react\"\n\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/registry/base-lyra/ui/breadcrumb\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/registry/base-lyra/ui/dropdown-menu\"\n\nexport function BreadcrumbDropdown() {\n return (\n \n \n \n }>Home\n \n \n \n \n \n \n \n Components\n \n \n \n Documentation \n Themes \n GitHub \n \n \n \n \n \n \n \n Breadcrumb \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-lyra/breadcrumb-ellipsis.json b/apps/v4/public/r/styles/base-lyra/breadcrumb-ellipsis.json
new file mode 100644
index 0000000000..5886894467
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/breadcrumb-ellipsis.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "breadcrumb-ellipsis",
+ "title": "Breadcrumb Ellipsis",
+ "registryDependencies": [
+ "breadcrumb"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/breadcrumb-ellipsis.tsx",
+ "content": "import Link from \"next/link\"\n\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/registry/base-lyra/ui/breadcrumb\"\n\nexport function BreadcrumbEllipsisDemo() {\n return (\n \n \n \n }>Home\n \n \n \n \n \n \n \n }>\n Components\n \n \n \n \n Breadcrumb \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-lyra/breadcrumb-example.json b/apps/v4/public/r/styles/base-lyra/breadcrumb-example.json
index a35d5e5395..00b7c8c490 100644
--- a/apps/v4/public/r/styles/base-lyra/breadcrumb-example.json
+++ b/apps/v4/public/r/styles/base-lyra/breadcrumb-example.json
@@ -10,7 +10,7 @@
"files": [
{
"path": "registry/base-lyra/examples/breadcrumb-example.tsx",
- "content": "import Link from \"next/link\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/bases/base/components/example\"\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/registry/bases/base/ui/breadcrumb\"\nimport { Button } from \"@/registry/bases/base/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/registry/bases/base/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",
+ "content": "import Link from \"next/link\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/registry/base-lyra/ui/breadcrumb\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/registry/base-lyra/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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/breadcrumb-link.json b/apps/v4/public/r/styles/base-lyra/breadcrumb-link.json
new file mode 100644
index 0000000000..312f0f878b
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/breadcrumb-link.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "breadcrumb-link",
+ "title": "Breadcrumb Link",
+ "registryDependencies": [
+ "breadcrumb"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/breadcrumb-link.tsx",
+ "content": "import Link from \"next/link\"\n\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/registry/base-lyra/ui/breadcrumb\"\n\nexport function BreadcrumbLinkDemo() {\n return (\n \n \n \n }>Home\n \n \n \n }>\n Components\n \n \n \n \n Breadcrumb \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-lyra/breadcrumb-responsive.json b/apps/v4/public/r/styles/base-lyra/breadcrumb-responsive.json
new file mode 100644
index 0000000000..b421002499
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/breadcrumb-responsive.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "breadcrumb-responsive",
+ "title": "Breadcrumb Responsive",
+ "registryDependencies": [
+ "breadcrumb",
+ "button",
+ "drawer",
+ "dropdown-menu"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/breadcrumb-responsive.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport Link from \"next/link\"\n\nimport { useMediaQuery } from \"@/hooks/use-media-query\"\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/registry/base-lyra/ui/breadcrumb\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-lyra/ui/drawer\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/registry/base-lyra/ui/dropdown-menu\"\n\nconst items = [\n { href: \"#\", label: \"Home\" },\n { href: \"#\", label: \"Documentation\" },\n { href: \"#\", label: \"Building Your Application\" },\n { href: \"#\", label: \"Data Fetching\" },\n { label: \"Caching and Revalidating\" },\n]\n\nconst ITEMS_TO_DISPLAY = 3\n\nexport function BreadcrumbResponsive() {\n const [open, setOpen] = React.useState(false)\n const isDesktop = useMediaQuery(\"(min-width: 768px)\")\n\n return (\n \n \n \n }>\n {items[0].label}\n \n \n \n {items.length > ITEMS_TO_DISPLAY ? (\n <>\n \n {isDesktop ? (\n \n \n \n \n \n {items.slice(1, -2).map((item, index) => (\n \n \n {item.label}\n \n \n ))}\n \n \n ) : (\n \n \n \n \n \n \n Navigate to \n \n Select a page to navigate to.\n \n \n \n {items.slice(1, -2).map((item, index) => (\n \n {item.label}\n \n ))}\n
\n \n \n Close \n \n \n \n \n )}\n \n \n >\n ) : null}\n {items.slice(-ITEMS_TO_DISPLAY + 1).map((item, index) => (\n \n {item.href ? (\n <>\n }\n className=\"max-w-20 truncate md:max-w-none\"\n >\n {item.label}\n \n \n >\n ) : (\n \n {item.label}\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-lyra/breadcrumb-separator.json b/apps/v4/public/r/styles/base-lyra/breadcrumb-separator.json
new file mode 100644
index 0000000000..0037f2bb82
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/breadcrumb-separator.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "breadcrumb-separator",
+ "title": "Breadcrumb Separator",
+ "registryDependencies": [
+ "breadcrumb"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/breadcrumb-separator.tsx",
+ "content": "import Link from \"next/link\"\nimport { SlashIcon } from \"lucide-react\"\n\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@/registry/base-lyra/ui/breadcrumb\"\n\nexport function BreadcrumbSeparatorDemo() {\n return (\n \n \n \n }>Home\n \n \n \n \n \n }>\n Components\n \n \n \n \n \n \n Breadcrumb \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-lyra/breadcrumb.json b/apps/v4/public/r/styles/base-lyra/breadcrumb.json
index d903abfeba..859dafa182 100644
--- a/apps/v4/public/r/styles/base-lyra/breadcrumb.json
+++ b/apps/v4/public/r/styles/base-lyra/breadcrumb.json
@@ -4,7 +4,7 @@
"files": [
{
"path": "registry/base-lyra/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/bases/base/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(\"hover:text-foreground transition-colors\", 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 flex items-center justify-center\",\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",
+ "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-lyra/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(\"hover:text-foreground transition-colors\", 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 flex items-center justify-center\",\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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/button-as-child.json b/apps/v4/public/r/styles/base-lyra/button-as-child.json
new file mode 100644
index 0000000000..b4d8746f5b
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-as-child.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-as-child",
+ "title": "Button As Child",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-as-child.tsx",
+ "content": "import Link from \"next/link\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonAsChild() {\n return (\n }>Login\n )\n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/button-default.json b/apps/v4/public/r/styles/base-lyra/button-default.json
new file mode 100644
index 0000000000..9f1643174b
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-default.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-default",
+ "title": "Button Default",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-default.tsx",
+ "content": "import { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonDefault() {\n return Button \n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/button-demo.json b/apps/v4/public/r/styles/base-lyra/button-demo.json
new file mode 100644
index 0000000000..918a1d6e4e
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-demo.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-demo",
+ "title": "Button Demo",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-demo.tsx",
+ "content": "import { ArrowUpIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonDemo() {\n return (\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-lyra/button-destructive.json b/apps/v4/public/r/styles/base-lyra/button-destructive.json
new file mode 100644
index 0000000000..2f1e067fb3
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-destructive.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-destructive",
+ "title": "Button Destructive",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-destructive.tsx",
+ "content": "import { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonDestructive() {\n return Destructive \n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/button-example.json b/apps/v4/public/r/styles/base-lyra/button-example.json
index 50e7773318..e77e1ce69a 100644
--- a/apps/v4/public/r/styles/base-lyra/button-example.json
+++ b/apps/v4/public/r/styles/base-lyra/button-example.json
@@ -9,7 +9,7 @@
"files": [
{
"path": "registry/base-lyra/examples/button-example.tsx",
- "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/bases/base/components/example\"\nimport { Button } from \"@/registry/bases/base/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
} nativeButton={false}>\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",
+ "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport { Button } from \"@/registry/base-lyra/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
} nativeButton={false}>\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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/button-ghost.json b/apps/v4/public/r/styles/base-lyra/button-ghost.json
new file mode 100644
index 0000000000..1ba0d66fbf
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-ghost.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-ghost",
+ "title": "Button Ghost",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-ghost.tsx",
+ "content": "import { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonGhost() {\n return Ghost \n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/button-group-demo.json b/apps/v4/public/r/styles/base-lyra/button-group-demo.json
new file mode 100644
index 0000000000..23f0d016db
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-demo.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-demo",
+ "title": "Button Group Demo",
+ "registryDependencies": [
+ "button",
+ "button-group",
+ "dropdown-menu"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-demo.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n ArchiveIcon,\n ArrowLeftIcon,\n CalendarPlusIcon,\n ClockIcon,\n ListFilterIcon,\n MailCheckIcon,\n MoreHorizontalIcon,\n TagIcon,\n Trash2Icon,\n} from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { ButtonGroup } from \"@/registry/base-lyra/ui/button-group\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"@/registry/base-lyra/ui/dropdown-menu\"\n\nexport default function ButtonGroupDemo() {\n const [label, setLabel] = React.useState(\"personal\")\n\n return (\n \n \n \n \n \n \n \n Archive \n Report \n \n \n Snooze \n \n \n \n \n \n \n \n \n \n \n Mark as Read\n \n \n \n Archive\n \n \n \n \n \n \n Snooze\n \n \n \n Add to Calendar\n \n \n \n Add to List\n \n \n \n \n Label As...\n \n \n \n \n Personal\n \n \n Work\n \n \n Other\n \n \n \n \n \n \n \n \n \n Trash\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-lyra/button-group-dropdown.json b/apps/v4/public/r/styles/base-lyra/button-group-dropdown.json
new file mode 100644
index 0000000000..70d8799e0d
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-dropdown.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-dropdown",
+ "title": "Button Group Dropdown",
+ "registryDependencies": [
+ "button",
+ "button-group",
+ "dropdown-menu"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-dropdown.tsx",
+ "content": "\"use client\"\n\nimport {\n AlertTriangleIcon,\n CheckIcon,\n ChevronDownIcon,\n CopyIcon,\n ShareIcon,\n TrashIcon,\n UserRoundXIcon,\n VolumeOffIcon,\n} from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { ButtonGroup } from \"@/registry/base-lyra/ui/button-group\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-lyra/ui/dropdown-menu\"\n\nexport default function ButtonGroupDropdown() {\n return (\n \n Follow \n \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",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/button-group-example.json b/apps/v4/public/r/styles/base-lyra/button-group-example.json
index 2e4ad5e00a..9257f35dd8 100644
--- a/apps/v4/public/r/styles/base-lyra/button-group-example.json
+++ b/apps/v4/public/r/styles/base-lyra/button-group-example.json
@@ -18,7 +18,7 @@
"files": [
{
"path": "registry/base-lyra/examples/button-group-example.tsx",
- "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/bases/base/components/example\"\nimport { Button } from \"@/registry/bases/base/ui/button\"\nimport {\n ButtonGroup,\n ButtonGroupText,\n} from \"@/registry/bases/base/ui/button-group\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/bases/base/ui/dropdown-menu\"\nimport { Field, FieldGroup } from \"@/registry/bases/base/ui/field\"\nimport { Input } from \"@/registry/bases/base/ui/input\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/registry/bases/base/ui/input-group\"\nimport { Label } from \"@/registry/bases/base/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/bases/base/ui/select\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/registry/bases/base/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",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n ButtonGroup,\n ButtonGroupText,\n} from \"@/registry/base-lyra/ui/button-group\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-lyra/ui/dropdown-menu\"\nimport { Field, FieldGroup } from \"@/registry/base-lyra/ui/field\"\nimport { Input } from \"@/registry/base-lyra/ui/input\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/registry/base-lyra/ui/input-group\"\nimport { Label } from \"@/registry/base-lyra/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/base-lyra/ui/select\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/registry/base-lyra/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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/button-group-input-group.json b/apps/v4/public/r/styles/base-lyra/button-group-input-group.json
new file mode 100644
index 0000000000..c195c45e8d
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-input-group.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-input-group",
+ "title": "Button Group Input Group",
+ "registryDependencies": [
+ "button",
+ "button-group",
+ "input-group",
+ "tooltip"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-input-group.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { AudioLinesIcon, PlusIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { ButtonGroup } from \"@/registry/base-lyra/ui/button-group\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupInput,\n} from \"@/registry/base-lyra/ui/input-group\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/registry/base-lyra/ui/tooltip\"\n\nexport default function ButtonGroupInputGroup() {\n const [voiceEnabled, setVoiceEnabled] = React.useState(false)\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n setVoiceEnabled(!voiceEnabled)}\n size=\"icon-xs\"\n data-active={voiceEnabled}\n className=\"data-[active=true]:bg-orange-100 data-[active=true]:text-orange-700 dark:data-[active=true]:bg-orange-800 dark:data-[active=true]:text-orange-100\"\n aria-pressed={voiceEnabled}\n >\n \n \n \n Voice Mode \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-lyra/button-group-input.json b/apps/v4/public/r/styles/base-lyra/button-group-input.json
new file mode 100644
index 0000000000..d6371de5cf
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-input.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-input",
+ "title": "Button Group Input",
+ "registryDependencies": [
+ "button",
+ "button-group",
+ "input"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-input.tsx",
+ "content": "import { SearchIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { ButtonGroup } from \"@/registry/base-lyra/ui/button-group\"\nimport { Input } from \"@/registry/base-lyra/ui/input\"\n\nexport default function ButtonGroupInput() {\n return (\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-lyra/button-group-nested.json b/apps/v4/public/r/styles/base-lyra/button-group-nested.json
new file mode 100644
index 0000000000..0aad399280
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-nested.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-nested",
+ "title": "Button Group Nested",
+ "registryDependencies": [
+ "button",
+ "button-group"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-nested.tsx",
+ "content": "\"use client\"\n\nimport { ArrowLeftIcon, ArrowRightIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { ButtonGroup } from \"@/registry/base-lyra/ui/button-group\"\n\nexport default function ButtonGroupNested() {\n return (\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",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/button-group-orientation.json b/apps/v4/public/r/styles/base-lyra/button-group-orientation.json
new file mode 100644
index 0000000000..e3611c33d6
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-orientation.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-orientation",
+ "title": "Button Group Orientation",
+ "registryDependencies": [
+ "button",
+ "button-group"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-orientation.tsx",
+ "content": "import { MinusIcon, PlusIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { ButtonGroup } from \"@/registry/base-lyra/ui/button-group\"\n\nexport default function ButtonGroupOrientation() {\n return (\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-lyra/button-group-popover.json b/apps/v4/public/r/styles/base-lyra/button-group-popover.json
new file mode 100644
index 0000000000..70d88824e1
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-popover.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-popover",
+ "title": "Button Group Popover",
+ "registryDependencies": [
+ "button",
+ "button-group",
+ "popover",
+ "separator",
+ "textarea"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-popover.tsx",
+ "content": "import { BotIcon, ChevronDownIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { ButtonGroup } from \"@/registry/base-lyra/ui/button-group\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/base-lyra/ui/popover\"\nimport { Separator } from \"@/registry/base-lyra/ui/separator\"\nimport { Textarea } from \"@/registry/base-lyra/ui/textarea\"\n\nexport default function ButtonGroupPopover() {\n return (\n \n \n Copilot\n \n \n \n \n \n \n \n \n \n \n \n
\n
Start a new task with Copilot
\n
\n Describe your task in natural language. Copilot will work in the\n background and open a pull request for your review.\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-lyra/button-group-select.json b/apps/v4/public/r/styles/base-lyra/button-group-select.json
new file mode 100644
index 0000000000..d8b91c54fc
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-select.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-select",
+ "title": "Button Group Select",
+ "registryDependencies": [
+ "button",
+ "button-group",
+ "input",
+ "select"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-select.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { ArrowRightIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { ButtonGroup } from \"@/registry/base-lyra/ui/button-group\"\nimport { Input } from \"@/registry/base-lyra/ui/input\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n} from \"@/registry/base-lyra/ui/select\"\n\nconst CURRENCIES = [\n {\n value: \"$\",\n label: \"US Dollar\",\n },\n {\n value: \"€\",\n label: \"Euro\",\n },\n {\n value: \"£\",\n label: \"British Pound\",\n },\n]\n\nexport default function ButtonGroupSelect() {\n const [currency, setCurrency] = React.useState(\"$\")\n\n return (\n \n \n \n {currency} \n \n {CURRENCIES.map((currency) => (\n \n {currency.value}{\" \"}\n {currency.label} \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-lyra/button-group-separator.json b/apps/v4/public/r/styles/base-lyra/button-group-separator.json
new file mode 100644
index 0000000000..5f3141eea3
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-separator.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-separator",
+ "title": "Button Group Separator",
+ "registryDependencies": [
+ "button",
+ "button-group"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-separator.tsx",
+ "content": "import { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n ButtonGroup,\n ButtonGroupSeparator,\n} from \"@/registry/base-lyra/ui/button-group\"\n\nexport default function ButtonGroupSeparatorDemo() {\n return (\n \n \n Copy\n \n \n \n Paste\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-lyra/button-group-size.json b/apps/v4/public/r/styles/base-lyra/button-group-size.json
new file mode 100644
index 0000000000..936a2ed36e
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-size.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-size",
+ "title": "Button Group Size",
+ "registryDependencies": [
+ "button",
+ "button-group"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-size.tsx",
+ "content": "import { PlusIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { ButtonGroup } from \"@/registry/base-lyra/ui/button-group\"\n\nexport default function ButtonGroupSize() {\n return (\n \n
\n \n Small\n \n \n Button\n \n \n Group\n \n \n \n \n \n
\n Default \n Button \n Group \n \n \n \n \n
\n \n Large\n \n \n Button\n \n \n Group\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-lyra/button-group-split.json b/apps/v4/public/r/styles/base-lyra/button-group-split.json
new file mode 100644
index 0000000000..0c950a31bc
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-group-split.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-group-split",
+ "title": "Button Group Split",
+ "registryDependencies": [
+ "button",
+ "button-group"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-group-split.tsx",
+ "content": "import { IconPlus } from \"@tabler/icons-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n ButtonGroup,\n ButtonGroupSeparator,\n} from \"@/registry/base-lyra/ui/button-group\"\n\nexport default function ButtonGroupSplit() {\n return (\n \n Button \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-lyra/button-group.json b/apps/v4/public/r/styles/base-lyra/button-group.json
index a7f0751143..d27b4b0c5b 100644
--- a/apps/v4/public/r/styles/base-lyra/button-group.json
+++ b/apps/v4/public/r/styles/base-lyra/button-group.json
@@ -7,7 +7,7 @@
"files": [
{
"path": "registry/base-lyra/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/bases/base/lib/utils\"\nimport { Separator } from \"@/registry/bases/base/ui/separator\"\n\nconst buttonGroupVariants = cva(\n \"rounded-none has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-none flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n {\n variants: {\n orientation: {\n horizontal:\n \"[&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0 [&>[data-slot]]:rounded-r-none\",\n vertical:\n \"flex-col [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0 [&>[data-slot]]:rounded-b-none\",\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 \"bg-muted gap-2 rounded-none border px-2.5 text-xs font-medium [&_svg:not([class*='size-'])]:size-4 flex items-center [&_svg]:pointer-events-none\",\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",
+ "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-lyra/lib/utils\"\nimport { Separator } from \"@/registry/base-lyra/ui/separator\"\n\nconst buttonGroupVariants = cva(\n \"rounded-none has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-none flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n {\n variants: {\n orientation: {\n horizontal:\n \"[&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0 [&>[data-slot]]:rounded-r-none\",\n vertical:\n \"flex-col [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0 [&>[data-slot]]:rounded-b-none\",\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 \"bg-muted gap-2 rounded-none border px-2.5 text-xs font-medium [&_svg:not([class*='size-'])]:size-4 flex items-center [&_svg]:pointer-events-none\",\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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/button-icon.json b/apps/v4/public/r/styles/base-lyra/button-icon.json
new file mode 100644
index 0000000000..a0c74e45de
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-icon.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-icon",
+ "title": "Button Icon",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-icon.tsx",
+ "content": "import { CircleFadingArrowUpIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonIcon() {\n return (\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-lyra/button-link.json b/apps/v4/public/r/styles/base-lyra/button-link.json
new file mode 100644
index 0000000000..03ba6f3093
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-link.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-link",
+ "title": "Button Link",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-link.tsx",
+ "content": "import { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonLink() {\n return Link \n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/button-loading.json b/apps/v4/public/r/styles/base-lyra/button-loading.json
new file mode 100644
index 0000000000..a681891779
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-loading.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-loading",
+ "title": "Button Loading",
+ "registryDependencies": [
+ "button",
+ "spinner"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-loading.tsx",
+ "content": "import { Button } from \"@/registry/base-lyra/ui/button\"\nimport { Spinner } from \"@/registry/base-lyra/ui/spinner\"\n\nexport default function ButtonLoading() {\n return (\n \n \n Submit\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-lyra/button-outline.json b/apps/v4/public/r/styles/base-lyra/button-outline.json
new file mode 100644
index 0000000000..60eee12783
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-outline.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-outline",
+ "title": "Button Outline",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-outline.tsx",
+ "content": "import { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonOutline() {\n return Outline \n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/button-rounded.json b/apps/v4/public/r/styles/base-lyra/button-rounded.json
new file mode 100644
index 0000000000..4aafcfe6a6
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-rounded.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-rounded",
+ "title": "Button Rounded",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-rounded.tsx",
+ "content": "import { ArrowUpIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonRounded() {\n return (\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-lyra/button-secondary.json b/apps/v4/public/r/styles/base-lyra/button-secondary.json
new file mode 100644
index 0000000000..be23dc747d
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-secondary.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-secondary",
+ "title": "Button Secondary",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-secondary.tsx",
+ "content": "import { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonSecondary() {\n return Secondary \n}\n",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/button-size.json b/apps/v4/public/r/styles/base-lyra/button-size.json
new file mode 100644
index 0000000000..e8a6bdf51d
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-size.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-size",
+ "title": "Button Size",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-size.tsx",
+ "content": "import { ArrowUpRightIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonSize() {\n return (\n \n
\n
\n Small\n \n
\n \n \n
\n
\n
\n
\n Large\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-lyra/button-with-icon.json b/apps/v4/public/r/styles/base-lyra/button-with-icon.json
new file mode 100644
index 0000000000..4a6e388e19
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/button-with-icon.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "button-with-icon",
+ "title": "Button With Icon",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/button-with-icon.tsx",
+ "content": "import { IconGitBranch } from \"@tabler/icons-react\"\n\nimport { Button } from \"@/registry/base-lyra/ui/button\"\n\nexport default function ButtonWithIcon() {\n return (\n \n New Branch\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-lyra/button.json b/apps/v4/public/r/styles/base-lyra/button.json
index 960ea0aaf0..400acc6784 100644
--- a/apps/v4/public/r/styles/base-lyra/button.json
+++ b/apps/v4/public/r/styles/base-lyra/button.json
@@ -4,7 +4,7 @@
"files": [
{
"path": "registry/base-lyra/ui/button.tsx",
- "content": "\"use client\"\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/registry/bases/base/lib/utils\"\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-none border border-transparent bg-clip-padding text-xs font-medium focus-visible:ring-1 aria-invalid:ring-1 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n outline: \"border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost: \"hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n destructive: \"bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-none px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-none px-2.5 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-8\",\n \"icon-xs\": \"size-6 rounded-none [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-7 rounded-none\",\n \"icon-lg\": \"size-9\",\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",
+ "content": "\"use client\"\n\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/registry/base-lyra/lib/utils\"\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-none border border-transparent bg-clip-padding text-xs font-medium focus-visible:ring-1 aria-invalid:ring-1 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n outline: \"border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost: \"hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n destructive: \"bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-none px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-none px-2.5 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-8\",\n \"icon-xs\": \"size-6 rounded-none [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-7 rounded-none\",\n \"icon-lg\": \"size-9\",\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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/calendar-demo.json b/apps/v4/public/r/styles/base-lyra/calendar-demo.json
new file mode 100644
index 0000000000..8f89099cc4
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/calendar-demo.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "calendar-demo",
+ "title": "Calendar Demo",
+ "registryDependencies": [
+ "calendar"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/calendar-demo.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Calendar } from \"@/registry/base-lyra/ui/calendar\"\n\nexport default function CalendarDemo() {\n const [date, setDate] = React.useState(new Date())\n\n return (\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-lyra/calendar-example.json b/apps/v4/public/r/styles/base-lyra/calendar-example.json
index ccab7c5e65..ae9c9ee23d 100644
--- a/apps/v4/public/r/styles/base-lyra/calendar-example.json
+++ b/apps/v4/public/r/styles/base-lyra/calendar-example.json
@@ -15,7 +15,7 @@
"files": [
{
"path": "registry/base-lyra/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/bases/base/components/example\"\nimport { Button } from \"@/registry/bases/base/ui/button\"\nimport { Calendar, CalendarDayButton } from \"@/registry/bases/base/ui/calendar\"\nimport { Card, CardContent, CardFooter } from \"@/registry/bases/base/ui/card\"\nimport { Field, FieldGroup, FieldLabel } from \"@/registry/bases/base/ui/field\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/registry/bases/base/ui/input-group\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/bases/base/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\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 \n {date ? format(date, \"PPP\") : Pick a date }\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",
+ "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-lyra/components/example\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { Calendar, CalendarDayButton } from \"@/registry/base-lyra/ui/calendar\"\nimport { Card, CardContent, CardFooter } from \"@/registry/base-lyra/ui/card\"\nimport { Field, FieldGroup, FieldLabel } from \"@/registry/base-lyra/ui/field\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/registry/base-lyra/ui/input-group\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/base-lyra/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\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 \n {date ? format(date, \"PPP\") : Pick a date }\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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/calendar-hijri.json b/apps/v4/public/r/styles/base-lyra/calendar-hijri.json
new file mode 100644
index 0000000000..01b0f80818
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/calendar-hijri.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "calendar-hijri",
+ "title": "Calendar Hijri",
+ "registryDependencies": [
+ "button"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/calendar-hijri.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"lucide-react\"\nimport { getDefaultClassNames, type DayButton } from \"react-day-picker\"\nimport { DayPicker } from \"react-day-picker/persian\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button, buttonVariants } from \"@/registry/base-lyra/ui/button\"\n\nexport default function CalendarHijri() {\n const [date, setDate] = React.useState(\n new Date(2025, 5, 12)\n )\n\n return (\n \n )\n}\n\n// ----------------------------------------------------------------------------\n// The code below is for this example only.\n// For your own calendar, you would edit the calendar.tsx component directly.\n// ----------------------------------------------------------------------------\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\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 formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"flex gap-4 flex-col md:flex-row relative\",\n defaultClassNames.months\n ),\n month: cn(\"flex flex-col w-full gap-4\", defaultClassNames.month),\n nav: cn(\n \"flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\"absolute inset-0 opacity-0\", defaultClassNames.dropdown),\n caption_label: cn(\n \"select-none font-medium\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"flex w-full mt-2\", defaultClassNames.week),\n week_number_header: cn(\n \"select-none w-(--cell-size)\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] select-none text-muted-foreground\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"rounded-l-md bg-accent\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\"rounded-r-md bg-accent\", defaultClassNames.range_end),\n today: cn(\n \"bg-accent text-accent-foreground rounded-md 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: CalendarDayButton,\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 ...props\n}: React.ComponentProps) {\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",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/calendar.json b/apps/v4/public/r/styles/base-lyra/calendar.json
index 5de2511806..82352cc293 100644
--- a/apps/v4/public/r/styles/base-lyra/calendar.json
+++ b/apps/v4/public/r/styles/base-lyra/calendar.json
@@ -11,7 +11,7 @@
"files": [
{
"path": "registry/base-lyra/ui/calendar.tsx",
- "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n} from \"react-day-picker\"\n\nimport { cn } from \"@/registry/bases/base/lib/utils\"\nimport { Button, buttonVariants } from \"@/registry/bases/base/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 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 formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"flex gap-4 flex-col md:flex-row relative\",\n defaultClassNames.months\n ),\n month: cn(\"flex flex-col w-full gap-4\", defaultClassNames.month),\n nav: cn(\n \"flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative cn-calendar-dropdown-root rounded-(--cell-radius)\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute bg-popover inset-0 opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"select-none font-medium\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"cn-calendar-caption-label rounded-(--cell-radius) flex items-center gap-1 text-sm [&>svg]:text-muted-foreground [&>svg]:size-3.5\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"text-muted-foreground rounded-(--cell-radius) flex-1 font-normal text-[0.8rem] select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"flex w-full mt-2\", defaultClassNames.week),\n week_number_header: cn(\n \"select-none w-(--cell-size)\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] select-none text-muted-foreground\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"relative w-full rounded-(--cell-radius) h-full p-0 text-center [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius) group/day aspect-square select-none\",\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 \"rounded-l-(--cell-radius) bg-muted elative after:bg-muted after:absolute after:inset-y-0 after:w-4 after:right-0 -z-0 isolate\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\n \"rounded-r-(--cell-radius) bg-muted relative after:bg-muted after:absolute after:inset-y-0 after:w-4 after:left-0 -z-0 isolate\",\n defaultClassNames.range_end\n ),\n today: cn(\n \"bg-muted text-foreground rounded-(--cell-radius) 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: CalendarDayButton,\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 ...props\n}: React.ComponentProps) {\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",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n} from \"react-day-picker\"\n\nimport { cn } from \"@/registry/base-lyra/lib/utils\"\nimport { Button, buttonVariants } from \"@/registry/base-lyra/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 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 formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"flex gap-4 flex-col md:flex-row relative\",\n defaultClassNames.months\n ),\n month: cn(\"flex flex-col w-full gap-4\", defaultClassNames.month),\n nav: cn(\n \"flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative cn-calendar-dropdown-root rounded-(--cell-radius)\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute bg-popover inset-0 opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"select-none font-medium\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"cn-calendar-caption-label rounded-(--cell-radius) flex items-center gap-1 text-sm [&>svg]:text-muted-foreground [&>svg]:size-3.5\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"text-muted-foreground rounded-(--cell-radius) flex-1 font-normal text-[0.8rem] select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"flex w-full mt-2\", defaultClassNames.week),\n week_number_header: cn(\n \"select-none w-(--cell-size)\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] select-none text-muted-foreground\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"relative w-full rounded-(--cell-radius) h-full p-0 text-center [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius) group/day aspect-square select-none\",\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 \"rounded-l-(--cell-radius) bg-muted elative after:bg-muted after:absolute after:inset-y-0 after:w-4 after:right-0 -z-0 isolate\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\n \"rounded-r-(--cell-radius) bg-muted relative after:bg-muted after:absolute after:inset-y-0 after:w-4 after:left-0 -z-0 isolate\",\n defaultClassNames.range_end\n ),\n today: cn(\n \"bg-muted text-foreground rounded-(--cell-radius) 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: CalendarDayButton,\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 ...props\n}: React.ComponentProps) {\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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/card-demo.json b/apps/v4/public/r/styles/base-lyra/card-demo.json
new file mode 100644
index 0000000000..160f836f5a
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/card-demo.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "card-demo",
+ "title": "Card Demo",
+ "registryDependencies": [
+ "button",
+ "card",
+ "input",
+ "label"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/card-demo.tsx",
+ "content": "import { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/registry/base-lyra/ui/card\"\nimport { Input } from \"@/registry/base-lyra/ui/input\"\nimport { Label } from \"@/registry/base-lyra/ui/label\"\n\nexport default function CardDemo() {\n return (\n \n \n Login to your account \n \n Enter your email below to login to your account\n \n \n Sign Up \n \n \n \n \n \n \n \n Login\n \n \n Login with Google\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-lyra/card-example.json b/apps/v4/public/r/styles/base-lyra/card-example.json
index c2251de459..865f804679 100644
--- a/apps/v4/public/r/styles/base-lyra/card-example.json
+++ b/apps/v4/public/r/styles/base-lyra/card-example.json
@@ -13,7 +13,7 @@
"files": [
{
"path": "registry/base-lyra/examples/card-example.tsx",
- "content": "import Image from \"next/image\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/bases/base/components/example\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarImage,\n} from \"@/registry/bases/base/ui/avatar\"\nimport { Button } from \"@/registry/bases/base/ui/button\"\nimport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/registry/bases/base/ui/card\"\nimport { Field, FieldGroup, FieldLabel } from \"@/registry/bases/base/ui/field\"\nimport { Input } from \"@/registry/bases/base/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",
+ "content": "import Image from \"next/image\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarImage,\n} from \"@/registry/base-lyra/ui/avatar\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/registry/base-lyra/ui/card\"\nimport { Field, FieldGroup, FieldLabel } from \"@/registry/base-lyra/ui/field\"\nimport { Input } from \"@/registry/base-lyra/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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/card.json b/apps/v4/public/r/styles/base-lyra/card.json
index eceacd82b3..75bc7325c5 100644
--- a/apps/v4/public/r/styles/base-lyra/card.json
+++ b/apps/v4/public/r/styles/base-lyra/card.json
@@ -4,7 +4,7 @@
"files": [
{
"path": "registry/base-lyra/ui/card.tsx",
- "content": "import * as React from \"react\"\n\nimport { cn } from \"@/registry/bases/base/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-2 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-none *:[img:last-child]:rounded-none group/card flex flex-col\", className)}\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",
+ "content": "import * as React from \"react\"\n\nimport { cn } from \"@/registry/base-lyra/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-2 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-none *:[img:last-child]:rounded-none group/card flex flex-col\", className)}\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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/carousel-api.json b/apps/v4/public/r/styles/base-lyra/carousel-api.json
new file mode 100644
index 0000000000..60e41e5d15
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/carousel-api.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "carousel-api",
+ "title": "Carousel Api",
+ "registryDependencies": [
+ "card",
+ "carousel"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/carousel-api.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Card, CardContent } from \"@/registry/base-lyra/ui/card\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n type CarouselApi,\n} from \"@/registry/base-lyra/ui/carousel\"\n\nexport default function CarouselDApiDemo() {\n const [api, setApi] = React.useState
()\n const [current, setCurrent] = React.useState(0)\n const [count, setCount] = React.useState(0)\n\n React.useEffect(() => {\n if (!api) {\n return\n }\n\n setCount(api.scrollSnapList().length)\n setCurrent(api.selectedScrollSnap() + 1)\n\n api.on(\"select\", () => {\n setCurrent(api.selectedScrollSnap() + 1)\n })\n }, [api])\n\n return (\n \n
\n \n {Array.from({ length: 5 }).map((_, index) => (\n \n \n \n {index + 1} \n \n \n \n ))}\n \n \n \n \n
\n Slide {current} of {count}\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-lyra/carousel-demo.json b/apps/v4/public/r/styles/base-lyra/carousel-demo.json
new file mode 100644
index 0000000000..ab8fc7bb98
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/carousel-demo.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "carousel-demo",
+ "title": "Carousel Demo",
+ "registryDependencies": [
+ "card",
+ "carousel"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/carousel-demo.tsx",
+ "content": "import * as React from \"react\"\n\nimport { Card, CardContent } from \"@/registry/base-lyra/ui/card\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/registry/base-lyra/ui/carousel\"\n\nexport default function CarouselDemo() {\n return (\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",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/carousel-example.json b/apps/v4/public/r/styles/base-lyra/carousel-example.json
index 42fcaecb9c..d8baf97dfa 100644
--- a/apps/v4/public/r/styles/base-lyra/carousel-example.json
+++ b/apps/v4/public/r/styles/base-lyra/carousel-example.json
@@ -10,7 +10,7 @@
"files": [
{
"path": "registry/base-lyra/examples/carousel-example.tsx",
- "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/bases/base/components/example\"\nimport { Card, CardContent } from \"@/registry/bases/base/ui/card\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/registry/bases/base/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",
+ "content": "import {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport { Card, CardContent } from \"@/registry/base-lyra/ui/card\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/registry/base-lyra/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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/carousel-orientation.json b/apps/v4/public/r/styles/base-lyra/carousel-orientation.json
new file mode 100644
index 0000000000..0e941d3cc3
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/carousel-orientation.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "carousel-orientation",
+ "title": "Carousel Orientation",
+ "registryDependencies": [
+ "card",
+ "carousel"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/carousel-orientation.tsx",
+ "content": "import * as React from \"react\"\n\nimport { Card, CardContent } from \"@/registry/base-lyra/ui/card\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/registry/base-lyra/ui/carousel\"\n\nexport default function CarouselOrientation() {\n return (\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",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/carousel-plugin.json b/apps/v4/public/r/styles/base-lyra/carousel-plugin.json
new file mode 100644
index 0000000000..40efb1ac21
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/carousel-plugin.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "carousel-plugin",
+ "title": "Carousel Plugin",
+ "registryDependencies": [
+ "card",
+ "carousel"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/carousel-plugin.tsx",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport Autoplay from \"embla-carousel-autoplay\"\n\nimport { Card, CardContent } from \"@/registry/base-lyra/ui/card\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/registry/base-lyra/ui/carousel\"\n\nexport default function CarouselPlugin() {\n const plugin = React.useRef(\n Autoplay({ delay: 2000, stopOnInteraction: true })\n )\n\n return (\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",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/carousel-size.json b/apps/v4/public/r/styles/base-lyra/carousel-size.json
new file mode 100644
index 0000000000..db826d436f
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/carousel-size.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "carousel-size",
+ "title": "Carousel Size",
+ "registryDependencies": [
+ "card",
+ "carousel"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/carousel-size.tsx",
+ "content": "import * as React from \"react\"\n\nimport { Card, CardContent } from \"@/registry/base-lyra/ui/card\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/registry/base-lyra/ui/carousel\"\n\nexport default function CarouselSize() {\n return (\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",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/carousel-spacing.json b/apps/v4/public/r/styles/base-lyra/carousel-spacing.json
new file mode 100644
index 0000000000..56da2b1ced
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/carousel-spacing.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "carousel-spacing",
+ "title": "Carousel Spacing",
+ "registryDependencies": [
+ "card",
+ "carousel"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/carousel-spacing.tsx",
+ "content": "import * as React from \"react\"\n\nimport { Card, CardContent } from \"@/registry/base-lyra/ui/card\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/registry/base-lyra/ui/carousel\"\n\nexport default function CarouselSpacing() {\n return (\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",
+ "type": "registry:example"
+ }
+ ],
+ "type": "registry:example"
+}
\ No newline at end of file
diff --git a/apps/v4/public/r/styles/base-lyra/carousel.json b/apps/v4/public/r/styles/base-lyra/carousel.json
index 4de2f3f7aa..782e6d231b 100644
--- a/apps/v4/public/r/styles/base-lyra/carousel.json
+++ b/apps/v4/public/r/styles/base-lyra/carousel.json
@@ -10,7 +10,7 @@
"files": [
{
"path": "registry/base-lyra/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/bases/base/lib/utils\"\nimport { Button } from \"@/registry/bases/base/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",
+ "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-lyra/lib/utils\"\nimport { Button } from \"@/registry/base-lyra/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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/chart-bar-demo-axis.json b/apps/v4/public/r/styles/base-lyra/chart-bar-demo-axis.json
new file mode 100644
index 0000000000..0c16c510a6
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/chart-bar-demo-axis.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "chart-bar-demo-axis",
+ "title": "Chart Bar Demo Axis",
+ "registryDependencies": [
+ "chart"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/chart-bar-demo-axis.tsx",
+ "content": "\"use client\"\n\nimport { Bar, BarChart, CartesianGrid, XAxis } from \"recharts\"\n\nimport {\n ChartContainer,\n type ChartConfig,\n} from \"@/registry/base-lyra/ui/chart\"\n\nconst chartData = [\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 chartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"#2563eb\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"#60a5fa\",\n },\n} satisfies ChartConfig\n\nexport function ChartBarDemoAxis() {\n return (\n \n \n \n value.slice(0, 3)}\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-lyra/chart-bar-demo-grid.json b/apps/v4/public/r/styles/base-lyra/chart-bar-demo-grid.json
new file mode 100644
index 0000000000..1091b58c5c
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/chart-bar-demo-grid.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "chart-bar-demo-grid",
+ "title": "Chart Bar Demo Grid",
+ "registryDependencies": [
+ "chart"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/chart-bar-demo-grid.tsx",
+ "content": "\"use client\"\n\nimport { Bar, BarChart, CartesianGrid } from \"recharts\"\n\nimport {\n ChartContainer,\n type ChartConfig,\n} from \"@/registry/base-lyra/ui/chart\"\n\nconst chartData = [\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 chartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"#2563eb\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"#60a5fa\",\n },\n} satisfies ChartConfig\n\nexport function ChartBarDemoGrid() {\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-lyra/chart-bar-demo-legend.json b/apps/v4/public/r/styles/base-lyra/chart-bar-demo-legend.json
new file mode 100644
index 0000000000..067b000e6b
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/chart-bar-demo-legend.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "chart-bar-demo-legend",
+ "title": "Chart Bar Demo Legend",
+ "registryDependencies": [
+ "chart"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/chart-bar-demo-legend.tsx",
+ "content": "\"use client\"\n\nimport { Bar, BarChart, CartesianGrid, XAxis } from \"recharts\"\n\nimport {\n ChartContainer,\n ChartLegend,\n ChartLegendContent,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-lyra/ui/chart\"\n\nconst chartData = [\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 chartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"#2563eb\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"#60a5fa\",\n },\n} satisfies ChartConfig\n\nexport function ChartBarDemoLegend() {\n return (\n \n \n \n value.slice(0, 3)}\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-lyra/chart-bar-demo-tooltip.json b/apps/v4/public/r/styles/base-lyra/chart-bar-demo-tooltip.json
new file mode 100644
index 0000000000..64e160f338
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/chart-bar-demo-tooltip.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "chart-bar-demo-tooltip",
+ "title": "Chart Bar Demo Tooltip",
+ "registryDependencies": [
+ "chart"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/chart-bar-demo-tooltip.tsx",
+ "content": "\"use client\"\n\nimport { Bar, BarChart, CartesianGrid, XAxis } from \"recharts\"\n\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-lyra/ui/chart\"\n\nconst chartData = [\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 chartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"#2563eb\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"#60a5fa\",\n },\n} satisfies ChartConfig\n\nexport function ChartBarDemoTooltip() {\n return (\n \n \n \n value.slice(0, 3)}\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-lyra/chart-bar-demo.json b/apps/v4/public/r/styles/base-lyra/chart-bar-demo.json
new file mode 100644
index 0000000000..3422006d01
--- /dev/null
+++ b/apps/v4/public/r/styles/base-lyra/chart-bar-demo.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
+ "name": "chart-bar-demo",
+ "title": "Chart Bar Demo",
+ "registryDependencies": [
+ "chart"
+ ],
+ "files": [
+ {
+ "path": "registry/base-lyra/demo/chart-bar-demo.tsx",
+ "content": "\"use client\"\n\nimport { Bar, BarChart } from \"recharts\"\n\nimport {\n ChartContainer,\n type ChartConfig,\n} from \"@/registry/base-lyra/ui/chart\"\n\nconst chartData = [\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 chartConfig = {\n desktop: {\n label: \"Desktop\",\n color: \"#2563eb\",\n },\n mobile: {\n label: \"Mobile\",\n color: \"#60a5fa\",\n },\n} satisfies ChartConfig\n\nexport function ChartBarDemo() {\n return (\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-lyra/chart-example.json b/apps/v4/public/r/styles/base-lyra/chart-example.json
index de9c9f80c2..904b639810 100644
--- a/apps/v4/public/r/styles/base-lyra/chart-example.json
+++ b/apps/v4/public/r/styles/base-lyra/chart-example.json
@@ -10,7 +10,7 @@
"files": [
{
"path": "registry/base-lyra/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/bases/base/components/example\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/registry/bases/base/ui/card\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/bases/base/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\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",
+ "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-lyra/components/example\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/registry/base-lyra/ui/card\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-lyra/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\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"
}
],
diff --git a/apps/v4/public/r/styles/base-lyra/chart.json b/apps/v4/public/r/styles/base-lyra/chart.json
index 4d9c4ea31a..a624970661 100644
--- a/apps/v4/public/r/styles/base-lyra/chart.json
+++ b/apps/v4/public/r/styles/base-lyra/chart.json
@@ -10,7 +10,7 @@
"files": [
{
"path": "registry/base-lyra/ui/chart.tsx",
- "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\n\nimport { cn } from \"@/registry/bases/base/lib/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nexport type ChartConfig = {\n [k in string]: {\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 ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"]\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