From e2832bac7c0f1f75d61b484fbdac732a2afdc0bc Mon Sep 17 00:00:00 2001 From: Brendan Dash Date: Sat, 21 Feb 2026 22:31:27 +0800 Subject: [PATCH 01/11] feat: update shadcn-hooks link --- apps/v4/public/r/registries-legacy.json | 2 +- apps/v4/public/r/registries.json | 4 ++-- apps/v4/registry/directory.json | 4 ++-- deprecated/www/public/r/registries.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/v4/public/r/registries-legacy.json b/apps/v4/public/r/registries-legacy.json index 3708dd6c6d..9b36bc6255 100644 --- a/apps/v4/public/r/registries-legacy.json +++ b/apps/v4/public/r/registries-legacy.json @@ -41,7 +41,7 @@ "@gaia": "https://ui.heygaia.io/r/{name}.json", "@glass-ui": "https://glass-ui.crenspire.com/r/{name}.json", "@heseui": "https://www.heseui.com/r/{name}.json", - "@hooks": "https://shadcn-hooks.vercel.app/r/{name}.json", + "@hooks": "https://shadcn-hooks.com/r/{name}.json", "@intentui": "https://intentui.com/r/{name}", "@kibo-ui": "https://www.kibo-ui.com/r/{name}.json", "@kanpeki": "https://kanpeki.vercel.app/r/{name}.json", diff --git a/apps/v4/public/r/registries.json b/apps/v4/public/r/registries.json index a9502c3063..36fc7f855e 100644 --- a/apps/v4/public/r/registries.json +++ b/apps/v4/public/r/registries.json @@ -241,8 +241,8 @@ }, { "name": "@hooks", - "homepage": "https://shadcn-hooks.vercel.app", - "url": "https://shadcn-hooks.vercel.app/r/{name}.json", + "homepage": "https://shadcn-hooks.com", + "url": "https://shadcn-hooks.com/r/{name}.json", "description": "A comprehensive React Hooks Collection built with Shadcn." }, { diff --git a/apps/v4/registry/directory.json b/apps/v4/registry/directory.json index 6e0301329d..d0f79e4e50 100644 --- a/apps/v4/registry/directory.json +++ b/apps/v4/registry/directory.json @@ -281,8 +281,8 @@ }, { "name": "@hooks", - "homepage": "https://shadcn-hooks.vercel.app", - "url": "https://shadcn-hooks.vercel.app/r/{name}.json", + "homepage": "https://shadcn-hooks.com", + "url": "https://shadcn-hooks.com/r/{name}.json", "description": "A comprehensive React Hooks Collection built with Shadcn.", "logo": "" }, diff --git a/deprecated/www/public/r/registries.json b/deprecated/www/public/r/registries.json index 51cdf8d0ac..ad58f9e498 100644 --- a/deprecated/www/public/r/registries.json +++ b/deprecated/www/public/r/registries.json @@ -27,7 +27,7 @@ "@fancy": "https://fancycomponents.dev/r/{name}.json", "@formcn": "https://formcn.dev/r/{name}.json", "@heseui": "https://www.heseui.com/r/{name}.json", - "@hooks": "https://shadcn-hooks.vercel.app/r/{name}.json", + "@hooks": "https://shadcn-hooks.com/r/{name}.json", "@intentui": "https://intentui.com/r/{name}", "@kibo-ui": "https://www.kibo-ui.com/r/{name}.json", "@kokonutui": "https://kokonutui.com/r/{name}.json", From f6dc35c9a1c75271119807652e4cc96bba5f273b Mon Sep 17 00:00:00 2001 From: Ala Eddine Date: Fri, 27 Feb 2026 15:34:42 +0100 Subject: [PATCH 02/11] feat: add @terrae registry Add Terrae - composable, animated map components for React built with TypeScript, Tailwind CSS, Mapbox GL JS, and MapLibre GL. --- apps/v4/public/r/registries.json | 6 ++++++ apps/v4/registry/directory.json | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/apps/v4/public/r/registries.json b/apps/v4/public/r/registries.json index 688e12d797..ff52ea296e 100644 --- a/apps/v4/public/r/registries.json +++ b/apps/v4/public/r/registries.json @@ -581,6 +581,12 @@ "url": "https://taki-ui.com/r/{name}.json", "description": "Beautifully designed, accessible components that you can copy and paste into your apps. Made with React Aria Components and Shadcn tokens." }, + { + "name": "@terrae", + "homepage": "https://www.terrae.dev", + "url": "https://www.terrae.dev/{name}.json", + "description": "Composable, animated map components for React. Built with TypeScript, Tailwind CSS, Mapbox GL JS, and MapLibre GL. Perfect companion for shadcn/ui." + }, { "name": "@thegridcn", "homepage": "https://thegridcn.com", diff --git a/apps/v4/registry/directory.json b/apps/v4/registry/directory.json index f186ff7e2e..a54335e63a 100644 --- a/apps/v4/registry/directory.json +++ b/apps/v4/registry/directory.json @@ -678,6 +678,13 @@ "description": "Beautifully designed, accessible components that you can copy and paste into your apps. Made with React Aria Components and Shadcn tokens.", "logo": "" }, + { + "name": "@terrae", + "homepage": "https://www.terrae.dev", + "url": "https://www.terrae.dev/{name}.json", + "description": "Composable, animated map components for React. Built with TypeScript, Tailwind CSS, Mapbox GL JS, and MapLibre GL. Perfect companion for shadcn/ui.", + "logo": "t" + }, { "name": "@thegridcn", "homepage": "https://thegridcn.com", From 1a67379f57f5c874b553c53dd45047438695c65f Mon Sep 17 00:00:00 2001 From: Shitanshu Kumar Date: Sat, 28 Feb 2026 12:55:48 +0530 Subject: [PATCH 03/11] fix the missing items in select page (base ui) --- apps/v4/content/docs/components/base/select.mdx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/v4/content/docs/components/base/select.mdx b/apps/v4/content/docs/components/base/select.mdx index 5282d7d547..53e0c848af 100644 --- a/apps/v4/content/docs/components/base/select.mdx +++ b/apps/v4/content/docs/components/base/select.mdx @@ -67,15 +67,23 @@ import { ``` ```tsx showLineNumbers - - Light - Dark - System + {items.map((item) => ( + + {item.label} + + ))} From 68c9ada0790c2931ab580a120331313d65d0ec74 Mon Sep 17 00:00:00 2001 From: nkurunziza-saddy Date: Sat, 28 Feb 2026 15:23:27 +0200 Subject: [PATCH 04/11] fix(base-sidebar): fix tooltip rendering with render prop --- apps/v4/examples/base/ui-rtl/sidebar.tsx | 2 +- apps/v4/examples/base/ui/sidebar.tsx | 2 +- apps/v4/public/r/styles/base-lyra/sidebar.json | 2 +- apps/v4/public/r/styles/base-maia/sidebar.json | 2 +- apps/v4/public/r/styles/base-mira/sidebar.json | 2 +- apps/v4/public/r/styles/base-nova/sidebar.json | 2 +- apps/v4/public/r/styles/base-vega/sidebar.json | 2 +- apps/v4/registry/bases/base/ui/sidebar.tsx | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/v4/examples/base/ui-rtl/sidebar.tsx b/apps/v4/examples/base/ui-rtl/sidebar.tsx index b334a2efdc..bb66a16e4d 100644 --- a/apps/v4/examples/base/ui-rtl/sidebar.tsx +++ b/apps/v4/examples/base/ui-rtl/sidebar.tsx @@ -517,7 +517,7 @@ function SidebarMenuButton({ }, props ), - render: !tooltip ? render : TooltipTrigger, + render: !tooltip ? render : , state: { slot: "sidebar-menu-button", sidebar: "menu-button", diff --git a/apps/v4/examples/base/ui/sidebar.tsx b/apps/v4/examples/base/ui/sidebar.tsx index c7dac676ae..df1e15b29d 100644 --- a/apps/v4/examples/base/ui/sidebar.tsx +++ b/apps/v4/examples/base/ui/sidebar.tsx @@ -517,7 +517,7 @@ function SidebarMenuButton({ }, props ), - render: !tooltip ? render : TooltipTrigger, + render: !tooltip ? render : , state: { slot: "sidebar-menu-button", sidebar: "menu-button", diff --git a/apps/v4/public/r/styles/base-lyra/sidebar.json b/apps/v4/public/r/styles/base-lyra/sidebar.json index 48266be81f..76ef89be37 100644 --- a/apps/v4/public/r/styles/base-lyra/sidebar.json +++ b/apps/v4/public/r/styles/base-lyra/sidebar.json @@ -13,7 +13,7 @@ "files": [ { "path": "registry/base-lyra/ui/sidebar.tsx", - "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { 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 { useIsMobile } from \"@/registry/base-lyra/hooks/use-mobile\"\nimport { cn } from \"@/registry/base-lyra/lib/utils\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport { Input } from \"@/registry/base-lyra/ui/input\"\nimport { Separator } from \"@/registry/base-lyra/ui/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@/registry/base-lyra/ui/sheet\"\nimport { Skeleton } from \"@/registry/base-lyra/ui/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/registry/base-lyra/ui/tooltip\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n \n \n {children}\n \n \n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n \n {children}\n \n )\n }\n\n if (isMobile) {\n return (\n \n button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n \n Sidebar\n Displays the mobile sidebar.\n \n
{children}
\n \n
\n )\n }\n\n return (\n