Skip to content

Front/Back Product Design

This example demonstrates how to create a product designer with front and back views using Vue Printables. Users can toggle between sides while maintaining separate designs for each view.

Demo

FrontBack

Usage

Key Concepts

  1. Canvas State Management - Store inactive canvas JSON to preserve designs
  2. Background Switching - Update product images when toggling sides
  3. Design Persistence - Maintain separate element collections per side

Template

vue
<template>
  <div class="container">
    <!-- Toggle Controls -->
    <div class="controls">
      <div class="actions-container">
        <button @click="handleAddImage">Add Image</button>
        <button @click="handleAddText">Add Text</button>
      </div>

      <!-- Front/Back Toggle -->
      <div class="toggle-wrapper">
        <span>Front</span>
        <label class="switch">
          <input
            v-model="isBackSide"
            type="checkbox"
            @change="handleChangeSide"
          />
          <div class="switch-slider"></div>
        </label>
        <span>Back</span>
      </div>
    </div>

    <!-- Canvas Area -->
    <div class="canvas-wrapper">
      <canvas ref="mainCanvas" />
    </div>
  </div>
</template>

State Management

ts
const isBackSide = ref(false);
const inactiveCanvasJson = shallowRef();

const handleChangeSide = async () => {
  if (!canvasInstance.value) return;

  // Save current canvas state
  const activeCanvasJson = canvasInstance.value?.toJSON();

  // Load inactive side
  await loadAsJson(inactiveCanvasJson.value);

  // Store previous active state
  inactiveCanvasJson.value = { ...activeCanvasJson };

  // Update background image if needed
  if (
    canvasInstance.value.toJSON().backgroundImage.src ===
    inactiveCanvasJson.value.backgroundImage.src
  ) {
    await updateBgImage({
      url: isBackSide.value ? backImage : frontImage,
    });
  }
};

Canvas Configuration

ts
const {
  activeObj,
  canvasInstance,
  clipPath,
  designArea,
  initCanvas,
  loadAsJson,
  updateBgImage,
} = useCanvas(canvasRef, {
  bgImg: {
    url: frontImage,
  },
  clipPathOption: {
    movable: true,
  },
  size: { height: 400, width: 400 },
});

Check the Source file for full code preview.

Released under the MIT License.