Code Block

Yapay zeka yanıtları için geliştirilmiş kod blokları. Akışa ayak uyduran sözdizimi vurgulama, kopyalama, indirme ve satır kaydırma, satır numaraları ve vurgulanmış satırlar, kabul ve reddetme seçenekli fark görünümleri ve komutlar için bir terminal.

Bir yapay zeka yanıtındaki kod birkaç karakter birkaç karakter gelir, çoğu zaman birinin onaylaması gereken bir fark olarak. Code Block akarken vurgular, okuyucu yukarı kaydırmadıysa yeni satırları izler ve kod tamamlanana kadar kopyalama, indirme ve satır kaydırmayı yoldan çekilmiş tutar.

Vurgulama, GitHub'ın açık ve koyu temalarıyla Shiki kullanır ve dil başına isteğe bağlı olarak yüklenir. Metin geldikçe yalnızca yeni satırlar tokenlenir; bu yüzden uzun dosyalar hızlı kalır ve renk şeması değişince parlamasın diye iki tema birlikte render edilir. 16 satırdan uzun bloklar “Show all” arkasında katlanır.

Birleşik bir fark iletirseniz eski ve yeni satır numaralarını, bir değişiklik sayısını ve renkli satırları alırsınız; kopyalama farkı değil yeni sürümü verir. Bir gözden geçirme eklerseniz okuyucu, blok odaktayken ⌘↵ ve ⌘⌫ ile değişikliği kabul veya reddedebilir. CodeFence aynı bloğu Streamdown'a takar, CodeTerminal ise komutları çıktıları ve çıkış koduyla gösterir.

  1. Pro registry'yi components.json dosyasına ekleyin

    components.json
    {
      "registries": {
        "@hextaui-pro": {
          "url": "https://hextaui.com/r/pro/{name}.json",
          "headers": {
            "Authorization": "Bearer ${HEXTAUI_PRO_TOKEN}"
          }
        }
      }
    }
  2. Token'ınızı ekleyin

    Hesap sayfanızda bir token oluşturun ve .env.local dosyasına HEXTAUI_PRO_TOKEN olarak ekleyin.

  3. Bloğu ekleyin

    pnpm dlx shadcn@latest add @hextaui-pro/code-block

Streamdown ile Markdown içinde

CodeFence'i bir renderer olarak kaydedin. title="app/page.tsx", {2,4-6} ve showLineNumbers gibi dil ve çit ayarlarını okur, çit hâlâ akarken vurgulamayı sürdürür.

"use client"

import { Streamdown } from "streamdown"

import { CodeFence, codeFenceLanguages } from "@/components/blocks/code-block/code-fence"

export function Answer({
  markdown,
  streaming,
}: {
  markdown: string
  streaming: boolean
}) {
  return (
    <Streamdown
      mode="streaming"
      isAnimating={streaming}
      plugins={{
        renderers: [{ language: codeFenceLanguages, component: CodeFence }],
      }}
    >
      {markdown}
    </Streamdown>
  )
}

Bir değişikliği gözden geçirme

Önerilen bir düzenlemeyi fark olarak gösterin ve okuyucunun, blok odaktayken ⌘↵ ve ⌘⌫ ile kabul veya reddetmesine izin verin.

"use client"

import * as React from "react"

import { CodeBlock, type ReviewStatus } from "@/components/blocks/code-block/code-block"

export function ProposedEdit({
  patch,
  onAccept,
  onReject,
}: {
  patch: string
  onAccept: () => Promise<void>
  onReject: () => void
}) {
  const [status, setStatus] = React.useState<ReviewStatus>("pending")

  return (
    <CodeBlock
      code={patch}
      language="tsx"
      filename="components/search.tsx"
      diff
      review={{
        status,
        onAccept: async () => {
          await onAccept()
          setStatus("accepted")
        },
        onReject: () => {
          onReject()
          setStatus("rejected")
        },
      }}
    />
  )
}

Tek başına

Kodu ve dili doğrudan iletin; örneğin bir araç çağrısı dosya içeriği döndürdüğünde.

import { CodeBlock } from "@/components/blocks/code-block/code-block"

export function FileContents({ path, contents }: { path: string; contents: string }) {
  return (
    <CodeBlock
      code={contents}
      language={path.split(".").pop()}
      filename={path}
      lineNumbers
      highlight={[3, 4]}
    />
  )
}

Yapı

Dıştan içe doğru birleştirdiğiniz parçalar.

ParçaAçıklama
CodeBlockBlokun kendisi: başlık, eylemler, kod ve isteğe bağlı gözden geçirme çubuğu.
CodeFenceÇitli kodu bir CodeBlock'a dönüştüren bir Streamdown renderer'ı.
CodeTerminalAkan çıktısı ve çıkış durumuyla bir komut.
CopyButton, DownloadButton, WrapToggleBaşlık eylemleri, kendi başlıklarınız için dışa aktarılır.
LanguageIconBaşlıkta kullanılan dil işareti.
PropTürVarsayılan
codeKaynak ya da diff ayarlıysa birleşik bir fark.
string–
languagetsx, py veya bash gibi Shiki dil id'si ya da takma adı. Bilinmeyen id'ler düz metin olarak render edilir.
string–
filenameBaşlıkta gösterilir ve indirmeler için kullanılır.
string–
streamingVurgulamayı artımlı tutar, yeni satırları izler ve eylemleri devre dışı bırakır.
booleanfalse
diffKodu birleşik fark olarak ele alır.
booleanfalse
lineNumbersSatır numaralarını gösterir. Farklar, false yapılmadıkça bunları gösterir.
boolean–
startLineİlk satırın numarası.
number1
highlightİşaretlenecek satır numaraları.
number[][]
defaultWrapUzun satırlar sarılmış olarak başlar.
booleanfalse
collapseAfterBu satır sayısından uzunsa daraltır. 0 hiçbir zaman daraltmaz.
number16
actionsBaşlıkta yerleşik olanlardan önce ek kontroller.
ReactNode–
onApply“Applied” ile onaylanan bir Apply düğmesi gösterir.
() => unknown–
reviewBeklerken gözden geçirme çubuğunu, kabul veya red sonrasında bir rozet gösterir.
CodeBlockReview–
PropTürVarsayılan
statusGeçerli karar.
"pending" | "accepted" | "rejected"–
onAcceptAccept veya ⌘↵ ile çağrılır.
() => void–
onRejectReject veya ⌘⌫ ile çağrılır.
() => void–

CodeFence

Streamdown ile kaydedin: plugins={{ renderers: [{ language: codeFenceLanguages, component: CodeFence }] }}.

PropTürVarsayılan
codeÇit içeriği, Streamdown'dan.
string–
languageÇit dili, Streamdown'dan.
string–
metaDilden sonraki her şey: title="…", {1,3-5}, showLineNumbers, startLine=10.
string–
isIncompleteÇit hâlâ açıkken true.
boolean–
PropTürVarsayılan
commandÇalıştırılan komut.
string–
outputŞimdiye kadarki çıktı. Aktıkça ekleyin.
string""
runningBir spinner gösterir ve yeni çıktıyı izler.
booleanfalse
exitCodeBittiğinde gösterilir. 0 dışındaki her şey başarısız olarak işaretlenir.
number–
titleBaşlık etiketi.
string"Terminal"
TuşAction
TabBaşlık eylemleri, kod alanı ve Show all arasında gezinir.
⌘↵Odak blok içindeyken bekleyen bir gözden geçirmeyi kabul eder.
⌘⌫Odak blok içindeyken bekleyen bir gözden geçirmeyi reddeder.
←→Kod alanı odaktayken uzun satırları kaydırır.
  • Kod alanı, dosyanın adını taşıyan odaklanabilir bir bölgedir, örneğin “app/page.tsx code”; böylece klavye kullanıcıları kaydırabilir.
  • Değişen satırlar renge bağımlı değildir. + ve − işaretleri yalnızca görseldir; ekran okuyucular bunun yerine her değişen satırdan önce “added” veya “removed” duyar.
  • Copy “Copied” duyurur ve her simge düğmesinin bir etiketi ve tooltip'i vardır.
  • Gözden geçirme kısayolları bir alana yazarken yok sayılır; böylece tuş vuruşlarını asla çalmaz.

Şunlarla geliştirildi

Code Block bloğunun yapıldığı ücretsiz HextaUI bileşenleri. Her biri tek başına yüklenir.

Kod

9 dosya, components/blocks/code-block konumuna eklendi.