@blade47/editorjs-drawing-tool
Version:
Drawing Tool for Editor.js
191 lines (140 loc) • 5.29 kB
Markdown
# Drawing Tool
**Drawing Tool Block** for the [Editor.js](https://editorjs.io).
https://github.com/user-attachments/assets/e19af1f4-e933-4118-8a9c-0202bf3fb020
## Features
- **Image Uploading**: Upload images directly from the user's device.
- **Text Customization**: Control text properties like color, size, alignment, and style.
- **Linking**: Add hyperlinks to text.
- **Image Saving**: Supports saving images as base64-encoded strings or remotely via a custom uploader.
- **Configurable Height**: Customize the height of the drawing tool's canvas.
> **Note**: No server-side implementation is required for image uploading when using base64 encoding.
## Installation
Install the Drawing Tool package via Yarn:
```bash
yarn add @blade47/drawing-tool
```
### Import the Module
To use the tool in your project, include it as:
```javascript
import DrawingTool from '@blade47/drawing-tool';
```
## Usage
Add the Drawing Tool to the `tools` property of your Editor.js configuration:
```javascript
import DrawingTool from '@blade47/drawing-tool';
const editor = new EditorJS({
tools: {
drawingTool: {
class: DrawingTool,
},
},
});
```
You can also configure the tool with custom options (see the **Configuration Parameters** section for details).
## Configuration Parameters
The Drawing Tool supports the following configuration parameters:
| **Field** | **Type** | **Description** |
|----------------------|--------------------------------------------|-------------------------------------------------------------|
| uploader.uploadImage | `(base64Image: string) => Promise<string>` | *Optional*. A custom image uploader. See details below. |
> If no custom uploader is provided in the configuration, the tool embeds images into the response as base64-encoded strings.
## Output Data
When the tool produces output, the data will have the following structure:
| **Field** | **Type** | **Description** |
|---------------|-----------------|-----------------------------------------------------|
| canvasJson | `string` | JSON string representing the content of the canvas. |
| canvasImages | `ImageData[]` | Array of image data. |
| canvasHeight | `number` | Height of the canvas. |
### Output Data Example
```json
{
"type": "drawingTool",
"data": {
"canvasJson": "{\"attrs\":{},\"className\":\"Layer\",\"children\":[{\"attrs\":{\"enabledAnchors\":[\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"],\"padding\":5,\"borderStroke\":\"#00ff00\",\"anchorStroke\":\"#00ff00\",\"anchorFill\":\"#ffffff\"},\"className\":\"Transformer\"}]}",
"canvasImages": [
{
"id": "image-mmxLYrn_iY-1740849273717",
"src": "link or base64 encoded image",
"attrs": {
"image": {},
"x": 258.6185044359949,
"y": 73.33333333333331,
"width": 582.7629911280102,
"height": 586.6666666666667,
"draggable": true,
"name": "object",
"id": "image-mmxLYrn_iY-1740849273717"
}
}
],
"canvasHeight": 700
}
}
```
## TypeScript Types
```typescript
export interface KonvaDrawingToolData {
canvasJson: string | null;
canvasImages: ImageData[];
canvasHeight: number;
}
export interface ImageData {
id: string;
src: string;
attrs: {
x: number;
y: number;
width: number;
height: number;
scaleX: number;
scaleY: number;
rotation: number;
[key: string]: unknown;
};
}
export interface KonvaDrawingToolConfig {
uploader?: {
uploadImage?: (base64Image: string) => Promise<string>;
};
}
```
## Using a Custom Image Uploading Method
You can provide your own method to handle image uploads. The custom uploader can be passed via the `uploader` configuration parameter.
### Custom Image Uploader
The `uploadImage` method accepts a base64-encoded image string and should return a `Promise` resolving to the uploaded image's public URL.
#### Example:
```javascript
import DrawingTool from '@blade47/drawing-tool';
const editor = new EditorJS({
tools: {
drawingTool: {
class: DrawingTool,
config: {
uploader: {
/**
* Upload image file to the server and return the uploaded image URL
* @param {string} base64Image - Base64 encoded string of the selected image
* @return {Promise<string>}
*/
async uploadImage(base64Image: string): Promise<string> {
// Implement your custom upload logic here
return MyAjax.upload(base64Image).then((link) => link);
},
},
},
},
},
});
```
## Key Points About Image Uploading
- **Default Behavior**: If no custom uploader is provided, images are embedded directly as base64-encoded data.
- **Custom Uploader**: The provided `uploadImage` method must return a URL pointing to the uploaded image.
This flexibility allows you to either keep everything client-side (base64) or implement a server-side upload mechanism tailored to your use case.