diff --git a/frontend/src/assets/previews/people_banner_with_predefined_text.png b/frontend/src/assets/previews/people_banner_with_predefined_text.png
new file mode 100644
index 0000000000000000000000000000000000000000..0079fdfde7b963b7242a01246a9990778e10980c
Binary files /dev/null and b/frontend/src/assets/previews/people_banner_with_predefined_text.png differ
diff --git a/frontend/src/assets/template/people_banner_with_custom_text/bg.png b/frontend/src/assets/template/people_banner_with_custom_text/bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..94e9df88dfad6ad3e6aeaf42bb5be945415e73a5
Binary files /dev/null and b/frontend/src/assets/template/people_banner_with_custom_text/bg.png differ
diff --git a/frontend/src/assets/template/people_banner_with_predefined_text/bg.png b/frontend/src/assets/template/people_banner_with_predefined_text/bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a2d35b3d1767efd08e605ab42b17f73fc42e632
Binary files /dev/null and b/frontend/src/assets/template/people_banner_with_predefined_text/bg.png differ
diff --git a/frontend/src/templates.js b/frontend/src/templates.js
index 94cb7b5453893bc8b47f65b1c5c5fa59e42a98e4..bd4d17c37c25009c806add7d09f34b97a91c96f7 100644
--- a/frontend/src/templates.js
+++ b/frontend/src/templates.js
@@ -14,10 +14,13 @@ import rightEventImage from "./assets/previews/right_event.png";
 import angleEventRightImage from "./assets/previews/angle_event_right.png";
 import angleEventLeftImage from "./assets/previews/angle_event_left.png";
 
-import basePersonEventImage from "./assets/previews/base_person_event.png";
-import rightPersonEventImage from "./assets/previews/right_person_event.png";
-import anglePersonEventRightImage from "./assets/previews/angle_person_event_right.png";
-import anglePersonEventLeftImage from "./assets/previews/angle_person_event_left.png";
+// import basePersonEventImage from "./assets/previews/base_person_event.png";
+// import rightPersonEventImage from "./assets/previews/right_person_event.png";
+// import anglePersonEventRightImage from "./assets/previews/angle_person_event_right.png";
+// import anglePersonEventLeftImage from "./assets/previews/angle_person_event_left.png";
+
+import peopleBannerWithPredefinedTextImage from "./assets/previews/people_banner_with_predefined_text.png";
+import peopleBannerWithCustomTextImage from "./assets/previews/people_banner_with_predefined_text.png";
 
 const TEMPLATES = {
   basic_photo_banner: {
@@ -149,44 +152,68 @@ const TEMPLATES = {
       title: "Událost - pruh pod úhlem, vlevo",
     },
   },
-  base_person_event: {
-    name: "Událost - text a obrázek na pozadí, vprostřed",
-    image: basePersonEventImage,
-    path: "/base-person-event",
-    component: () => import("./views/base_person_event/BasePersonEvent.vue"),
-    meta: {
-      title: "Událost - text a obrázek na pozadí, vprostřed",
-    },
-  },
-  right_person_event: {
-    name: "Událost - text a obrázek na pozadí, vpravo",
-    image: rightPersonEventImage,
-    path: "/right-person-event",
-    component: () => import("./views/right_person_event/RightPersonEvent.vue"),
-    meta: {
-      title: "Událost - text a obrázek na pozadí, vpravo",
-    },
-  },
-  angle_person_event_right: {
-    name: "Událost - pruh pod úhlem s obrázkem na pozadí, vpravo",
-    image: anglePersonEventRightImage,
-    path: "/angle-person-event-right",
+  people_banner_with_predefined_text: {
+    name: 'Osoba v šipce s textem "Odvaha pro Evropu"',
+    image: peopleBannerWithPredefinedTextImage,
+    path: "/people-banner-with-predefined-text",
     component: () =>
-      import("./views/angle_person_event_right/AnglePersonEventRight.vue"),
+      import(
+        "./views/people_banner_with_predefined_text/PeopleBannerWithPredefinedText.vue"
+      ),
     meta: {
-      title: "Událost - pruh pod úhlem s obrázkem na pozadí, vpravo",
+      title: 'Osoba v šipce s textem "Odvaha pro Evropu"',
     },
   },
-  angle_person_event_left: {
-    name: "Událost - pruh pod úhlem s obrázkem na pozadí, vlevo",
-    image: anglePersonEventLeftImage,
-    path: "/angle-person-event-left",
+  people_banner_with_custom_text: {
+    name: "Osoba v šipce s vlastním textem",
+    image: peopleBannerWithCustomTextImage,
+    path: "/people-banner-with-custom-text",
     component: () =>
-      import("./views/angle_person_event_left/AnglePersonEventLeft.vue"),
-    meta: {
-      title: "Událost - pruh pod úhlem s obrázkem na pozadí, vlevo",
-    },
-  },
+      import(
+        "./views/people_banner_with_custom_text/PeopleBannerWithCustomText.vue"
+      ),
+    meta: {
+      title: "Osoba v šipce s vlastním textem",
+    },
+  },
+  // base_person_event: {
+  //   name: "Událost - text a obrázek na pozadí, vprostřed",
+  //   image: basePersonEventImage,
+  //   path: "/base-person-event",
+  //   component: () => import("./views/base_person_event/BasePersonEvent.vue"),
+  //   meta: {
+  //     title: "Událost - text a obrázek na pozadí, vprostřed",
+  //   },
+  // },
+  // right_person_event: {
+  //   name: "Událost - text a obrázek na pozadí, vpravo",
+  //   image: rightPersonEventImage,
+  //   path: "/right-person-event",
+  //   component: () => import("./views/right_person_event/RightPersonEvent.vue"),
+  //   meta: {
+  //     title: "Událost - text a obrázek na pozadí, vpravo",
+  //   },
+  // },
+  // angle_person_event_right: {
+  //   name: "Událost - pruh pod úhlem s obrázkem na pozadí, vpravo",
+  //   image: anglePersonEventRightImage,
+  //   path: "/angle-person-event-right",
+  //   component: () =>
+  //     import("./views/angle_person_event_right/AnglePersonEventRight.vue"),
+  //   meta: {
+  //     title: "Událost - pruh pod úhlem s obrázkem na pozadí, vpravo",
+  //   },
+  // },
+  // angle_person_event_left: {
+  //   name: "Událost - pruh pod úhlem s obrázkem na pozadí, vlevo",
+  //   image: anglePersonEventLeftImage,
+  //   path: "/angle-person-event-left",
+  //   component: () =>
+  //     import("./views/angle_person_event_left/AnglePersonEventLeft.vue"),
+  //   meta: {
+  //     title: "Událost - pruh pod úhlem s obrázkem na pozadí, vlevo",
+  //   },
+  // },
 };
 
 export default TEMPLATES;
diff --git a/frontend/src/views/people_banner_with_custom_text/PeopleBannerWithCustomText.vue b/frontend/src/views/people_banner_with_custom_text/PeopleBannerWithCustomText.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0379ae5a109d7efe46a987a843f96ea7e2606483
--- /dev/null
+++ b/frontend/src/views/people_banner_with_custom_text/PeopleBannerWithCustomText.vue
@@ -0,0 +1,167 @@
+<script setup>
+import { watch, ref } from "vue";
+
+import COLORS from "../../colors";
+import TEMPLATES from "../../templates";
+import DEFAULT_CONTRACTOR from "../../contractors";
+import {
+  loadFonts,
+  loadCanvasStorage,
+  setCanvasStorage,
+  updateAutoRedrawStorage,
+  toRawDeep,
+} from "../../utils";
+
+import Canvas from "../../components/canvas/Canvas.vue";
+import redraw from "./canvas";
+
+import Navbar from "../../components/Navbar.vue";
+import MainContainer from "../../components/MainContainer.vue";
+import ImageInput from "../../components/inputs/ImageInput.vue";
+import LongTextInput from "../../components/inputs/text/LongTextInput.vue";
+import ShortTextInput from "../../components/inputs/text/ShortTextInput.vue";
+import MultipleColorPicker from "../../components/inputs/colors/MultipleColorPicker.vue";
+import ReloadButton from "../../components/reload/ReloadButton.vue";
+import AutoReloadCheckbox from "../../components/reload/AutoReloadCheckbox.vue";
+</script>
+
+<script>
+await loadFonts(["12px Bebas Neue", "12px Roboto Condensed"]);
+
+export default {
+  components: {
+    Canvas,
+    Navbar,
+    MainContainer,
+    ImageInput,
+    LongTextInput,
+    ShortTextInput,
+    MultipleColorPicker,
+    AutoReloadCheckbox,
+    ReloadButton,
+  },
+  data() {
+    const predefinedColors = {
+      whiteBackground: {
+        name: "Bílé pozadí, černý text",
+        colors: {
+          background: COLORS.white,
+          mainText: COLORS.black,
+          highlightedText: COLORS.black,
+          highlight: COLORS.yellow1,
+        },
+      },
+    };
+
+    return {
+      mainText: null,
+      personImage: null,
+      gradientHeightMultiplier: 1,
+      colorLabels: {
+        background: "Pozadí",
+      },
+      predefinedColors: predefinedColors,
+      colors: predefinedColors.whiteBackground.colors,
+      autoRedraw: false,
+    };
+  },
+  async created() {
+    await loadCanvasStorage(this);
+  },
+  methods: {
+    async reloadCanvasProperties() {
+      const canvasProperties = {
+        mainText: this.mainText,
+        personImage: this.personImage,
+        colors: this.colors,
+      };
+
+      await this.$refs.canvas.redraw(canvasProperties);
+
+      let canvasPropertiesToSave = structuredClone(toRawDeep(canvasProperties));
+      delete canvasPropertiesToSave.colors;
+
+      setCanvasStorage(canvasPropertiesToSave);
+    },
+  },
+  mounted() {
+    this.$watch(
+      (vm) => [vm.mainText, vm.personImage, vm.colors],
+      async (value) => {
+        if (this.autoRedraw) {
+          await this.reloadCanvasProperties();
+        }
+      },
+      {
+        immediate: true,
+        deep: true,
+      },
+    );
+
+    this.$watch(
+      (vm) => [vm.autoRedraw],
+      async (value) => {
+        updateAutoRedrawStorage(this.autoRedraw);
+
+        if (this.autoRedraw) {
+          await this.reloadCanvasProperties();
+        }
+      },
+    );
+  },
+};
+</script>
+
+<template>
+  <header>
+    <Navbar
+      :defaultTemplate="TEMPLATES.people_banner_with_predefined_text"
+    ></Navbar>
+  </header>
+  <main>
+    <MainContainer>
+      <template v-slot:left>
+        <Canvas
+          ref="canvas"
+          :redrawFunction="redraw"
+          width="1640"
+          height="624"
+        />
+      </template>
+
+      <template v-slot:right>
+        <ReloadButton :parentRefs="$refs" @click="reloadCanvasProperties" />
+        <AutoReloadCheckbox v-model="autoRedraw" />
+
+        <LongTextInput
+          name="Text"
+          v-model="mainText"
+          :important="true"
+          :highlightable="true"
+          zIndex="9"
+        />
+
+        <ImageInput
+          name="Obrázek"
+          v-model="personImage"
+          :important="true"
+          zIndex="10"
+        />
+
+        <MultipleColorPicker
+          name="Barvy"
+          v-model="colors"
+          :important="false"
+          :colorLabels="colorLabels"
+          :predefinedColors="predefinedColors"
+          :defaultPredefinedColors="predefinedColors.whiteBackground"
+          zIndex="5"
+        ></MultipleColorPicker>
+      </template>
+    </MainContainer>
+  </main>
+</template>
+
+<style>
+@import "vue-select/dist/vue-select.css";
+</style>
diff --git a/frontend/src/views/people_banner_with_custom_text/canvas.js b/frontend/src/views/people_banner_with_custom_text/canvas.js
new file mode 100644
index 0000000000000000000000000000000000000000..1b84b7dcd078fa29f84d73646297aea5c7bfdf56
--- /dev/null
+++ b/frontend/src/views/people_banner_with_custom_text/canvas.js
@@ -0,0 +1,222 @@
+import { fabric } from "fabric";
+import {
+  clearObjects,
+  sortObjects,
+  transformHighlightedText,
+  checkTextBoxHeight,
+} from "../../components/canvas/utils";
+import COLORS from "../../colors";
+import { PaddedHighlightingTextbox } from "../../components/canvas/textbox";
+
+import bgImage from "../../assets/template/people_banner_with_custom_text/bg.png";
+
+let mainImage = null;
+let personImage = null;
+let contractedByTextbox = null;
+let previousColor = null;
+let mainTextBox = null;
+
+let personImageSource = null;
+
+const removeDownEventListener = () => {
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .removeEventListener("pointerdown", canvasPointerDownEvent);
+};
+
+let upEventFunction = null;
+let canvasPointerDownEvent = null;
+let pointerDownEventAssigned = false;
+
+const redraw = async (canvas, options) => {
+  clearObjects([contractedByTextbox, mainTextBox], canvas);
+
+  const contractedByTextSize = Math.ceil(canvas.height * 0.035);
+  const contractedByTextMaxWidth = Math.ceil(canvas.width * 0.9);
+  const contractedByTextBottomMargin = Math.ceil(canvas.width * 0.02);
+  const contractedByTextSideMargin = Math.ceil(canvas.width * 0.03);
+
+  const textMarginLeft = Math.ceil(canvas.width * 0.18);
+  const textMarginRight = Math.ceil(canvas.width * 0.7);
+
+  let mainTextMarginTop = Math.ceil(canvas.height * 0.112);
+  const mainTextBackgroundMarginTop = Math.ceil(canvas.height * 0.14);
+  const mainTextSize = Math.ceil(canvas.height * 0.085);
+  const mainTextHeightLimit = Math.ceil(mainTextSize * 2.2);
+  const mainTextLineHeight = 0.85;
+
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .removeEventListener("pointerup", upEventFunction);
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .removeEventListener("pointerout", upEventFunction);
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .removeEventListener("pointercancel", upEventFunction);
+
+  canvas.preserveObjectStacking = true;
+
+  /* BEGIN Person image render */
+
+  if (
+    options.personImage !== null &&
+    (!canvas.contains(personImage) ||
+      personImage === null ||
+      options.personImage.src !== personImageSource)
+  ) {
+    if (personImage !== null) {
+      canvas.remove(personImage);
+    }
+
+    personImage = new fabric.Image(options.personImage, {
+      left: 0,
+      top: 0,
+      zIndex: 0,
+    });
+
+    personImage.controls = {
+      ...fabric.Image.prototype.controls,
+      mtr: new fabric.Control({ visible: false }),
+    };
+
+    if (personImage.width >= personImage.height) {
+      personImage.scaleToHeight(canvas.height);
+    } else {
+      personImage.scaleToWidth(canvas.width);
+    }
+
+    canvas.add(personImage);
+    personImageSource = options.personImage.src;
+    // canvas.centerObject(personImage)
+
+    removeDownEventListener();
+    pointerDownEventAssigned = false;
+  } else if (personImage !== null && options.personImage === null) {
+    canvas.remove(personImage);
+
+    removeDownEventListener();
+    pointerDownEventAssigned = false;
+  }
+
+  /* END Person image render */
+
+  /* BEGIN Main image render */
+
+  if (previousColor !== options.colors.background || mainImage === null) {
+    if (mainImage !== null) {
+      canvas.remove(mainImage);
+    }
+
+    const image = new Image();
+
+    const imageLoadPromise = new Promise((resolve) => {
+      image.onload = () => {
+        resolve();
+      };
+
+      image.src = bgImage;
+    });
+    await imageLoadPromise;
+
+    mainImage = new fabric.Image(image, {
+      left: 0,
+      top: 0,
+      zIndex: 5,
+      selectable: false,
+    });
+
+    mainImage.scaleToWidth(canvas.width);
+
+    canvas.add(mainImage);
+
+    previousColor = options.colors.background;
+  }
+
+  /* END Main image render */
+
+  if (options.mainText !== null) {
+    /* BEGIN Name text render */
+
+    const mainTextWidth = canvas.width - textMarginLeft - textMarginRight;
+
+    const highlightedData = transformHighlightedText(
+      options.mainText,
+      mainTextSize,
+      mainTextWidth,
+      "Bebas Neue",
+      options.colors.highlight.value,
+      options.colors.highlightedText.value,
+      { padWhenDiacritics: true },
+    );
+
+    mainTextBox = new PaddedHighlightingTextbox(highlightedData.text, {
+      width: canvas.width,
+      left: textMarginLeft,
+      textAlign: "left",
+      fontFamily: "Bebas Neue",
+      fontSize: mainTextSize,
+      lineHeight: mainTextLineHeight,
+      fill: options.colors.mainText.value,
+      styles: highlightedData.styles,
+      selectable: false,
+      highlightPadding: canvas.height * 0.003,
+      zIndex: 10,
+    });
+
+    checkTextBoxHeight(mainTextBox, 5);
+
+    canvas.add(mainTextBox);
+
+    mainTextBox.top = mainTextMarginTop - highlightedData.paddingBottom;
+
+    canvas.renderAll();
+
+    /* END Main text render */
+  }
+
+  sortObjects(canvas);
+
+  canvasPointerDownEvent = (event) => {
+    let activeObject = canvas.getActiveObject();
+
+    if (activeObject === null) {
+      return;
+    }
+
+    // if (activeObject._element.src == mainImage._element.src) {
+    // return
+    // }
+
+    canvas.remove(mainImage);
+    canvas.remove(mainTextBox);
+    mainImage = null;
+    mainTextBox = null;
+  };
+
+  if (!pointerDownEventAssigned) {
+    document
+      .getElementsByClassName("upper-canvas")[0]
+      .addEventListener("pointerdown", canvasPointerDownEvent);
+
+    pointerDownEventAssigned = true;
+  }
+
+  upEventFunction = (event) => {
+    redraw(canvas, options);
+  };
+
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .addEventListener("pointerup", upEventFunction);
+
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .addEventListener("pointerout", upEventFunction);
+
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .addEventListener("pointercancel", upEventFunction);
+};
+
+export default redraw;
diff --git a/frontend/src/views/people_banner_with_predefined_text/PeopleBannerWithPredefinedText.vue b/frontend/src/views/people_banner_with_predefined_text/PeopleBannerWithPredefinedText.vue
new file mode 100644
index 0000000000000000000000000000000000000000..4eea66903d5a74033d6370809c902fcd9bc81ac5
--- /dev/null
+++ b/frontend/src/views/people_banner_with_predefined_text/PeopleBannerWithPredefinedText.vue
@@ -0,0 +1,156 @@
+<script setup>
+import { watch, ref } from "vue";
+
+import COLORS from "../../colors";
+import TEMPLATES from "../../templates";
+import DEFAULT_CONTRACTOR from "../../contractors";
+import {
+  loadFonts,
+  loadCanvasStorage,
+  setCanvasStorage,
+  updateAutoRedrawStorage,
+  toRawDeep,
+} from "../../utils";
+
+import Canvas from "../../components/canvas/Canvas.vue";
+import redraw from "./canvas";
+
+import Navbar from "../../components/Navbar.vue";
+import MainContainer from "../../components/MainContainer.vue";
+import ImageInput from "../../components/inputs/ImageInput.vue";
+import LongTextInput from "../../components/inputs/text/LongTextInput.vue";
+import ShortTextInput from "../../components/inputs/text/ShortTextInput.vue";
+import MultipleColorPicker from "../../components/inputs/colors/MultipleColorPicker.vue";
+import ReloadButton from "../../components/reload/ReloadButton.vue";
+import AutoReloadCheckbox from "../../components/reload/AutoReloadCheckbox.vue";
+</script>
+
+<script>
+await loadFonts(["12px Bebas Neue", "12px Roboto Condensed"]);
+
+export default {
+  components: {
+    Canvas,
+    Navbar,
+    MainContainer,
+    ImageInput,
+    LongTextInput,
+    ShortTextInput,
+    MultipleColorPicker,
+    AutoReloadCheckbox,
+    ReloadButton,
+  },
+  data() {
+    const predefinedColors = {
+      whiteBackground: {
+        name: "Bílé pozadí, černý text",
+        colors: {
+          background: COLORS.white,
+          highlightedText: COLORS.black,
+          highlight: COLORS.yellow1,
+        },
+      },
+    };
+
+    return {
+      personImage: null,
+      gradientHeightMultiplier: 1,
+      colorLabels: {
+        background: "Pozadí",
+      },
+      predefinedColors: predefinedColors,
+      colors: predefinedColors.whiteBackground.colors,
+      autoRedraw: false,
+    };
+  },
+  async created() {
+    await loadCanvasStorage(this);
+  },
+  methods: {
+    async reloadCanvasProperties() {
+      const canvasProperties = {
+        personImage: this.personImage,
+        colors: this.colors,
+      };
+
+      await this.$refs.canvas.redraw(canvasProperties);
+
+      let canvasPropertiesToSave = structuredClone(toRawDeep(canvasProperties));
+      delete canvasPropertiesToSave.colors;
+
+      setCanvasStorage(canvasPropertiesToSave);
+    },
+  },
+  mounted() {
+    this.$watch(
+      (vm) => [vm.personImage, vm.colors],
+      async (value) => {
+        if (this.autoRedraw) {
+          await this.reloadCanvasProperties();
+        }
+      },
+      {
+        immediate: true,
+        deep: true,
+      },
+    );
+
+    this.$watch(
+      (vm) => [vm.autoRedraw],
+      async (value) => {
+        updateAutoRedrawStorage(this.autoRedraw);
+
+        if (this.autoRedraw) {
+          await this.reloadCanvasProperties();
+        }
+      },
+    );
+  },
+};
+</script>
+
+<template>
+  <header>
+    <Navbar
+      :defaultTemplate="TEMPLATES.people_banner_with_predefined_text"
+    ></Navbar>
+  </header>
+  <main>
+    <MainContainer>
+      <template v-slot:left>
+        <Canvas
+          ref="canvas"
+          :redrawFunction="redraw"
+          width="1640"
+          height="624"
+        />
+      </template>
+
+      <template v-slot:right>
+        <ReloadButton :parentRefs="$refs" @click="reloadCanvasProperties" />
+        <AutoReloadCheckbox v-model="autoRedraw" />
+
+        <ImageInput
+          name="Obrázek"
+          v-model="personImage"
+          :important="true"
+          zIndex="10"
+        />
+
+        <MultipleColorPicker
+          name="Barvy"
+          v-model="colors"
+          :important="false"
+          :colorLabels="colorLabels"
+          :predefinedColors="predefinedColors"
+          :defaultPredefinedColors="predefinedColors.whiteBackground"
+          zIndex="5"
+        ></MultipleColorPicker>
+      </template>
+    </MainContainer>
+  </main>
+</template>
+
+<style>
+@import "vue-select/dist/vue-select.css";
+</style>
diff --git a/frontend/src/views/people_banner_with_predefined_text/canvas.js b/frontend/src/views/people_banner_with_predefined_text/canvas.js
new file mode 100644
index 0000000000000000000000000000000000000000..076178e66962a1eedccaff7829be0babffe7d464
--- /dev/null
+++ b/frontend/src/views/people_banner_with_predefined_text/canvas.js
@@ -0,0 +1,182 @@
+import { fabric } from "fabric";
+import {
+  clearObjects,
+  sortObjects,
+  transformHighlightedText,
+  checkTextBoxHeight,
+} from "../../components/canvas/utils";
+import COLORS from "../../colors";
+import { PaddedHighlightingTextbox } from "../../components/canvas/textbox";
+
+import bgImage from "../../assets/template/people_banner_with_predefined_text/bg.png";
+
+let mainImage = null;
+let personImage = null;
+let contractedByTextbox = null;
+let previousColor = null;
+let mainTextBox = null;
+
+let personImageSource = null;
+
+const removeDownEventListener = () => {
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .removeEventListener("pointerdown", canvasPointerDownEvent);
+};
+
+let upEventFunction = null;
+let canvasPointerDownEvent = null;
+let pointerDownEventAssigned = false;
+
+const redraw = async (canvas, options) => {
+  clearObjects([contractedByTextbox, mainTextBox], canvas);
+
+  const contractedByTextSize = Math.ceil(canvas.height * 0.035);
+  const contractedByTextMaxWidth = Math.ceil(canvas.width * 0.9);
+  const contractedByTextBottomMargin = Math.ceil(canvas.width * 0.02);
+  const contractedByTextSideMargin = Math.ceil(canvas.width * 0.03);
+
+  const textMarginLeft = Math.ceil(canvas.width * 0.53);
+  const textMarginRight = Math.ceil(canvas.width * 0.1);
+
+  let mainTextMarginBottom = Math.ceil(canvas.height * 0.36);
+  const mainTextBackgroundMarginTop = Math.ceil(canvas.height * 0.14);
+  const mainTextSize = Math.ceil(canvas.height * 0.13);
+  const mainTextHeightLimit = Math.ceil(mainTextSize * 2.2);
+  const mainTextLineHeight = 0.85;
+
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .removeEventListener("pointerup", upEventFunction);
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .removeEventListener("pointerout", upEventFunction);
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .removeEventListener("pointercancel", upEventFunction);
+
+  canvas.preserveObjectStacking = true;
+
+  /* BEGIN Person image render */
+
+  if (
+    options.personImage !== null &&
+    (!canvas.contains(personImage) ||
+      personImage === null ||
+      options.personImage.src !== personImageSource)
+  ) {
+    if (personImage !== null) {
+      canvas.remove(personImage);
+    }
+
+    personImage = new fabric.Image(options.personImage, {
+      left: 0,
+      top: 0,
+      zIndex: 0,
+    });
+
+    personImage.controls = {
+      ...fabric.Image.prototype.controls,
+      mtr: new fabric.Control({ visible: false }),
+    };
+
+    if (personImage.width >= personImage.height) {
+      personImage.scaleToHeight(canvas.height);
+    } else {
+      personImage.scaleToWidth(canvas.width);
+    }
+
+    canvas.add(personImage);
+    personImageSource = options.personImage.src;
+    // canvas.centerObject(personImage)
+
+    removeDownEventListener();
+    pointerDownEventAssigned = false;
+  } else if (personImage !== null && options.personImage === null) {
+    canvas.remove(personImage);
+
+    removeDownEventListener();
+    pointerDownEventAssigned = false;
+  }
+
+  /* END Person image render */
+
+  /* BEGIN Main image render */
+
+  if (previousColor !== options.colors.background || mainImage === null) {
+    if (mainImage !== null) {
+      canvas.remove(mainImage);
+    }
+
+    const image = new Image();
+
+    const imageLoadPromise = new Promise((resolve) => {
+      image.onload = () => {
+        resolve();
+      };
+
+      image.src = bgImage;
+    });
+    await imageLoadPromise;
+
+    mainImage = new fabric.Image(image, {
+      left: 0,
+      top: 0,
+      zIndex: 5,
+      selectable: false,
+    });
+
+    mainImage.scaleToWidth(canvas.width);
+
+    canvas.add(mainImage);
+
+    previousColor = options.colors.background;
+  }
+
+  /* END Main image render */
+
+  sortObjects(canvas);
+
+  canvasPointerDownEvent = (event) => {
+    let activeObject = canvas.getActiveObject();
+
+    if (activeObject === null) {
+      return;
+    }
+
+    // if (activeObject._element.src == mainImage._element.src) {
+    // return
+    // }
+
+    canvas.remove(mainImage);
+    canvas.remove(mainTextBox);
+    mainImage = null;
+    mainTextBox = null;
+  };
+
+  if (!pointerDownEventAssigned) {
+    document
+      .getElementsByClassName("upper-canvas")[0]
+      .addEventListener("pointerdown", canvasPointerDownEvent);
+
+    pointerDownEventAssigned = true;
+  }
+
+  upEventFunction = (event) => {
+    redraw(canvas, options);
+  };
+
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .addEventListener("pointerup", upEventFunction);
+
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .addEventListener("pointerout", upEventFunction);
+
+  document
+    .getElementsByClassName("upper-canvas")[0]
+    .addEventListener("pointercancel", upEventFunction);
+};
+
+export default redraw;