Skip to main content

Quick Start Guide

Get up and running with Fuderu in just a few minutes. This guide will walk you through creating your first drawing application using Fuderu with different frameworks.

Prerequisites

  • Basic knowledge of HTML, CSS, and JavaScript/TypeScript
  • Node.js 14+ installed (for framework examples)
  • Familiarity with your chosen framework (React, Vue, Svelte, or vanilla JS)

Option 1: Vanilla JavaScript/TypeScript

Step 1: Install Fuderu

npm install fuderu

Step 2: Create HTML File

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Fuderu Drawing App</title>
<style>
body {
margin: 0;
padding: 20px;
background: #f5f5f5;
font-family: sans-serif;
}
#drawing-container {
max-width: 800px;
margin: 0 auto;
background: white;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
.toolbar {
padding: 15px;
background: #f8f9fa;
border-bottom: 1px solid #eee;
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.toolbar-group {
display: flex;
align-items: center;
gap: 5px;
}
canvas {
display: block;
width: 100%;
height: 600px;
background: white;
}
</style>
</head>
<body>
<div id="drawing-container">
<div class="toolbar">
<div class="toolbar-group">
<label for="color-picker">Color:</label>
<input type="color" id="color-picker" value="#ff0000" />
</div>
<div class="toolbar-group">
<label for="size-slider">Size:</label>
<input type="range" id="size-slider" min="1" max="50" value="10" />
<span id="size-value">10px</span>
</div>
<div class="toolbar-group">
<button id="clear-btn">Clear</button>
</div>
<div class="toolbar-group">
<button id="undo-btn">Undo</button>
</div>
<div class="toolbar-group">
<button id="redo-btn">Redo</button>
</div>
</div>
<div>
<canvas id="drawing-canvas" width="800" height="600"></canvas>
</div>
</div>

<script type="module">
import { Canvas } from "fuderu";

const canvas = document.getElementById("drawing-canvas");
const colorPicker = document.getElementById("color-picker");
const sizeSlider = document.getElementById("size-slider");
const sizeValue = document.getElementById("size-value");
const clearBtn = document.getElementById("clear-btn");
const undoBtn = document.getElementById("undo-btn");
const redoBtn = document.getElementById("redo-btn");

let painter = null;

// Initialize Fuderu canvas
function initCanvas() {
if (!canvas) return;

painter = new Canvas({
canvas,
document: {
width: 800,
height: 600,
},
brush: {
color: colorPicker.value,
size: parseInt(sizeSlider.value),
},
});
}

// Update brush color
function updateColor() {
if (painter) {
painter.loadConfig({ color: colorPicker.value });
}
}

// Update brush size
function updateSize() {
if (painter) {
const size = parseInt(sizeSlider.value);
painter.loadConfig({ size });
sizeValue.textContent = `${size}px`;
}
}

// Clear canvas
function clearCanvas() {
if (painter) {
painter.clear();
}
}

// Undo last action
function undo() {
if (painter) {
painter.undo();
}
}

// Redo last action
function redo() {
if (painter) {
painter.redo();
}
}

// Event listeners
colorPicker.addEventListener("change", updateColor);
sizeSlider.addEventListener("input", updateSize);
clearBtn.addEventListener("click", clearCanvas);
undoBtn.addEventListener("click", undo);
redoBtn.addEventListener("click", redo);

// Initialize
initCanvas();
</script>
</body>
</html>

Option 2: React

Step 1: Install Dependencies

npm install fuderu

Step 2: Create Drawing Component

Create src/components/DrawingCanvas.jsx:

import { useEffect, useRef } from "react";
import { Canvas } from "fuderu";

function DrawingCanvas({ width = 800, height = 600 }) {
const canvasRef = useRef(null);

useEffect(() => {
const canvas = canvasRef.current;
if (!canvas) return;

const painter = new Canvas({
canvas,
document: { width, height },
brush: {
color: "#ff0000",
size: 10,
},
});

// Cleanup on unmount
return () => {
if (painter) {
painter.destroy();
}
};
}, [width, height]);

return <canvas ref={canvasRef} width={width} height={height} />;
}

export default DrawingCanvas;

Step 3: Use the Component

import React from "react";
import DrawingCanvas from "./components/DrawingCanvas";

function App() {
return (
<div className="App">
<header className="App-header">
<h1>Fuderu Drawing App</h1>
</header>
<div className="drawing-container">
<DrawingCanvas width={800} height={600} />
</div>
</div>
);
}

export default App;

Option 3: Vue 3

Step 1: Install Dependencies

npm install fuderu

Step 2: Create Drawing Component

Create src/components/DrawingCanvas.vue:

<template>
<canvas ref="canvas" width="800" height="600"></canvas>
</template>

<script>
import { onMounted, onUnmounted, ref } from "vue";
import { Canvas } from "fuderu";

export default {
name: "DrawingCanvas",
setup() {
const canvas = ref(null);
let painter = null;

onMounted(() => {
if (!canvas.value) return;

painter = new Canvas({
canvas: canvas.value,
document: {
width: 800,
height: 600,
},
brush: {
color: "#ff0000",
size: 10,
},
});
});

onUnmounted(() => {
if (painter) {
painter.destroy();
}
});

return {
canvas,
};
},
};
</script>

<style scoped>
canvas {
display: block;
background: white;
}
</style>

Step 3: Use the Component

In your App.vue or page component:

<template>
<div>
<h1>Fuderu Drawing App</h1>
<DrawingCanvas />
</div>
</template>

<script>
import DrawingCanvas from "./components/DrawingCanvas.vue";

export default {
name: "App",
components: {
DrawingCanvas,
},
};
</script>

Option 4: Svelte

Step 1: Install Dependencies

npm install fuderu

Step 2: Create Drawing Component

Create src/lib/DrawingCanvas.svelte:

<script>
import { onMount, onDestroy } from 'svelte';
import { Canvas } from 'fuderu';

let canvas;
let painter = null;

onMount(() => {
if (!canvas) return;

painter = new Canvas({
canvas,
document: {
width: 800,
height: 600
},
brush: {
color: '#ff0000',
size: 10
}
});
});

onDestroy(() => {
if (painter) {
painter.destroy();
painter = null;
}
});
</script>

<canvas bind:this={canvas} width="800" height="600" />

Step 3: Use the Component

Modify src/routes/+page.svelte:

<script>
import DrawingCanvas from '../lib/DrawingCanvas.svelte';
</script>

<svelte:head>
<title>Fuderu Drawing App</title>
</svelte:head>

<div class="container">
<h1>Fuderu Drawing App</h1>
<div class="drawing-container">
<DrawingCanvas />
</div>
</div>

<style>
.container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
text-align: center;
}

.drawing-container {
margin-top: 20px;
}
</style>

Step 4: Run the Application

npm run dev

Next Steps

Now that you have a basic drawing application running, consider exploring these features:

  1. Brush Configuration - Customize brush behavior for different effects
  2. Modules - Add special effects like texture, jitter, and patterns
  3. Image Brushes - Use custom images as brush tips
  4. Layer System - Learn how to create complex drawings with multiple layers
  5. React Integration - Learn advanced patterns for React apps
  6. Performance Optimization - Ensure your application runs smoothly on all devices

Common Issues and Solutions

"Canvas is not defined" Error

Make sure you're running your code in a browser environment. Fuderu requires the HTML Canvas API and won't work in Node.js without a canvas implementation like canvas.

Nothing Appears on Canvas

  • Check that your canvas element has explicit width and height attributes (not just CSS)
  • Verify that you've successfully created a Canvas instance
  • Ensure you're calling methods on the correct painter instance

Poor Performance

  • Reduce your canvas size if it's unnecessarily large
  • Consider disabling expensive features like complex patterns or high-density scattering
  • Use the performance profiling tips in our Performance Guide

Events Not Working

  • Make sure you're attaching event listeners to the correct element
  • Check if another element is covering your canvas (z-index issues)
  • Verify that you're not preventing default behavior unnecessarily

Where to Go Next

Try the interactive editor or revisit the Layer System guide for more advanced workflows.

Join our Discord community to ask questions, share your creations, and get help from other developers.

Happy drawing! 🎨