Documentation Sidebar
blocklayoutDocs-style sidebar with a version switcher at the top, a search input below, and collapsible navigation groups. All sample data inlined so consumers edit routes in place.
Installation
$pnpm dlx shadcn-svelte@latest add https://uipkge.dev/r/svelte/sidebar-03.json$npx shadcn-svelte@latest add https://uipkge.dev/r/svelte/sidebar-03.json$yarn dlx shadcn-svelte@latest add https://uipkge.dev/r/svelte/sidebar-03.json$bunx shadcn-svelte@latest add https://uipkge.dev/r/svelte/sidebar-03.jsonManifest:
https://uipkge.dev/r/svelte/sidebar-03.jsonInstalls to:src/lib/components/blocks/sidebar-03/Variants
Loading interactive previews…
Loading interactive previews…
npm dependencies
Files installed (4)
src/lib/components/blocks/sidebar-03/Sidebar03.svelte5 kB
<script lang="ts"> import { ChevronRight } from '@lucide/svelte' import SearchForm from './SearchForm.svelte' import VersionSwitcher from './VersionSwitcher.svelte' import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '$lib/components/ui/collapsible' import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarRail, } from '$lib/components/ui/sidebar' interface NavChild { title: string url: string isActive?: boolean } interface NavGroup { title: string url: string items: NavChild[] } // This is sample data. const data: { versions: string[]; navMain: NavGroup[] } = { versions: ['1.0.1', '1.1.0-alpha', '2.0.0-beta1'], navMain: [ { title: 'Getting Started', url: '#', items: [ { title: 'Installation', url: '#', }, { title: 'Project Structure', url: '#', }, ], }, { title: 'Building Your Application', url: '#', items: [ { title: 'Routing', url: '#', }, { title: 'Data Fetching', url: '#', isActive: true, }, { title: 'Rendering', url: '#', }, { title: 'Caching', url: '#', }, { title: 'Styling', url: '#', }, { title: 'Optimizing', url: '#', }, { title: 'Configuring', url: '#', }, { title: 'Testing', url: '#', }, { title: 'Authentication', url: '#', }, { title: 'Deploying', url: '#', }, { title: 'Upgrading', url: '#', }, { title: 'Examples', url: '#', }, ], }, { title: 'API Reference', url: '#', items: [ { title: 'Components', url: '#', }, { title: 'File Conventions', url: '#', }, { title: 'Functions', url: '#', }, { title: 'next.config.js Options', url: '#', }, { title: 'CLI', url: '#', }, { title: 'Edge Runtime', url: '#', }, ], }, { title: 'Architecture', url: '#', items: [ { title: 'Accessibility', url: '#', }, { title: 'Fast Refresh', url: '#', }, { title: 'Next.js Compiler', url: '#', }, { title: 'Supported Browsers', url: '#', }, { title: 'Turbopack', url: '#', }, ], }, { title: 'Community', url: '#', items: [ { title: 'Contribution Guide', url: '#', }, ], }, ], } </script> <Sidebar data-slot="sidebar-03"> <SidebarHeader> <VersionSwitcher versions={data.versions} defaultVersion={data.versions[0]!} /> <SearchForm /> </SidebarHeader> <SidebarContent class="gap-0"> {#each data.navMain as item (item.title)} <Collapsible title={item.title} defaultOpen class="group/collapsible"> <SidebarGroup> <SidebarGroupLabel class="group/label text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground text-sm" > {#snippet child({ props: labelProps })} <CollapsibleTrigger {...labelProps}> {item.title} <ChevronRight class="ml-auto transition-transform group-data-[state=open]/collapsible:rotate-90" /> </CollapsibleTrigger> {/snippet} </SidebarGroupLabel> <CollapsibleContent> <SidebarGroupContent> <SidebarMenu> {#each item.items as childItem (childItem.title)} <SidebarMenuItem> <SidebarMenuButton isActive={childItem.isActive}> {#snippet child({ props })} <a href={childItem.url} {...props}>{childItem.title}</a> {/snippet} </SidebarMenuButton> </SidebarMenuItem> {/each} </SidebarMenu> </SidebarGroupContent> </CollapsibleContent> </SidebarGroup> </Collapsible> {/each} </SidebarContent> <SidebarRail /> </Sidebar>src/lib/components/blocks/sidebar-03/SearchForm.svelte0.6 kB
<script lang="ts"> import { Search } from '@lucide/svelte' import { Label } from '$lib/components/ui/label' import { SidebarGroup, SidebarGroupContent, SidebarInput } from '$lib/components/ui/sidebar' </script> <form data-slot="sidebar-03"> <SidebarGroup class="py-0"> <SidebarGroupContent> <Label for="search" class="sr-only">Search</Label> <SidebarInput id="search" type="text" placeholder="Search the docs..." allowClear> {#snippet prefixSnippet()} <Search class="text-muted-foreground size-3.5" /> {/snippet} </SidebarInput> </SidebarGroupContent> </SidebarGroup> </form>src/lib/components/blocks/sidebar-03/VersionSwitcher.svelte2.3 kB
<script lang="ts"> import { Check, ChevronsUpDown } from '@lucide/svelte' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '$lib/components/ui/dropdown-menu' import { SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '$lib/components/ui/sidebar' interface Props { versions: string[] defaultVersion: string } let { versions, defaultVersion }: Props = $props() // svelte-ignore state_referenced_locally: one-shot seed by design; later defaultVersion changes must not clobber the pick. let selectedVersion = $state(defaultVersion) </script> <SidebarMenu data-slot="sidebar-03"> <SidebarMenuItem> <DropdownMenu> <DropdownMenuTrigger> {#snippet child({ props })} <SidebarMenuButton size="lg" class="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground" {...props} > <div class="bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg" > <svg viewBox="0 0 24 24" class="size-4" fill="currentColor" aria-hidden="true"> <rect x="2" y="2" width="9" height="9" rx="1.5" /> <rect x="13" y="2" width="9" height="9" rx="1.5" opacity="0.55" /> <rect x="2" y="13" width="9" height="9" rx="1.5" opacity="0.55" /> <rect x="13" y="13" width="9" height="9" rx="1.5" /> </svg> </div> <div class="flex flex-col gap-0.5 leading-none"> <span class="font-medium">uipkge</span> <span class="">v{selectedVersion}</span> </div> <ChevronsUpDown class="ml-auto" /> </SidebarMenuButton> {/snippet} </DropdownMenuTrigger> <DropdownMenuContent class="w-56" align="start"> {#each versions as version (version)} <DropdownMenuItem onSelect={() => (selectedVersion = version)}> v{version} {#if selectedVersion === version} <Check class="ml-auto" /> {/if} </DropdownMenuItem> {/each} </DropdownMenuContent> </DropdownMenu> </SidebarMenuItem> </SidebarMenu>src/routes/sidebar-03-demo/+page.svelte1 kB
<script lang="ts"> // Demo page. Visit /sidebar-03-demo after install to see the block without // editing your own routes. Free to edit or delete me. import Sidebar03 from '$lib/components/blocks/sidebar-03/Sidebar03.svelte' import { SidebarInset, SidebarProvider, SidebarTrigger } from '$lib/components/ui/sidebar' </script> <SidebarProvider> <Sidebar03 /> <SidebarInset> <header class="border-border flex h-14 shrink-0 items-center gap-3 border-b px-4"> <SidebarTrigger class="size-7" /> <h1 class="text-sm font-semibold">sidebar-03 demo</h1> </header> <div class="flex-1 p-6"> <div class="grid auto-rows-min gap-4 md:grid-cols-3"> <div class="bg-muted/50 aspect-video rounded-xl"></div> <div class="bg-muted/50 aspect-video rounded-xl"></div> <div class="bg-muted/50 aspect-video rounded-xl"></div> </div> <div class="bg-muted/50 mt-4 min-h-[60vh] rounded-xl"></div> </div> </SidebarInset> </SidebarProvider>
Raw manifest:https://uipkge.dev/r/svelte/sidebar-03.json