Skip to content
Snippets Groups Projects
Commit f35d1b32 authored by Alexa Valentová's avatar Alexa Valentová
Browse files

add 2 new templates

parent 83b53e7a
No related branches found
No related tags found
No related merge requests found
Pipeline #21291 passed
2.24.0
2.25.0
frontend/src/assets/previews/nakopneme_story_circle.png

18.8 KiB

frontend/src/assets/template/nakopneme_story_circle/play_black.png

9.37 KiB

frontend/src/assets/template/nakopneme_story_circle/play_white.png

10.4 KiB

......@@ -3,6 +3,7 @@ import nakopnemeBasicPhotoBannerImage from "./assets/previews/nakopneme_basic_ph
import nakopnemeBasicPhotoBannerImageFZ from "./assets/previews/nakopneme_basic_photo_banner_fz.png";
import nakopnemeBasicPhotoBannerImageFZBar from "./assets/previews/nakopneme_basic_photo_banner_fzbar.png";
import nakopnemeBasicPhotoBannerTextImportant from "./assets/previews/nakopneme_basic_banner_text_important.png";
import nakopnemeStoryCircle from "./assets/previews/nakopneme_story_circle.png"
import urgentBasicPhotoBannerImage from "./assets/previews/urgent_basic_photo_banner.png";
import makeawishPhotoBannerImage from "./assets/previews/make_a_wish_photo_banner.png";
import makeawishTourSocialImage from "./assets/previews/make_a_wish_tour_social.png";
......@@ -109,6 +110,18 @@ const TEMPLATES = {
title: "Nakopneme to! - Text s vykřičníkem a textem",
},
},
nakopneme_story_black_circle: {
name: "Nakopneme to! - IG Story, černý/bílý play button",
image: nakopnemeStoryCircle,
path: "/nakopneme-story-circle",
component: () =>
import(
"./views/nakopneme_story_circle/NakopnemeStoryCircle.vue"
),
meta: {
title: "Nakopneme to! - IG Story, černý/bílý play button",
},
},
make_a_wish_banner: {
name: "Máte přání banner",
image: makeawishPhotoBannerImage,
......
......@@ -153,7 +153,7 @@ export default {
ref="canvas"
:redrawFunction="redraw"
width="1080"
height="1350"
height="1920"
/>
</template>
......
<script setup>
import { watch, ref } from "vue";
import COLORS from "../../colors";
import PEOPLE from "../../people";
import TEMPLATES from "../../templates";
import DEFAULT_CONTRACTOR from "../../contractors";
import {
generateDefaultBadges,
LOGO_POSITIONS,
generateLogoPositions,
} from "../../logos";
import {
loadFonts,
loadCanvasStorage,
setCanvasStorage,
updateAutoRedrawStorage,
} 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 RangeInput from "../../components/inputs/RangeInput.vue";
import InputSeparator from "../../components/inputs/InputSeparator.vue";
import SelectInput from "../../components/inputs/SelectInput.vue";
import MultipleColorPicker from "../../components/inputs/colors/MultipleColorPicker.vue";
import ReloadButton from "../../components/reload/ReloadButton.vue";
import AutoReloadCheckbox from "../../components/reload/AutoReloadCheckbox.vue";
import blackPlayButton from "../../assets/template/nakopneme_story_circle/play_black.png";
import whitePlayButton from "../../assets/template/nakopneme_story_circle/play_white.png";
</script>
<script>
await loadFonts([
"12px Bebas Neue",
"12px Roboto Condensed",
"bold 12px Roboto Condensed",
]);
export default {
components: {
Canvas,
Navbar,
MainContainer,
ImageInput,
LongTextInput,
ShortTextInput,
RangeInput,
SelectInput,
InputSeparator,
MultipleColorPicker,
},
data() {
const predefinedColors = {
base: {
name: "Základní barvy",
colors: {
background: COLORS.black,
highlight: COLORS.yellow1,
baseText: COLORS.black,
highlightedText: COLORS.black,
contractedByText: COLORS.gray1,
},
},
};
return {
mainImage: null,
mainText: null,
contractedBy: DEFAULT_CONTRACTOR,
logoImage: null,
logoPosition: LOGO_POSITIONS.top_right,
logoOptions: generateLogoPositions(["top_right", "top_left"]),
gradientHeightMultiplier: 1,
colorLabels: {
background: "Pozadí",
highlight: "Zvýraznění",
baseText: "Text",
highlightedText: "Zvýrazněný text",
},
predefinedPlayButtonImages: Object.values({
defaultLight: {
name: "Bílé pozadí",
src: whitePlayButton,
},
defaultDark: {
name: "Černé pozadí",
src: blackPlayButton,
defaultSelected: true,
},
}),
predefinedColors: predefinedColors,
colors: predefinedColors.base.colors,
predefinedBadgeImages: generateDefaultBadges("defaultDark"),
autoRedraw: false,
};
},
async created() {
await loadCanvasStorage(this);
},
methods: {
async reloadCanvasProperties() {
const canvasProperties = {
mainImage: this.mainImage,
mainText: this.mainText,
logoPosition: this.logoPosition,
contractedBy: this.contractedBy,
logoImage: this.logoImage,
iconImage: this.iconImage,
gradientHeightMultiplier: this.gradientHeightMultiplier,
colors: this.colors,
};
if (canvasProperties.mainText) {
window.fileName = canvasProperties.mainText;
}
await this.$refs.canvas.redraw(canvasProperties);
delete canvasProperties.colors;
setCanvasStorage(canvasProperties);
},
},
mounted() {
this.$watch(
(vm) => [
vm.mainImage,
vm.mainText,
vm.logoPosition,
vm.contractedBy,
vm.logoImage,
vm.iconImage,
vm.gradientHeightMultiplier,
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.basic_photo_banner"></Navbar>
</header>
<main>
<MainContainer>
<template v-slot:left>
<Canvas
ref="canvas"
:redrawFunction="redraw"
width="1080"
height="1920"
/>
</template>
<template v-slot:right>
<ReloadButton :parentRefs="$refs" @click="reloadCanvasProperties" />
<AutoReloadCheckbox v-model="autoRedraw" />
<ImageInput
name="Obrázek"
v-model="mainImage"
:important="true"
zIndex="10"
/>
<LongTextInput
name="Hlavní text"
v-model="mainText"
:important="true"
:highlightable="true"
zIndex="9"
/>
<InputSeparator />
<ImageInput
name="Obrázek loga"
v-model="logoImage"
:important="false"
:predefinedImages="predefinedBadgeImages"
:mustSelectPredefinedImage="true"
:disableImageInput="true"
zIndex="7"
/>
<ImageInput
name="Obrázek play tlačítka"
v-model="iconImage"
:important="true"
:predefinedImages="predefinedPlayButtonImages"
:mustSelectPredefinedImage="true"
:disableImageInput="true"
zIndex="7"
/>
<SelectInput
name="Pozice loga"
:options="logoOptions"
v-model="logoPosition"
zIndex="6"
/>
<RangeInput
name="Výška gradientu"
v-model="gradientHeightMultiplier"
min="0"
max="3"
/>
<MultipleColorPicker
name="Barvy"
v-model="colors"
:important="false"
:colorLabels="colorLabels"
:predefinedColors="predefinedColors"
:defaultPredefinedColors="predefinedColors.base"
zIndex="5"
></MultipleColorPicker>
<ShortTextInput
name="Zadavatel a zpracovatel"
v-model="contractedBy"
:defaultValue="DEFAULT_CONTRACTOR"
:important="false"
zIndex="4"
/>
</template>
</MainContainer>
</main>
</template>
<style>
@import "vue-select/dist/vue-select.css";
</style>
import * as fabric from "fabric";
import {
clearObjects,
sortObjects,
transformHighlightedText,
checkTextBoxHeight,
getSingleLineTextBoxWidth,
} from "../../components/canvas/utils";
import { PaddedHighlightingTextbox } from "../../components/canvas/textbox";
let mainTextBox = null;
let mainTextBoxBackground = null;
let mainImage = null;
let logoImage = null;
let iconImage = null;
let contractedByTextbox = null;
let mainImageSource = null;
let previousLogoPosition = null;
const redraw = async (canvas, options) => {
canvas.controlsAboveOverlay = true;
clearObjects(
[
mainTextBox,
mainTextBoxBackground,
contractedByTextbox,
iconImage,
],
canvas,
);
canvas.preserveObjectStacking = true;
const textMarginLeft = Math.ceil(canvas.width * 0.08);
const textMarginRight = Math.ceil(canvas.width * 0.075);
let mainTextMarginBottom = Math.ceil(canvas.height * 0.28);
const mainTextBackgroundMarginTop = Math.ceil(canvas.height * 0.1);
const mainTextSize = Math.ceil(canvas.height * 0.051);
const mainTextLineHeight = 0.9;
const contractedByTextSize = Math.ceil(canvas.height * 0.02);
const contractedByTextMaxWidth = Math.ceil(canvas.width * 0.9);
const contractedByTextSidesMargin = Math.ceil(canvas.width * 0.03);
const logoWidth = Math.ceil(canvas.width * 0.13);
const logoSideMargin = Math.ceil(canvas.width * 0.07);
if (options.mainText !== null) {
/* BEGIN Main 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, skipWhitespaceNormalization: true },
);
mainTextBox = new PaddedHighlightingTextbox(highlightedData.text, {
width: canvas.width - textMarginLeft * 2,
left: textMarginLeft,
textAlign: "center",
fontFamily: "Bebas Neue",
fontSize: mainTextSize,
lineHeight: mainTextLineHeight,
fill: options.colors.baseText.value,
styles: highlightedData.styles,
selectable: false,
highlightPadding: canvas.height * 0.003,
zIndex: 10,
});
checkTextBoxHeight(mainTextBox, 5);
canvas.add(mainTextBox);
const mainTextBoxTop =
canvas.height - mainTextBox.height - mainTextMarginBottom;
mainTextBox.top = mainTextBoxTop - highlightedData.paddingBottom;
canvas.renderAll();
/* END Main text render */
/* BEGIN Main text background render */
mainTextBoxBackground = new fabric.Rect({
width: mainTextBox.width + 40,
height: mainTextBox.height + 80,
left: mainTextBox.left - 20,
top: mainTextBox.top - 40,
fill: new fabric.Gradient({
type: "linear",
gradientUnits: "pixels",
coords: {
x1: 0,
y1: 0,
x2: 0,
y2: mainTextBox.height + 40,
},
colorStops: [
{
offset: 1,
color: "#CF7BCC",
},
{
offset: 0,
color: `#FDC801`,
},
],
}),
selectable: false,
zIndex: 9,
});
canvas.add(mainTextBoxBackground);
canvas.remove(iconImage);
iconImage = new fabric.Image(options.iconImage, { selectable: false });
iconImage.scaleToWidth(logoWidth);
iconImage.set({
left: mainTextBoxBackground.left + 40,
top: mainTextBoxBackground.top - 105,
zIndex: 11,
});
canvas.add(iconImage);
/* END Main text background render */
}
/* BEGIN Logo render */
// A logo is provided, and it either hasn't been rendered yet or is a new one.
const createNewLogo =
(options.logoImage !== null &&
(logoImage === null ||
(options.logoImage !== null &&
options.logoImage !== logoImage._element))) ||
previousLogoPosition != options.logoPosition.id;
previousLogoPosition = options.logoPosition.id;
if (createNewLogo) {
canvas.remove(logoImage);
logoImage = new fabric.Image(options.logoImage, { selectable: false });
logoImage.scaleToWidth(logoWidth);
if (options.logoPosition.id == "top-right") {
logoImage.set({
left: canvas.width - logoWidth - logoSideMargin,
top: logoSideMargin,
zIndex: 11,
});
} else {
logoImage.set({
left: logoSideMargin,
top: logoSideMargin,
zIndex: 11,
});
}
canvas.add(logoImage);
}
/* END Logo render */
/* BEGIN Contracted by render */
if (options.contractedBy !== null) {
contractedByTextbox = new fabric.Textbox(options.contractedBy, {
left:
canvas.width - contractedByTextMaxWidth - contractedByTextSidesMargin,
top: canvas.height - contractedByTextSidesMargin - contractedByTextSize,
width: contractedByTextMaxWidth,
fontFamily: "Roboto Condensed",
fontSize: contractedByTextSize,
textAlign: "right",
fill: options.colors.contractedByText.value,
selectable: false,
zIndex: 10,
});
checkTextBoxHeight(contractedByTextbox, 1);
canvas.add(contractedByTextbox);
}
/* END Contracted by render */
/* BEGIN Main image render */
if (
options.mainImage !== null &&
(!canvas.contains(mainImage) ||
mainImage === null ||
options.mainImage.src !== mainImageSource)
) {
if (mainImage !== null) {
canvas.remove(mainImage);
}
mainImage = new fabric.Image(options.mainImage, {
left: 0,
top: 0,
zIndex: 0,
});
mainImage.setControlsVisibility({
// corners (uniform scale)
tl: true,
tr: true,
bl: true,
br: true,
// mids (scale X/Y independently)
ml: true,
mr: true,
mt: true,
mb: true,
// rotation
mtr: false,
});
if (mainImage.width >= mainImage.height) {
mainImage.scaleToHeight(canvas.height);
} else {
mainImage.scaleToWidth(canvas.width);
}
canvas.add(mainImage);
mainImageSource = options.mainImage.src;
// canvas.centerObject(mainImage)
} else if (mainImage !== null && options.mainImage === null) {
canvas.remove(mainImage);
}
/* END Main image render */
sortObjects(canvas);
};
export default redraw;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment