Skip to main content

Installation & Getting Started

Canvas UI is a high-performance React library for building interactive graphics and interfaces using HTML5 Canvas. This guide will help you install and set up Canvas UI in your project.

Installation

Canvas UI consists of two main packages that work together to provide a complete canvas-based UI solution:

Core Packages

@canvas-ui/core

  • The foundational rendering engine and graphics primitives
  • Provides low-level canvas drawing capabilities
  • Handles layout, hit testing, and paint optimizations
  • Framework-agnostic core functionality

@canvas-ui/react

  • React bindings and components for Canvas UI
  • Provides React hooks and declarative API
  • Depends on @canvas-ui/core
  • Recommended for most React applications

Quick Install

For most React projects, you only need to install the React package:

npm install @canvas-ui/react

This automatically includes the core package as a dependency.

Advanced Installation

If you need additional features, you can install optional packages:

# Animation utilities
npm install @canvas-ui/animation

Or without React bindings

# Animation utilities
npm install @canvas-ui/core

System Requirements

Canvas UI works in all modern browsers and React environments:

  • React: 19.0.0 or later
  • TypeScript: 4.5 or later (optional but recommended)
  • Browsers: Chrome 80+, Firefox 75+, Safari 13+, Edge 80+
  • Node.js: 18+ (for build tools)

Basic Usage

After installation, you can start using Canvas UI components in your React application.

Hello World Example

Live Editor
function HelloWorld() {
  const { Canvas, Text } = importCanvasUIPackages()

  return (
    <div style={{ height: '150px', border: '1px solid #ddd', borderRadius: '8px' }}>
      <Canvas>
        <Text
          style={{
            fontSize: 18,
            color: '#2196f3',
            fontWeight: 'bold'
          }}
          text="Hello, Canvas UI!"
        />
      </Canvas>
    </div>
  )
}
Result
Loading...

Complete Application Setup

Here's how to integrate Canvas UI into a React application:

import React from 'react'
import { createRoot } from 'react-dom/client'
import { Canvas, Text, Flex } from '@canvas-ui/react'

function App() {
return (
<div style={{ height: '100vh', backgroundColor: '#f5f5f5' }}>
<Canvas>
<Flex
style={{
flexDirection: 'column',
padding: 20,
gap: 10,
justifyContent: 'center',
alignItems: 'center',
height: '100%'
}}
>
<Text
style={{
fontSize: 24,
fontWeight: 'bold',
color: '#333'
}}
text="Welcome to Canvas UI"
/>
<Text
style={{
fontSize: 16,
color: '#666'
}}
text="High-performance React canvas components"
/>
</Flex>
</Canvas>
</div>
)
}

const root = createRoot(document.getElementById('root')!)
root.render(<App />)

Key Concepts

Canvas Root Component

Every Canvas UI application must have a <Canvas /> root component:

  • Acts as the bridge between React and the HTML Canvas API
  • All Canvas UI components must be descendants of Canvas
  • Automatically manages canvas sizing and device pixel ratio
  • Handles event delegation and rendering optimization
// ✅ Correct - Canvas UI components inside Canvas
<Canvas>
<Text>This works!</Text>
<Flex>
<Text>Nested components work too</Text>
</Flex>
</Canvas>

// ❌ Incorrect - Canvas UI components outside Canvas
<div>
<Text>This won't work</Text>
</div>

Container Sizing

The Canvas component fills its parent container completely. You must provide explicit dimensions:

Live Editor
function SizingExample() {
  const { Canvas, Text } = importCanvasUIPackages()

  return (
    <div style={{
      width: '300px',
      height: '200px',
      border: '2px solid #2196f3',
      borderRadius: '8px',
      backgroundColor: '#f8f9fa'
    }}>
      <Canvas>
        <Text
          style={{
            fontSize: 16,
            color: '#333',
            padding: 16
          }}
          text="Canvas fills the blue container"
        />
      </Canvas>
    </div>
  )
}
Result
Loading...

Mixing with HTML

Canvas UI components render to canvas, but you can mix them with regular HTML:

Live Editor
function MixedContentExample() {
  const { Canvas, Flex, Text } = importCanvasUIPackages()

  return (
    <div style={{ padding: '20px' }}>
      <h3 style={{ margin: '0 0 10px 0', color: '#333' }}>HTML Header</h3>

      <div style={{ height: '120px', border: '1px solid #ddd', marginBottom: '10px' }}>
        <Canvas>
          <Flex style={{ padding: 16, gap: 8, width: 200 }}>
            <Text style={{ fontSize: 14, color: '#2196f3' }} text="Canvas UI Text" />
            <Text style={{ fontSize: 14, color: '#4caf50' }} text="More Canvas Content" />
          </Flex>
        </Canvas>
      </div>

      <p style={{ margin: 0, fontSize: '14px', color: '#666' }}>
        Regular HTML paragraph below the canvas
      </p>
    </div>
  )
}
Result
Loading...

Common Issues & Solutions

Issue: Can't See Any Content

Problem: The Canvas appears empty or shows no content.

Solution: Ensure the Canvas container has explicit height:

Live Editor
function HeightIssueDemo() {
  const { Canvas, Text } = importCanvasUIPackages()

  const [hasHeight, setHasHeight] = useState(true)

  return (
    <div>
      <button
        onClick={() => setHasHeight(!hasHeight)}
        style={{ marginBottom: '10px' }}
      >
        {hasHeight ? 'Remove Height' : 'Add Height'}
      </button>

      <div
        style={{
          height: hasHeight ? '120px' : undefined,
          border: '2px solid red',
          borderRadius: '4px'
        }}
      >
        <Canvas>
          <Text
            style={{ fontSize: 16, padding: 16 }}
            text={`Container height: ${hasHeight ? '120px' : 'auto (0px)'}`}
          />
        </Canvas>
      </div>
    </div>
  )
}
Result
Loading...

Issue: Performance Problems

Problem: Canvas rendering feels slow or choppy.

Solutions:

  • Use Chunk for large lists
  • Enable repaint boundaries with repaintBoundary={true}
  • Minimize complex layouts and use absolute positioning when possible

Issue: Events Not Working

Problem: Click or hover events don't respond.

Solutions:

  • Ensure components have proper size (width/height > 0)
  • Check that hitTestDisabled={false} (default)
  • Verify event handlers are attached to the correct component
Live Editor
function EventsExample() {
  const { Canvas, Flex, Text } = importCanvasUIPackages()

  const [message, setMessage] = useState('Click the blue box')

  return (
    <div style={{ height: '120px', border: '1px solid #ddd' }}>
      <Canvas>
        <Flex style={{ padding: 20, gap: 10, flexDirection: 'column', width: 200 }}>
          <Flex
            style={{
              width: 150,
              height: 40,
              backgroundColor: '#2196f3',
              borderRadius: 4,
              justifyContent: 'center',
              alignItems: 'center',
              cursor: 'pointer'
            }}
            onPointerDown={() => setMessage('Box clicked!')}
            onPointerOver={() => setMessage('Hovering over box')}
            onPointerOut={() => setMessage('Click the blue box')}
          >
            <Text style={{ color: 'white', fontSize: 14 }} text="Click me" />
          </Flex>
          <Text style={{ fontSize: 12, color: '#666' }} text={message} />
        </Flex>
      </Canvas>
    </div>
  )
}
Result
Loading...

TypeScript Support

Canvas UI is written in TypeScript and provides excellent type safety:

import { Canvas, Text, Flex } from '@canvas-ui/react'
import type { StyleProps } from '@canvas-ui/react'

// Full type safety for styles and props
const textStyle: StyleProps = {
fontSize: 16,
color: '#333',
fontWeight: 'bold'
}

function TypedComponent() {
return (
<Canvas>
<Text style={textStyle} text="Fully typed!" />
</Canvas>
)
}

Bundle Size

Canvas UI is optimized for production use:

  • @canvas-ui/react: ~150KB minified + gzipped
  • @canvas-ui/core: ~120KB minified + gzipped
  • Tree-shaking friendly for smaller bundles
  • No external dependencies beyond React