Skip to content

useText Composable

Overview

The useText composable provides text manipulation capabilities for your canvas. It allows you to add new text elements and update existing ones with full typography control including fonts, sizes, colors, and styling options.

Demo

Basic Usage

vue
<template>
  <div>
    <canvas ref="canvasRef" />
    <div class="text-controls">
      <input v-model="textContent" placeholder="Enter text" />
      <button @click="addNewText">Add Text</button>
      <button @click="updateSelectedText" :disabled="!isTextSelected">
        Update Text
      </button>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref, computed } from "vue";
import { useTemplateRef } from "vue";
import { useCanvas, useText } from "vue-printables";

const canvasRef = useTemplateRef("canvasRef");
const textContent = ref("Hello World");

// Initialize canvas
const canvasState = useCanvas(canvasRef, {
  bgImg: {
    url: "/t-shirt.jpg",
  },
});

// Initialize text operations
const { addText, updateText } = useText(canvasState);

const isTextSelected = computed(
  () => canvasState.activeObj.value?.type === "text",
);

const addNewText = () => {
  addText({
    text: textContent.value,
    fontFamily: "Arial",
    fontSize: 24,
    fontWeight: "normal",
    underline: false,
  });
};

const updateSelectedText = () => {
  if (isTextSelected.value) {
    updateText({
      text: textContent.value,
      fontSize: 28,
      fill: "#ff0000",
    });
  }
};
</script>

Parameters

canvasRef

  • Type: CanvasTemplateRef
  • Description: Object containing canvas state from useCanvas
ts
type CanvasTemplateRef = {
  canvasInstance: ShallowRef<Canvas | null>;
  designArea: ShallowRef<Rect | null>;
  clipPath: ShallowRef<Rect | null>;
  activeObj: ShallowRef<FabricObject | null>;
};

Return Values

The composable returns an object with the following methods:

addText(textConfig)

  • Type: (textConfig: TextConfigs) => void
  • Description: Adds a new text element to the canvas with the specified configuration. The text is automatically centered within the clip path and includes a delete control.

Example:

ts
addText({
  text: "Custom Text",
  fontFamily: "Helvetica",
  fontSize: 32,
  fontWeight: "bold",
  fontStyle: "italic",
  underline: true,
  fill: "#3366cc",
});

updateText(textConfig)

  • Type: (textConfig: TextConfigs) => void
  • Description: Updates the currently selected text element with new properties.

Example:

ts
updateText({
  fontSize: 36,
  fill: "#ff6600",
});

Throws Error:

  • If no object is selected
  • If selected object is not a text element

TextConfigs Interface

ts
interface TextConfigs {
  text: string;
  fontFamily: string;
  fontSize: number;
  fontWeight: "normal" | "bold";
  fontStyle?: "" | "normal" | "italic" | "oblique";
  underline: boolean;
  fill?: string;
  stroke?: string;
  [key: string]: any; // Allows additional Fabric.js text properties
}

Properties

PropertyTypeRequiredDefaultDescription
textstringYes-The text content to display
fontFamilystringYes-Font family name (e.g., 'Arial', 'Helvetica')
fontSizenumberYes-Font size in pixels
fontWeight'normal' | 'bold'Yes-Font weight
underlinebooleanYes-Whether text is underlined
fontStylestringNo'normal'Font style (italic, oblique)
fillstringNo'#000000'Text fill color
strokestringNo-Text stroke color

Released under the MIT License.