Shadcn'e Gelen 7 Yeni Componenti İnceledim

Today

Shadcn'e Gelen 7 Yeni Componenti İnceledim

shadcn, benim de React projelerinde sıklıkla kullandığım, hem tutarlı UI standartları hem de daha hızlı geliştirme süreçleri sunan bir kütüphane. Özellikle erişilebilirlik, tema desteği ve bileşenlerin kolay özelleştirilebilmesi gibi avantajlar, daha hızlı ve daha sürdürülebilir ürünler geliştirilebilmesine olanak tanıyor.

Bugün sizlerle, shadcn kütüphanesine yakın zamanda eklenen 7 yeni componenti detaylı olarak inceleyeceğiz.

1. Spinner

Eskiden bir yükleme animasyonu göstermek için ya bir ikona Tailwind sınıflarıyla animasyon ekliyor ya da ekstra bir paket kuruyorduk, <Spinner /> componenti ise bu ihtiyacı ortadan kaldırıyor.

<div className="flex w-full max-w-xs flex-col gap-4 [--radius:1rem]">
  <Item variant="muted">
    <ItemMedia>
      <Spinner />
    </ItemMedia>
    <ItemContent>
      <ItemTitle className="line-clamp-1">Processing payment...</ItemTitle>
    </ItemContent>
    <ItemContent className="flex-none justify-end">
      <span className="text-sm tabular-nums">$100.00</span>
    </ItemContent>
  </Item>
</div>

(bkz. https://ui.shadcn.com/docs/components/spinner)

2. Kbd

Kbd, kullanıcı arayüzünde klavye kısayollarını göstermek için özel olarak tasarlanmış bir component. Daha önce bu amaçla Badge gibi genel bileşenler kullanılıyordu, Kbd componenti ise artık hem semantik açıdan doğru hem de daha şık bir çözüm sunuyor.

<div className="flex flex-col items-center gap-4">
  <KbdGroup>
    <Kbd>⌘</Kbd>
    <Kbd>⇧</Kbd>
    <Kbd>⌥</Kbd>
    <Kbd>⌃</Kbd>
  </KbdGroup>
  <KbdGroup>
    <Kbd>Ctrl</Kbd>
    <span>+</span>
    <Kbd>B</Kbd>
  </KbdGroup>
</div>

(bkz. https://ui.shadcn.com/docs/components/kbd)

3. Button Group

Daha önce birbiriyle alakalı butonları gruplamayı denediyseniz, karmaşık CSS ve yorucu sınır yönetimiyle uğraşmak zorunda kalmışsınızdır. Button Group ise bu zorluğu ortadan kaldırıyor. Bir konteyner gibi davranarak içine eklenen tüm butonların (hatta drop-down menülerin) görsel olarak birleşmesini sağlıyor.

<ButtonGroup
  orientation="vertical"
  aria-label="Media controls"
  className="h-fit"
>
  <Button variant="outline" size="icon">
    <PlusIcon />
  </Button>
  <Button variant="outline" size="icon">
    <MinusIcon />
  </Button>
</ButtonGroup>

(bkz. https://ui.shadcn.com/docs/components/button-group)

4. Input Group

Inputların içine veya etrafına ikon, metin veya buton eklerken, genellikle absolute positioning ve padding değerleriyle mücadele etmek gerekiyordu. Input Group bu yapıyı standartlaştırıyor, konumlandırma problemlerini ortadan kaldırarak hem Input hem de Text Area gibi alanların etrafında temiz ve karmaşık olmayan UIlar oluşturmayı mümkün kılıyor.

<div className="grid w-full max-w-sm gap-6">
  <InputGroup>
    <InputGroupInput placeholder="Search..." />
    <InputGroupAddon>
      <SearchIcon />
    </InputGroupAddon>
  </InputGroup>
  <InputGroup>
    <InputGroupInput type="email" placeholder="Enter your email" />
    <InputGroupAddon>
      <MailIcon />
    </InputGroupAddon>
  </InputGroup>
  <InputGroup>
    <InputGroupInput placeholder="Card number" />
    <InputGroupAddon>
      <CreditCardIcon />
    </InputGroupAddon>
    <InputGroupAddon align="inline-end">
      <CheckIcon />
    </InputGroupAddon>
  </InputGroup>
  <InputGroup>
    <InputGroupInput placeholder="Card number" />
    <InputGroupAddon align="inline-end">
      <StarIcon />
      <InfoIcon />
    </InputGroupAddon>
  </InputGroup>
</div>

(bkz. https://ui.shadcn.com/docs/components/input-group)

5. Field

Field, form oluşturma yaklaşımını yeniden tanımlayan, yeni componentler arasında en gözde component olabilir. En büyük avantajı, React Hook Forms veya TanStack Form gibi spesifik form kütüphanelerine bağımlı olmaması diyebilirim.

<div className="w-full max-w-md">
  <FieldSet>
    <FieldGroup>
      <Field>
        <FieldLabel htmlFor="username">Username</FieldLabel>
        <Input id="username" type="text" placeholder="Max Leiter" />
        <FieldDescription>
          Choose a unique username for your account.
        </FieldDescription>
      </Field>
      <Field>
        <FieldLabel htmlFor="password">Password</FieldLabel>
        <FieldDescription>Must be at least 8 characters long.</FieldDescription>
        <Input id="password" type="password" placeholder="********" />
      </Field>
    </FieldGroup>
  </FieldSet>
</div>

(bkz. https://ui.shadcn.com/docs/components/field)

6. Item

Item, listeler veya kartlar gibi tekrar eden içerikler için tasarlanmış esnek bir konteynerdir. Projelerde sürekli tekrarlanan div ve flex yapılarının yerine geçerek, standart ve duyarlı kart veya liste görünümlerini hızlıca oluşturmayı sağlar.

<div className="flex w-full max-w-md flex-col gap-6">
  <Item variant="outline">
    <ItemContent>
      <ItemTitle>Basic Item</ItemTitle>
      <ItemDescription>
        A simple item with title and description.
      </ItemDescription>
    </ItemContent>
    <ItemActions>
      <Button variant="outline" size="sm">
        Action
      </Button>
    </ItemActions>
  </Item>
  <Item variant="outline" size="sm" asChild>
    <a href="#">
      <ItemMedia>
        <BadgeCheckIcon className="size-5" />
      </ItemMedia>
      <ItemContent>
        <ItemTitle>Your profile has been verified.</ItemTitle>
      </ItemContent>
      <ItemActions>
        <ChevronRightIcon className="size-4" />
      </ItemActions>
    </a>
  </Item>
</div>

(bkz. https://ui.shadcn.com/docs/components/item)

7. Empty

404 gibi yokluk durumlarında ya da veri bulunmadığında (örneğin 'Hiç gönderi oluşturulmadı'), kullanıcıya bilgilendirici bir uyarı göstermek için kullanılır.

<Empty>
  <EmptyHeader>
    <EmptyMedia variant="icon">
      <IconFolderCode />
    </EmptyMedia>
    <EmptyTitle>No Projects Yet</EmptyTitle>
    <EmptyDescription>
      You haven&apos;t created any projects yet. Get started by creating your
      first project.
    </EmptyDescription>
  </EmptyHeader>
  <EmptyContent>
    <div className="flex gap-2">
      <Button size="sm">Create Project</Button>
      <Button variant="outline">Import Project</Button>
    </div>
  </EmptyContent>
  <Button variant="link" asChild className="text-muted-foreground" size="sm">
    <a href="#">
      Learn More <ArrowUpRightIcon />
    </a>
  </Button>
</Empty>

(bkz. https://ui.shadcn.com/docs/components/empty)


shadcn’in bu yeni sürümü, özellikle Field, Input Group ve Button Group bileşenleri aracılığıyla yaygın UI problemlerine mimari çözümler sunuyor. Bu araçları kullanmak, kodun daha temiz olmasını sağlarken, React geliştirme sürecinde de kayda değer bir hızlanma getiriyor.

Sonraki yazımda görüşmek üzere. Hoşçakalın…

Shadcn'e Gelen 7 Yeni Componenti İnceledim | Kadir Metin - Full Stack Developer | React & React Native