feat: vsetky sablony cenoviek z novych SVG (zakladne, appkaci, vernostna karta)

- 22 sablon: Super cena / Super vyhodne / Zakladna v 3 farbach so SK aj bez,
  Appkaci (SK / bez), Vernostna karta (so zlavou / bez); orezane na viditelny
  obsah, rovnaka mierka (sirka = viewBox x 130 / 80,1)
- nove premenne {zlava_app}, {jednotkova_cena_app}, {cena_bez_karty},
  {zlava_bez_karty}, {jednotkova_cena_s_kartou}, {jednotkova_cena_bez_karty};
  zvisle natiahnutie textu (scaleY), viac nazvov pisma, napis zlava len pri zlave
- Vernostna karta je predvolena cenovka sekcie Vernostne zlavy
- produkty pri nacitani dostanu aktualnu verziu svojej sablony
- import: zlava pre appkacov a s vernostnou kartou z poznamky, jednotkova cena
  pre appkacov prepocitana, sirka cenovky podla sablony
- okraj stitkov predajni podla mierky cenovky
- postup prevodu v scripts/badges

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub_HostacnyandClaude Opus 5.5 committed 2026-10-22 10:36:37 +02:00
1 parent 50af94f954
commit af35334688
13 files changed
+300 -107

No files matched your search

+11 -4
View File
@@ -92,7 +92,12 @@ function badgeData(p: CardProduct, variant: CardVariant): BadgeProductData {
unitPrice: p.cardUnitPrice || p.unitPrice || '',
cardPriceMain: p.cardPriceMain,
cardPriceSub: p.cardPriceSub,
cardDiscount: p.cardDiscount
cardDiscount: p.cardDiscount,
cardUnitPrice: p.cardUnitPrice,
noCardPriceMain: p.noCardPriceMain,
noCardPriceSub: p.noCardPriceSub,
noCardDiscount: p.noCardDiscount,
noCardUnitPrice: p.noCardUnitPrice
};
}
return p;
@@ -190,9 +195,11 @@ function renderDualSticker(p: CardProduct): string {
// Štítky predajní (Potraviny / Supermarket / Tempo) pod sebou; výška podľa veľkosti cenovky
// Biely okraj okolo nich ako skupiny: pod štítkami je biela vrstva z rovnakých štítkov, každý o hrúbku okraja
// väčší a so zaoblenými rohmi – kde sa štítky dotýkajú, biela splynie, takže linka ide okolo celej skupiny
// a vonkajšie rohy sú zaoblené (polovica hrúbky linky okolo pozadia cenovky: 2,25 px pri cenovke širokej 130 px).
// a vonkajšie rohy sú zaoblené (polovica hrúbky bielej linky okolo pozadia cenovky, podľa mierky cenovky).
function renderStores(p: CardProduct, mode: RenderMode, tagHeight: number, badgeWidth: number): string {
const t = Math.round(((2.25 * badgeWidth) / 130) * 10) / 10;
// mierka cenovky (px na jednotku SVG): biela linka pozadia má 2,78 jednotky, okraj štítkov polovicu
const vbW = Number(p.badgeCustomTemplate?.svgRaw?.match(/viewBox=["'][^"']*?[\d.\-]+\s+[\d.\-]+\s+([\d.]+)/)?.[1]) || 80.1;
const t = Math.round(((1.39 * badgeWidth) / vbW) * 10) / 10;
const tags = [
p.stores?.potraviny ? ['#e2001a', 'stit_potraviny.png', 'Potraviny'] : null,
p.stores?.supermarket ? ['#f9890e', 'stit_supermarket.png', 'Supermarket'] : null,
@@ -221,7 +228,7 @@ export function cardVisualKey(p: CardProduct, ctx: CardContext): string {
p.customBadgePngUrl, badgeWidthFor(p, ctx.variant),
t ? [t.svgRaw, t.layersConfig, t.width] : null,
p.priceMain, p.priceSub, p.discountText, p.badgeText, p.unitPrice,
p.cardPriceMain, p.cardPriceSub, p.cardDiscount, p.cardUnitPrice, p.appPriceMain, p.appPriceSub,
p.cardPriceMain, p.cardPriceSub, p.cardDiscount, p.cardUnitPrice, p.appPriceMain, p.appPriceSub, p.appDiscount, p.appUnitPrice,
p.noCardPriceMain, p.noCardPriceSub, p.noCardDiscount, p.noCardUnitPrice,
p.stores, p.storesOffsetX ?? DEFAULT_STORES_OFFSET_X, p.storesOffsetY ?? DEFAULT_STORES_OFFSET_Y, p.storesSize ?? DEFAULT_STORES_SIZE,
p.labels || [], p.extraPhotos || [], photoStack(p)