Skip to content

CopyButton

A button component for copying text to the clipboard with visual feedback.

import { CopyButton } from 'asterui'

Basic Usage

Simple copy button with default icon. Enable tooltip for visual feedback.

import { CopyButton, Space } from 'asterui'

function App() {
  return (
      <Space>
        <CopyButton text="Hello, World!" />
        <CopyButton text="Copy this text" showTooltip />
      </Space>
    )
}

export default App

With Text Content

Display text content instead of the default icon.

import { CopyButton, Space } from 'asterui'

function App() {
  return (
      <Space direction="vertical">
        <CopyButton text="npm install asterui">
          npm install asterui
        </CopyButton>
        <CopyButton text="pnpm add asterui" copiedChildren="Copied!">
          pnpm add asterui
        </CopyButton>
      </Space>
    )
}

export default App

Colors

Apply different color themes to the button.

import { CopyButton, Space } from 'asterui'

function App() {
  return (
      <Space>
        <CopyButton text="primary" color="primary" showTooltip />
        <CopyButton text="secondary" color="secondary" showTooltip />
        <CopyButton text="accent" color="accent" showTooltip />
        <CopyButton text="success" color="success" showTooltip />
      </Space>
    )
}

export default App

Variants

Different button style variants.

import { CopyButton, Space } from 'asterui'

function App() {
  return (
      <Space>
        <CopyButton text="solid" color="primary" />
        <CopyButton text="outline" color="primary" variant="outline" />
        <CopyButton text="ghost" variant="ghost" />
        <CopyButton text="soft" color="primary" variant="soft" />
      </Space>
    )
}

export default App

Sizes

Available button sizes.

import { CopyButton, Space } from 'asterui'

function App() {
  return (
      <Space align="center">
        <CopyButton text="xs" size="xs" />
        <CopyButton text="sm" size="sm" />
        <CopyButton text="md" size="md" />
        <CopyButton text="lg" size="lg" />
        <CopyButton text="xl" size="xl" />
      </Space>
    )
}

export default App

Shapes

Square and circle button shapes.

import { CopyButton, Space } from 'asterui'

function App() {
  return (
      <Space>
        <CopyButton text="square" shape="square" />
        <CopyButton text="circle" shape="circle" />
      </Space>
    )
}

export default App

Code Block

Copy button positioned in the corner of a custom code block.

import { CopyButton } from 'asterui'

export const App = () => (
  <CopyButton text="Hello!" showTooltip />
)
import { CopyButton } from 'asterui'

function App() {
  const codeText = `import { CopyButton } from 'asterui'
  
  export const App = () => (
    <CopyButton text="Hello!" showTooltip />
  )`
  
  return (
      <div style={{ position: 'relative' }} className="bg-base-300 rounded-lg p-4 pr-12">
        <pre className="font-mono text-sm whitespace-pre">{codeText}</pre>
        <div style={{ position: 'absolute', top: 8, right: 8 }}>
          <CopyButton text={codeText} size="sm" variant="ghost" showTooltip />
        </div>
      </div>
    )
}

export default App

Input with Copy

Copy the value from an input field.

import { CopyButton, Input } from 'asterui'
import { useState } from 'react'

function App() {
  const [value, setValue] = useState('https://asterui.com')
  
  return (
      <div className="flex gap-2">
        <Input value={value} onChange={(e) => setValue(e.target.value)} />
        <CopyButton text={value} color="primary" showTooltip />
      </div>
    )
}

export default App

Callbacks

Handle copy success and error events.

import { CopyButton } from 'asterui'

function App() {
  return (
      <CopyButton
        text="Callback example"
        color="primary"
        onCopy={() => console.log('Copied!')}
        onError={(err) => console.error('Failed:', err)}
      >
        Copy with callback
      </CopyButton>
    )
}

export default App

Custom Timeout

Control how long the copied state is shown.

import { CopyButton, Space } from 'asterui'

function App() {
  return (
      <Space>
        <CopyButton text="1 second" timeout={1000}>1s timeout</CopyButton>
        <CopyButton text="5 seconds" timeout={5000}>5s timeout</CopyButton>
      </Space>
    )
}

export default App
PropertyDescriptionTypeDefault
textText to copy to clipboardstring-
timeoutDuration in ms to show copied statenumber2000
colorButton color'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'neutral'-
variantButton style variant'solid' | 'outline' | 'dash' | 'soft' | 'ghost' | 'link'-
sizeButton size'xs' | 'sm' | 'md' | 'lg' | 'xl''md'
shapeButton shape'square' | 'circle'-
iconCustom icon for default stateReactNodeCopy icon
copiedIconCustom icon for copied stateReactNodeCheck icon
childrenCustom content for default state (overrides icon)ReactNode-
copiedChildrenCustom content for copied stateReactNode-
onCopyCallback when copy succeeds() => void-
onErrorCallback when copy fails(error: Error) => void-
showTooltipShow tooltip with copy statusbooleanfalse
tooltipTextTooltip text for default statestring'Copy'
copiedTooltipTextTooltip text for copied statestring'Copied!'
disabledDisable the buttonbooleanfalse
  • Uses native button element for keyboard support
  • Visual feedback through icon change and optional tooltip
  • Disabled state is properly communicated