code-block-multiple-files

PreviousNext
Docs
takiexample

Preview

Loading preview…
registry/new-york/examples/code-block-multiple-files.tsx
"use client"

import {
  CodeBlock,
  CodeBlockBody,
  CodeBlockContent,
  CodeBlockCopyButton,
  CodeBlockFilename,
  CodeBlockFiles,
  CodeBlockHeader,
  CodeBlockItem,
  CodeBlockSelect,
  CodeBlockSelectItem,
} from "@/registry/new-york/ai-elements/code-block"

export default function CodeBlockMultipleFilesDemo() {
  const codeData = [
    {
      language: "typescript",
      filename: "Button.tsx",
      code: `import { type ReactNode } from "react"

interface ButtonProps {
  children: ReactNode
  onClick?: () => void
  variant?: "primary" | "secondary"
}

export function Button({ children, onClick, variant = "primary" }: ButtonProps) {
  return (
    <button
      onClick={onClick}
      className={\`btn btn-\${variant}\`}
    >
      {children}
    </button>
  )
}`,
    },
    {
      language: "typescript",
      filename: "Input.tsx",
      code: `import { type InputHTMLAttributes } from "react"

interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
  label?: string
  error?: string
}

export function Input({ label, error, ...props }: InputProps) {
  return (
    <div className="input-wrapper">
      {label && <label>{label}</label>}
      <input {...props} />
      {error && <span className="error">{error}</span>}
    </div>
  )
}`,
    },
    {
      language: "css",
      filename: "styles.css",
      code: `.btn {
  padding: 0.5rem 1rem;
  border-radius: 0.375rem;
  font-weight: 500;
  transition: all 0.2s;
}

.btn-primary {
  background-color: #3b82f6;
  color: white;
}

.btn-secondary {
  background-color: #6b7280;
  color: white;
}`,
    },
  ]

  return (
    <CodeBlock data={codeData} defaultValue={codeData[0].filename}>
      <CodeBlockHeader>
        <CodeBlockFiles>
          {(item) => (
            <CodeBlockFilename key={item.filename} value={item.filename}>
              {item.filename}
            </CodeBlockFilename>
          )}
        </CodeBlockFiles>
        <CodeBlockSelect>
          {(item) => (
            <CodeBlockSelectItem key={item.filename} id={item.filename}>
              {item.filename}
            </CodeBlockSelectItem>
          )}
        </CodeBlockSelect>
        <CodeBlockCopyButton
          onCopy={() => console.log("Copied code to clipboard")}
          onError={() => console.error("Failed to copy code to clipboard")}
        />
      </CodeBlockHeader>
      <CodeBlockBody>
        {(item) => (
          <CodeBlockItem key={item.filename} value={item.filename}>
            <CodeBlockContent language={item.language as any}>
              {item.code}
            </CodeBlockContent>
          </CodeBlockItem>
        )}
      </CodeBlockBody>
    </CodeBlock>
  )
}

Installation

npx shadcn@latest add @taki/code-block-multiple-files

Usage

import { CodeBlockMultipleFiles } from "@/components/code-block-multiple-files"
<CodeBlockMultipleFiles />