Collapsible 5

PreviousNext

Filter panel with price range inputs, rating checkboxes and brand selection

Docs
shadcn-studiocomponent

Preview

Loading preview…
registry/new-york/components/collapsible/collapsible-05.tsx
import { ChevronDownIcon, StarIcon } from 'lucide-react'

import { Button } from '@/registry/new-york/ui/button'
import { Checkbox } from '@/registry/new-york/ui/checkbox'
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/registry/new-york/ui/collapsible'
import { Label } from '@/registry/new-york/ui/label'
import { Input } from '@/registry/new-york/ui/input'
import { Separator } from '@/registry/new-york/ui/separator'

const CollapsibleFilterDemo = () => {
  return (
    <div className='w-full max-w-[350px] space-y-3'>
      <Collapsible className='flex flex-col gap-2'>
        <div className='flex items-center justify-between gap-4 px-4'>
          <div className='text-sm font-semibold'>Price Range</div>
          <CollapsibleTrigger asChild className='group'>
            <Button variant='ghost' size='icon-sm'>
              <ChevronDownIcon className='text-muted-foreground transition-transform group-data-[state=open]:rotate-180' />
              <span className='sr-only'>Toggle</span>
            </Button>
          </CollapsibleTrigger>
        </div>
        <CollapsibleContent className='flex flex-col gap-2'>
          <div className='flex items-center justify-between gap-4 px-4'>
            <Label htmlFor='min-price' className='shrink-0 text-sm font-medium'>
              Min Price
            </Label>
            <Input id='min-price' type='number' placeholder='0' className='max-w-58' />
          </div>
          <div className='flex items-center justify-between gap-4 px-4'>
            <Label htmlFor='max-price' className='shrink-0 text-sm font-medium'>
              Max Price
            </Label>
            <Input id='max-price' type='number' placeholder='1000' className='max-w-58' />
          </div>
        </CollapsibleContent>
      </Collapsible>
      <Separator />
      <Collapsible className='flex w-full max-w-[350px] flex-col gap-2'>
        <div className='flex items-center justify-between gap-4 px-4'>
          <div className='text-sm font-semibold'>Customer Ratings</div>
          <CollapsibleTrigger asChild className='group'>
            <Button variant='ghost' size='icon-sm'>
              <ChevronDownIcon className='text-muted-foreground transition-transform group-data-[state=open]:rotate-180' />
              <span className='sr-only'>Toggle</span>
            </Button>
          </CollapsibleTrigger>
        </div>
        <CollapsibleContent className='flex flex-col gap-2'>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='rating-4' />
            <Label htmlFor='rating-4' className='flex shrink-0 items-center gap-1 text-sm font-medium'>
              <span className='flex items-center gap-1'>
                4
                <StarIcon className='size-4 fill-amber-500 stroke-amber-500 dark:fill-amber-400 dark:stroke-amber-400' />
              </span>
              & Up
            </Label>
          </div>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='rating-3' />
            <Label htmlFor='rating-3' className='flex shrink-0 items-center gap-1 text-sm font-medium'>
              <span className='flex items-center gap-1'>
                3
                <StarIcon className='size-4 fill-amber-500 stroke-amber-500 dark:fill-amber-400 dark:stroke-amber-400' />
              </span>
              & Up
            </Label>
          </div>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='rating-2' />
            <Label htmlFor='rating-2' className='flex shrink-0 items-center gap-1 text-sm font-medium'>
              <span className='flex items-center gap-1'>
                2
                <StarIcon className='size-4 fill-amber-500 stroke-amber-500 dark:fill-amber-400 dark:stroke-amber-400' />
              </span>
              & Up
            </Label>
          </div>
        </CollapsibleContent>
      </Collapsible>
      <Separator />
      <Collapsible className='flex w-full max-w-[350px] flex-col gap-2'>
        <div className='flex items-center justify-between gap-4 px-4'>
          <div className='text-sm font-semibold'>Brand</div>
          <CollapsibleTrigger asChild className='group'>
            <Button variant='ghost' size='icon-sm'>
              <ChevronDownIcon className='text-muted-foreground transition-transform group-data-[state=open]:rotate-180' />
              <span className='sr-only'>Toggle</span>
            </Button>
          </CollapsibleTrigger>
        </div>
        <CollapsibleContent className='flex flex-col gap-2'>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='brand-apple' />
            <Label htmlFor='brand-apple' className='shrink-0 text-sm font-medium'>
              Apple
            </Label>
          </div>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='brand-samsung' />
            <Label htmlFor='brand-samsung' className='shrink-0 text-sm font-medium'>
              Samsung
            </Label>
          </div>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='brand-google' />
            <Label htmlFor='brand-google' className='shrink-0 text-sm font-medium'>
              Google
            </Label>
          </div>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='brand-oneplus' />
            <Label htmlFor='brand-oneplus' className='shrink-0 text-sm font-medium'>
              OnePlus
            </Label>
          </div>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='brand-xiaomi' />
            <Label htmlFor='brand-xiaomi' className='shrink-0 text-sm font-medium'>
              Xiaomi
            </Label>
          </div>
        </CollapsibleContent>
      </Collapsible>
      <Separator />
      <Collapsible className='flex w-full max-w-[350px] flex-col gap-2'>
        <div className='flex items-center justify-between gap-4 px-4'>
          <div className='text-sm font-semibold'>Battery</div>
          <CollapsibleTrigger asChild className='group'>
            <Button variant='ghost' size='icon-sm'>
              <ChevronDownIcon className='text-muted-foreground transition-transform group-data-[state=open]:rotate-180' />
              <span className='sr-only'>Toggle</span>
            </Button>
          </CollapsibleTrigger>
        </div>
        <CollapsibleContent className='flex flex-col gap-2'>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='battery-3500' />
            <Label htmlFor='battery-3500' className='shrink-0 text-sm font-medium'>
              3500mAh
            </Label>
          </div>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='battery-4000' />
            <Label htmlFor='battery-4000' className='shrink-0 text-sm font-medium'>
              4000mAh
            </Label>
          </div>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='battery-5000' />
            <Label htmlFor='battery-5000' className='shrink-0 text-sm font-medium'>
              5000mAh
            </Label>
          </div>
          <div className='flex items-center gap-2 px-4'>
            <Checkbox id='battery-6000' />
            <Label htmlFor='battery-6000' className='shrink-0 text-sm font-medium'>
              6000mAh
            </Label>
          </div>
        </CollapsibleContent>
      </Collapsible>
    </div>
  )
}

export default CollapsibleFilterDemo

Installation

npx shadcn@latest add @shadcn-studio/collapsible-05

Usage

import { Collapsible05 } from "@/components/collapsible-05"
<Collapsible05 />