• Blog
  • Docs
  • Pricing
  • We’re hiring!
Log inSign up
drewmcdonald

drewmcdonald

promptCompare

Public
Like
promptCompare
Home
Code
7
.claude
3
backend
2
docs
1
frontend
4
shared
.mcp.json
deno.json
Environment variables
2
Branches
1
Pull requests
Remixes
History
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.
Sign up now
Code
/
.claude
/
skills
/
ai-elements
/
references
/
code-block.md
Code
/
.claude
/
skills
/
ai-elements
/
references
/
code-block.md
Search
…
Viewing readonly version of main branch: v117
View latest version
code-block.md

Code Block

Provides syntax highlighting, line numbers, and copy to clipboard functionality for code blocks.

The CodeBlock component provides syntax highlighting, line numbers, and copy to clipboard functionality for code blocks. It's fully composable, allowing you to customize the header, actions, and content.

See scripts/code-block.tsx for this example.

Installation

npx ai-elements@latest add code-block

Usage

The CodeBlock is fully composable. Here's a basic example:

Create val
import { CodeBlock, CodeBlockActions, CodeBlockCopyButton, CodeBlockFilename, CodeBlockHeader, CodeBlockTitle, } from "@/components/ai-elements/code-block"; import { FileIcon } from "lucide-react"; export const Example = () => ( <CodeBlock code={code} language="typescript"> <CodeBlockHeader> <CodeBlockTitle> <FileIcon size={14} /> <CodeBlockFilename>example.ts</CodeBlockFilename> </CodeBlockTitle> <CodeBlockActions> <CodeBlockCopyButton /> </CodeBlockActions> </CodeBlockHeader> </CodeBlock> );

Features

  • Syntax highlighting with Shiki
  • Line numbers (optional)
  • Copy to clipboard functionality
  • Automatic light/dark theme switching via CSS variables
  • Language selector for multi-language examples
  • Fully composable architecture
  • Accessible design

Examples

Dark Mode

To use the CodeBlock component in dark mode, wrap it in a div with the dark class.

See scripts/code-block-dark.tsx for this example.

Language Selector

Add a language selector to switch between different code implementations:

See scripts/code-block.tsx for this example.

Props

<CodeBlock />

PropTypeDefaultDescription
codestring-The code content to display.
languageBundledLanguage-The programming language for syntax highlighting.
showLineNumbersbooleanfalseWhether to show line numbers.
childrenReact.ReactNode-Child elements like CodeBlockHeader.
classNamestring-Additional CSS classes.

<CodeBlockHeader />

Container for the header row. Uses flexbox with justify-between.

PropTypeDefaultDescription
childrenReact.ReactNode-Header content (CodeBlockTitle, CodeBlockActions, etc.).
classNamestring-Additional CSS classes.

<CodeBlockTitle />

Left-aligned container for icon and filename. Uses flexbox with gap-2.

PropTypeDefaultDescription
childrenReact.ReactNode-Title content (icon, CodeBlockFilename, etc.).
classNamestring-Additional CSS classes.

<CodeBlockFilename />

Displays the filename in monospace font.

PropTypeDefaultDescription
childrenReact.ReactNode-The filename to display.
classNamestring-Additional CSS classes.

<CodeBlockActions />

Right-aligned container for action buttons. Uses flexbox with gap-2.

PropTypeDefaultDescription
childrenReact.ReactNode-Action buttons (CodeBlockCopyButton, CodeBlockLanguageSelector, etc.).
classNamestring-Additional CSS classes.

<CodeBlockCopyButton />

PropTypeDefaultDescription
onCopy() => void-Callback fired after a successful copy.
onError(error: Error) => void-Callback fired if copying fails.
timeoutnumber2000How long to show the copied state (ms).
childrenReact.ReactNode-Custom content for the button. Defaults to copy/check icons.
classNamestring-Additional CSS classes.

<CodeBlockLanguageSelector />

Wrapper for the language selector. Extends shadcn/ui Select.

PropTypeDefaultDescription
valuestring-The currently selected language.
onValueChange(value: string) => void-Callback when the language changes.
childrenReact.ReactNode-Selector components (Trigger, Content, Items).

<CodeBlockLanguageSelectorTrigger />

Trigger button for the language selector dropdown. Pre-styled for code block header.

<CodeBlockLanguageSelectorValue />

Displays the selected language value.

<CodeBlockLanguageSelectorContent />

Dropdown content container. Defaults to align="end".

<CodeBlockLanguageSelectorItem />

Individual language option in the dropdown.

PropTypeDefaultDescription
valuestring-The language value.
childrenReact.ReactNode-The display label.

<CodeBlockContainer />

Low-level container component with performance optimizations (contentVisibility). Used internally by CodeBlock.

<CodeBlockContent />

Low-level component that handles syntax highlighting. Used internally by CodeBlock, but can be used directly for custom layouts.

PropTypeDefaultDescription
codestring-The code content to display.
languageBundledLanguage-The programming language for syntax highlighting.
showLineNumbersbooleanfalseWhether to show line numbers.
FeaturesVersion controlCode intelligenceCLIMCP
Use cases
TeamsAI agentsSlackGTM
DocsShowcaseTemplatesNewestTrendingAPI examplesNPM packages
PricingNewsletterBlogAboutCareers
We’re hiring!
Brandhi@val.townStatus
X (Twitter)
Discord community
GitHub discussions
YouTube channel
Bluesky
Open Source Pledge
Terms of usePrivacy policyAbuse contact
© 2026 Val Town, Inc.