shadcn-ui 学习记录

699 阅读2分钟

手风琴折叠面板

  • 安装:npx shadcn-ui@latest add accordion
  • 效果:image.png
  • 使用:
    import {
     Accordion,
     AccordionContent,
     AccordionItem,
     AccordionTrigger,
    } from "@/components/ui/accordion"
    
    export function AccordionDemo() {
     return (
       <Accordion type="single" collapsible className="w-full">
         <AccordionItem value="item-1">
           <AccordionTrigger>Is it accessible?</AccordionTrigger>
           <AccordionContent>
             Yes. It adheres to the WAI-ARIA design pattern.
           </AccordionContent>
         </AccordionItem>
         <AccordionItem value="item-2">
           <AccordionTrigger>Is it styled?</AccordionTrigger>
           <AccordionContent>
             Yes. It comes with default styles that matches the other
             components&apos; aesthetic.
           </AccordionContent>
         </AccordionItem>
         <AccordionItem value="item-3">
           <AccordionTrigger>Is it animated?</AccordionTrigger>
           <AccordionContent>
             Yes. It&apos;s animated by default, but you can disable it if you
             prefer.
           </AccordionContent>
         </AccordionItem>
       </Accordion>
     )
    }
    
  • 属性参考:www.radix-ui.com/primitives/…

消息

  • 安装:npx shadcn-ui@latest add alert
  • 效果:image.png
  • 使用:
    // Terminal是react图标库的图标
    import { Terminal } from "lucide-react"
    
    import {
      Alert,
      AlertDescription,
      AlertTitle,
    } from "@/components/ui/alert"
    
    export function AlertDemo() {
      return (
        <Alert>
          <Terminal className="h-4 w-4" />
          <AlertTitle>Heads up!</AlertTitle>
          <AlertDescription>
            You can add components to your app using the cli.
          </AlertDescription>
        </Alert>
      )
    }
    
  • 属性参考:variant 无复杂属性

弹窗

  • 安装 npx shadcn-ui@latest add alert-dialog
  • 效果:image.png
  • 使用:
    import {
      AlertDialog,
      AlertDialogAction,
      AlertDialogCancel,
      AlertDialogContent,
      AlertDialogDescription,
      AlertDialogFooter,
      AlertDialogHeader,
      AlertDialogTitle,
      AlertDialogTrigger,
    } from "@/components/ui/alert-dialog"
    import { Button } from "@/components/ui/button"
    
    export function AlertDialogDemo() {
      return (
        <AlertDialog>
          <AlertDialogTrigger asChild>
            <Button variant="outline">Show Dialog</Button>
          </AlertDialogTrigger>
          <AlertDialogContent>
            <AlertDialogHeader>
              <AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>
              <AlertDialogDescription>
                This action cannot be undone. This will permanently delete your
                account and remove your data from our servers.
              </AlertDialogDescription>
            </AlertDialogHeader>
            <AlertDialogFooter>
              <AlertDialogCancel>Cancel</AlertDialogCancel>
              <AlertDialogAction>Continue</AlertDialogAction>
            </AlertDialogFooter>
          </AlertDialogContent>
        </AlertDialog>
      )
    }
    
  • 属性:www.radix-ui.com/primitives/…

弹性盒子(根据纵横比缩放适应屏幕)

  • 安装:npx shadcn-ui@latest add aspect-ratio
  • 效果:image.png
  • 使用
    import Image from "next/image"
    import { AspectRatio } from "@/components/ui/aspect-ratio"
    
    export function AspectRatioDemo() {
      return (
        <AspectRatio ratio={16 / 9} className="bg-muted">
          <Image
            src="https://images.unsplash.com/photo-1588345921523-c2dcdb7f1dcd?w=800&dpr=2&q=80"
            alt="Photo by Drew Beamer"
            fill
            className="rounded-md object-cover"
          />
        </AspectRatio>
      )
    }
    
  • 属性:www.radix-ui.com/primitives/…

头像

  • 使用 npx shadcn-ui@latest add avatar
  • 效果:image.png
  • 使用:
    import {
      Avatar,
      AvatarFallback,
      AvatarImage,
    } from "@/components/ui/avatar"
    
    export function AvatarDemo() {
      return (
        <Avatar>
          <AvatarImage src="https://github.com/shadcn.png" alt="@shadcn" />
          <AvatarFallback>CN</AvatarFallback>
        </Avatar>
      )
    }
    
  • 属性:www.radix-ui.com/primitives/…

标记

  • 安装:npx shadcn-ui@latest add badge
  • 效果:image.pngimage.pngimage.pngimage.png
  • 使用:
    import { Badge } from "@/components/ui/badge"
    
    export function BadgeDemo() {
      return <Badge>Badge</Badge>
    }
    

面包屑

  • 安装:npx shadcn-ui@latest add breadcrumb
  • 效果:image.png
  • 使用:
    import {
      Breadcrumb,
      BreadcrumbEllipsis,
      BreadcrumbItem,
      BreadcrumbLink,
      BreadcrumbList,
      BreadcrumbPage,
      BreadcrumbSeparator,
    } from "@/components/ui/breadcrumb"
    import {
      DropdownMenu,
      DropdownMenuContent,
      DropdownMenuItem,
      DropdownMenuTrigger,
    } from "@/components/ui/dropdown-menu"
    
    export function BreadcrumbDemo() {
      return (
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink href="/">Home</BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <DropdownMenu>
                <DropdownMenuTrigger className="flex items-center gap-1">
                  <BreadcrumbEllipsis className="h-4 w-4" />
                  <span className="sr-only">Toggle menu</span>
                </DropdownMenuTrigger>
                <DropdownMenuContent align="start">
                  <DropdownMenuItem>Documentation</DropdownMenuItem>
                  <DropdownMenuItem>Themes</DropdownMenuItem>
                  <DropdownMenuItem>GitHub</DropdownMenuItem>
                </DropdownMenuContent>
              </DropdownMenu>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbLink href="/docs/components">Components</BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Breadcrumb</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>
      )
    }
    

属性:暂无文档

按钮

  • 安装:npx shadcn-ui@latest add button
  • 使用:
    import { Button } from "@/components/ui/button"
    
    export function ButtonDemo() {
      return <Button>Button</Button>
    }
    

日历

  • 安装:npx shadcn-ui@latest add calendar
  • 效果:image.png
  • 使用:
    "use client"
    
    import * as React from "react"
    
    import { Calendar } from "@/components/ui/calendar"
    
    export function CalendarDemo() {
      const [date, setDate] = React.useState<Date | undefined>(new Date())
    
      return (
        <Calendar
          mode="single"
          selected={date}
          onSelect={setDate}
          className="rounded-md border"
        />
      )
    }
    

卡片

  • 安装:npx shadcn-ui@latest add card
  • 效果:image.png
  • 使用:
    import * as React from "react"
    
    import { Button } from "@/components/ui/button"
    import {
      Card,
      CardContent,
      CardDescription,
      CardFooter,
      CardHeader,
      CardTitle,
    } from "@/components/ui/card"
    import { Input } from "@/components/ui/input"
    import { Label } from "@/components/ui/label"
    import {
      Select,
      SelectContent,
      SelectItem,
      SelectTrigger,
      SelectValue,
    } from "@/components/ui/select"
    
    export function CardWithForm() {
      return (
        <Card className="w-[350px]">
          <CardHeader>
            <CardTitle>Create project</CardTitle>
            <CardDescription>Deploy your new project in one-click.</CardDescription>
          </CardHeader>
          <CardContent>
            <form>
              <div className="grid w-full items-center gap-4">
                <div className="flex flex-col space-y-1.5">
                  <Label htmlFor="name">Name</Label>
                  <Input id="name" placeholder="Name of your project" />
                </div>
                <div className="flex flex-col space-y-1.5">
                  <Label htmlFor="framework">Framework</Label>
                  <Select>
                    <SelectTrigger id="framework">
                      <SelectValue placeholder="Select" />
                    </SelectTrigger>
                    <SelectContent position="popper">
                      <SelectItem value="next">Next.js</SelectItem>
                      <SelectItem value="sveltekit">SvelteKit</SelectItem>
                      <SelectItem value="astro">Astro</SelectItem>
                      <SelectItem value="nuxt">Nuxt.js</SelectItem>
                    </SelectContent>
                  </Select>
                </div>
              </div>
            </form>
          </CardContent>
          <CardFooter className="flex justify-between">
            <Button variant="outline">Cancel</Button>
            <Button>Deploy</Button>
          </CardFooter>
        </Card>
      )
    }
    
  • 属性:暂无文档