Sidebar
A composable, themeable and customizable sidebar component.
Installation
Complete the project setup first, including Tailwind CSS v4, theme tokens, and Preact compatibility aliases.
1. Install dependencies
bun add --exact @floating-ui/react-dom@2.1.9 class-variance-authority@0.7.1 cn@0.4.0 lucide-preact@1.51.0 preact@11.0.0 tw-animate-css@1.4.02. Copy the component with degit
Run this from your project root. It selects sidebar.tsx, its local dependencies, and both licenses directly from the repository, then copies them into src/components/ui.
bunx degit@3.10.0 https://github.com/LiasCode/shadcn-preact#main ./.cache/shadcn-preact/sidebar --files LICENSE.md,registry/ui/button.tsx,registry/ui/hooks/use-mobile.ts,registry/ui/input.tsx,registry/ui/lib/utils.ts,registry/ui/primitives/LICENSE,registry/ui/primitives/button/Button.tsx,registry/ui/primitives/button/index.ts,registry/ui/primitives/dialog/index.ts,registry/ui/primitives/dialog/parts.tsx,registry/ui/primitives/field/control/FieldControl.tsx,registry/ui/primitives/input/Input.tsx,registry/ui/primitives/input/index.ts,registry/ui/primitives/internals/FieldRootContext.ts,registry/ui/primitives/internals/FieldsetRootContext.ts,registry/ui/primitives/internals/FloatingFocusManager.tsx,registry/ui/primitives/internals/FloatingPortal.tsx,registry/ui/primitives/internals/FloatingTree.tsx,registry/ui/primitives/internals/FloatingTreeStore.ts,registry/ui/primitives/internals/FocusGuard.tsx,registry/ui/primitives/internals/LabelableContext.ts,registry/ui/primitives/internals/arrow.ts,registry/ui/primitives/internals/composite/root/CompositeRootContext.ts,registry/ui/primitives/internals/createBaseUIEventDetails.ts,registry/ui/primitives/internals/direction-context.ts,registry/ui/primitives/internals/empty.ts,registry/ui/primitives/internals/getReactElementRef.ts,registry/ui/primitives/internals/getStateAttributesProps.ts,registry/ui/primitives/internals/markOthers.ts,registry/ui/primitives/internals/mergeObjects.ts,registry/ui/primitives/internals/owner.ts,registry/ui/primitives/internals/popups/OverlayContext.ts,registry/ui/primitives/internals/popups/OverlayParts.tsx,registry/ui/primitives/internals/popups/OverlayRoot.tsx,registry/ui/primitives/internals/popups/OverlayTrigger.tsx,registry/ui/primitives/internals/popups/PopupHandle.ts,registry/ui/primitives/internals/popups/TooltipProvider.tsx,registry/ui/primitives/internals/popups/getElementProps.ts,registry/ui/primitives/internals/resolveClassName.ts,registry/ui/primitives/internals/resolveRef.ts,registry/ui/primitives/internals/resolveStyle.ts,registry/ui/primitives/internals/stateAttributesMapping.ts,registry/ui/primitives/internals/tabbable.ts,registry/ui/primitives/internals/types.ts,registry/ui/primitives/internals/useAnchorPositioning.ts,registry/ui/primitives/internals/useAnimationFrame.ts,registry/ui/primitives/internals/useAnimationsFinished.ts,registry/ui/primitives/internals/useButton.ts,registry/ui/primitives/internals/useControlled.ts,registry/ui/primitives/internals/useDismiss.ts,registry/ui/primitives/internals/useFloatingRootContext.ts,registry/ui/primitives/internals/useFocusableWhenDisabled.ts,registry/ui/primitives/internals/useHoverFloatingInteraction.ts,registry/ui/primitives/internals/useId.ts,registry/ui/primitives/internals/useIsoLayoutEffect.ts,registry/ui/primitives/internals/useMergedRefs.ts,registry/ui/primitives/internals/useOnMount.ts,registry/ui/primitives/internals/useOpenChangeComplete.ts,registry/ui/primitives/internals/useRefWithInit.ts,registry/ui/primitives/internals/useRenderElement.ts,registry/ui/primitives/internals/useScrollLock.ts,registry/ui/primitives/internals/useStableCallback.ts,registry/ui/primitives/internals/useTransitionStatus.ts,registry/ui/primitives/internals/visuallyHidden.ts,registry/ui/primitives/merge-props/index.ts,registry/ui/primitives/separator/Separator.tsx,registry/ui/primitives/separator/index.ts,registry/ui/primitives/tooltip/index.ts,registry/ui/primitives/tooltip/parts.tsx,registry/ui/primitives/use-render/index.ts,registry/ui/separator.tsx,registry/ui/sheet.tsx,registry/ui/sidebar.tsx,registry/ui/skeleton.tsx,registry/ui/tooltip.tsx --force
mkdir -p ./src/components/ui
cp -R ./.cache/shadcn-preact/sidebar/registry/ui/. ./src/components/ui/
cp ./.cache/shadcn-preact/sidebar/LICENSE.md ./src/components/ui/LICENSE.mdThe temporary copy lives in .cache/shadcn-preact/sidebar. Existing components stay in place; shared source files are updated from main.
Selected source files (74)
- button.tsx
- hooks/use-mobile.ts
- input.tsx
- lib/utils.ts
- primitives/LICENSE
- primitives/button/Button.tsx
- primitives/button/index.ts
- primitives/dialog/index.ts
- primitives/dialog/parts.tsx
- primitives/field/control/FieldControl.tsx
- primitives/input/Input.tsx
- primitives/input/index.ts
- primitives/internals/FieldRootContext.ts
- primitives/internals/FieldsetRootContext.ts
- primitives/internals/FloatingFocusManager.tsx
- primitives/internals/FloatingPortal.tsx
- primitives/internals/FloatingTree.tsx
- primitives/internals/FloatingTreeStore.ts
- primitives/internals/FocusGuard.tsx
- primitives/internals/LabelableContext.ts
- primitives/internals/arrow.ts
- primitives/internals/composite/root/CompositeRootContext.ts
- primitives/internals/createBaseUIEventDetails.ts
- primitives/internals/direction-context.ts
- primitives/internals/empty.ts
- primitives/internals/getReactElementRef.ts
- primitives/internals/getStateAttributesProps.ts
- primitives/internals/markOthers.ts
- primitives/internals/mergeObjects.ts
- primitives/internals/owner.ts
- primitives/internals/popups/OverlayContext.ts
- primitives/internals/popups/OverlayParts.tsx
- primitives/internals/popups/OverlayRoot.tsx
- primitives/internals/popups/OverlayTrigger.tsx
- primitives/internals/popups/PopupHandle.ts
- primitives/internals/popups/TooltipProvider.tsx
- primitives/internals/popups/getElementProps.ts
- primitives/internals/resolveClassName.ts
- primitives/internals/resolveRef.ts
- primitives/internals/resolveStyle.ts
- primitives/internals/stateAttributesMapping.ts
- primitives/internals/tabbable.ts
- primitives/internals/types.ts
- primitives/internals/useAnchorPositioning.ts
- primitives/internals/useAnimationFrame.ts
- primitives/internals/useAnimationsFinished.ts
- primitives/internals/useButton.ts
- primitives/internals/useControlled.ts
- primitives/internals/useDismiss.ts
- primitives/internals/useFloatingRootContext.ts
- primitives/internals/useFocusableWhenDisabled.ts
- primitives/internals/useHoverFloatingInteraction.ts
- primitives/internals/useId.ts
- primitives/internals/useIsoLayoutEffect.ts
- primitives/internals/useMergedRefs.ts
- primitives/internals/useOnMount.ts
- primitives/internals/useOpenChangeComplete.ts
- primitives/internals/useRefWithInit.ts
- primitives/internals/useRenderElement.ts
- primitives/internals/useScrollLock.ts
- primitives/internals/useStableCallback.ts
- primitives/internals/useTransitionStatus.ts
- primitives/internals/visuallyHidden.ts
- primitives/merge-props/index.ts
- primitives/separator/Separator.tsx
- primitives/separator/index.ts
- primitives/tooltip/index.ts
- primitives/tooltip/parts.tsx
- primitives/use-render/index.ts
- separator.tsx
- sheet.tsx
- sidebar.tsx
- skeleton.tsx
- tooltip.tsx
Usage
import * as React from "preact/compat";import { SidebarProvider, SidebarTrigger } from "./components/ui/sidebar"
import { AppSidebar } from "@/components/app-sidebar"
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<SidebarProvider>
<AppSidebar />
<main>
<SidebarTrigger />
{children}
</main>
</SidebarProvider>
)
}import {
Sidebar,
SidebarContent,
SidebarFooter,
SidebarGroup,
SidebarHeader,
} from "./components/ui/sidebar"
export function AppSidebar() {
return (
<Sidebar>
<SidebarHeader />
<SidebarContent>
<SidebarGroup />
<SidebarGroup />
</SidebarContent>
<SidebarFooter />
</Sidebar>
)
}Examples
Reference
See the official Sidebar documentation for composition patterns and API details. This page uses the Preact port and examples from the pinned upstream revision.
Component source