// generator-templates-v3.jsx — new carousels + stories
// Uses Glyph, Logo, Placeholder, COLORS, QRCode already in scope (loaded earlier via templates v1/v2)
const STK_PAL3 = ["#eadcbe","#f4f1ec","#ffffff","#1b1b1a","#674689","#df4b5a"];
// ─────────────────────────────────────────────────────────────────────────
// CARROSSEIS — novos formatos
// ─────────────────────────────────────────────────────────────────────────
// 1) Dicas de styling — capa com numeração estilo magazine
function tplCarouselTipsCover(d) {
const fg = d.fg || COLORS.ink, accent = d.accent || COLORS.purple, hookC = d.hookColor || COLORS.coral;
return (
{d.bigNumber}
{d.title}
{d.subtitle}
);
}
// 2) Card de dica — formato com número grande + texto curto
function tplCarouselTipCard(d) {
const fg = d.fg || COLORS.ink, accent = d.accent || COLORS.purple;
return (
);
}
// 3) Carrossel educacional — texto puro sem decoração
function tplCarouselEdu(d) {
const fg = d.fg || COLORS.ink, accent = d.accent || COLORS.purple;
return (
);
}
// 4) Lookbook — foto full-bleed + texto sobreposto
function tplCarouselLookbook(d) {
const fg = d.fg || "#fff", accent = d.accent || COLORS.coral;
return (
{d.image ?

:
}
);
}
// 5) Storytelling — citação com aspas estilo magazine literário
function tplCarouselQuote(d) {
const fg = d.fg || COLORS.ink, accent = d.accent || COLORS.purple;
return (
);
}
// 6) Mini comparação — antes/depois lado a lado
function tplCarouselCompare(d) {
const fg = d.fg || COLORS.ink, accent = d.accent || COLORS.purple;
return (
{d.title}
{d.imageLeft ?

:
}
{d.labelLeft}
{d.imageRight ?

:
}
{d.labelRight}
);
}
// ─────────────────────────────────────────────────────────────────────────
// STORIES — novos formatos
// ─────────────────────────────────────────────────────────────────────────
// 7) Achadinho — story compacto com foto + handwritten "achei pra você"
function tplStoryAchadinho(d) {
const fg = d.fg || COLORS.ink, accent = d.accent || COLORS.purple, hookC = d.hookColor || COLORS.coral;
return (
{d.image ?

:
}
{d.badge && (
{d.badge}
)}
{d.price}
{d.cta}
);
}
// 8) Bastidores — story com foto + handwritten overlay
function tplStoryBts(d) {
return (
{d.image ?

:
}
{d.cta}
);
}
// 9) Look do dia — story em duas camadas, foto + cards de peças
function tplStoryLookDay(d) {
const fg = d.fg || COLORS.ink, accent = d.accent || COLORS.purple;
return (
{d.image ?

:
}
peças do look
{(d.pieces || "").split("\n").filter(Boolean).slice(0, 3).map((p, i) => (
))}
{d.cta}
);
}
// 10) Cupom — story flash com cupom destacado
function tplStoryCoupon(d) {
const fg = d.fg || "#fff", accent = d.accent || "#fff";
return (
{d.eyebrow}
{d.terms}
{d.cta}
);
}
// 11) Pergunta aberta — story estilo IG question sticker
function tplStoryQuestion(d) {
const fg = d.fg || COLORS.ink, accent = d.accent || COLORS.purple;
return (
{d.label}
{d.question}
digita aqui ✎
responde aí 👇
);
}
// 12) Capa de Reels — formato story que vira capa
function tplStoryReelsCover(d) {
const fg = d.fg || "#fff", accent = d.accent || COLORS.purple, hookC = d.hookColor || COLORS.coral;
return (
{d.image ?

:
}
{d.handle}
reels · @lirou
);
}
// 13) Agenda semanal — calendário de stories
function tplStorySchedule(d) {
const fg = d.fg || COLORS.ink, accent = d.accent || COLORS.purple;
const lines = (d.schedule || "").split("\n").filter(Boolean).slice(0, 7);
return (
{lines.map((line, i) => {
const [day, ...rest] = line.split("|").map(s => s.trim());
return (
);
})}
{d.cta}
);
}
// ─── Registry ───────────────────────────────────────────────────────────
const TEMPLATES_V3 = [
// CARROSSEIS
{ id: "carousel-tips-cover", group: "Carrossel (1080×1350)", name: "Dicas · capa", w: 1080, h: 1350, render: tplCarouselTipsCover,
fields: [
{ k: "eyebrow", label: "Eyebrow (tag pequena no canto)", type: "text" },
{ k: "bigNumber", label: "Número grande (em Caveat)", type: "text", hint: "ex: 5, 7, 10..." },
{ k: "title", label: "Título do carrossel (Caveat · use \\n p/ quebrar)", type: "textarea" },
{ k: "subtitle", label: "Subtítulo explicando", type: "textarea" },
{ k: "handle", label: "@handle", type: "text" },
{ k: "bg", label: "Cor de fundo (preenche o card)", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor do subtítulo + texto secundário", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor do número grande + logo + 'arrasta' + @handle", type: "color", options: STK_PAL3 },
{ k: "hookColor", label: "Cor do título principal em Caveat", type: "color", options: STK_PAL3 },
],
defaults: { eyebrow: "styling", bigNumber: "7", title: "dicas pra\nrenovar seu\nguarda-roupa", subtitle: "sem gastar muito · só com peças que você já tem (e algumas que vai querer)", handle: "@lirou.closet.65", bg: "#eadcbe", fg: "#1b1b1a", accent: "#674689", hookColor: "#df4b5a" } },
{ id: "carousel-tip-card", group: "Carrossel (1080×1350)", name: "Dica · card numerado", w: 1080, h: 1350, render: tplCarouselTipCard,
fields: [
{ k: "indicator", label: "Indicador (canto superior direito)", type: "text", hint: "ex: 1/7" },
{ k: "number", label: "Número grande (Caveat enorme)", type: "text" },
{ k: "headline", label: "Manchete forte (Inter bold)", type: "text" },
{ k: "body", label: "Texto explicativo", type: "textarea" },
{ k: "bg", label: "Cor de fundo (preenche o card)", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor da manchete + corpo do texto", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor do número grande + 'dica' + glifo + linha separadora", type: "color", options: STK_PAL3 },
],
defaults: { indicator: "1/7", number: "01", headline: "mistura velho com novo.", body: "uma peça vintage com uma peça atual cria um look que ninguém mais tem. é a forma mais barata de ter estilo único.", bg: "#eadcbe", fg: "#1b1b1a", accent: "#674689" } },
{ id: "carousel-edu", group: "Carrossel (1080×1350)", name: "Educacional · texto puro", w: 1080, h: 1350, render: tplCarouselEdu,
fields: [
{ k: "tag", label: "Tag (canto superior esquerdo)", type: "text" },
{ k: "kicker", label: "Kicker (linha curta acima do título)", type: "text" },
{ k: "title", label: "Título (Caveat · use \\n p/ quebrar)", type: "textarea" },
{ k: "body", label: "Texto longo de baixo", type: "textarea" },
{ k: "position", label: "Posição no carrossel (ex: 2/5)", type: "text" },
{ k: "bg", label: "Cor de fundo (preenche o card)", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor do título grande + corpo", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor da tag + kicker + glifo + número da posição", type: "color", options: STK_PAL3 },
],
defaults: { tag: "explicação", kicker: "antes de comprar, lembre:", title: "moda rápida\ncusta caro.", body: "uma peça vinda do bazar de marca brasileira durou 5 anos no nosso guarda-roupa. peças de fast fashion duram, em média, 7 lavagens.", position: "2/5", bg: "#f4f1ec", fg: "#1b1b1a", accent: "#674689" } },
{ id: "carousel-lookbook", group: "Carrossel (1080×1350)", name: "Lookbook · foto full", w: 1080, h: 1350, render: tplCarouselLookbook,
fields: [
{ k: "image", label: "Foto do look (vai cobrir o card inteiro)", type: "image" },
{ k: "imgLabel", label: "Label placeholder", type: "text" },
{ k: "eyebrow", label: "Eyebrow (pílula transparente no topo esquerdo)", type: "text" },
{ k: "tag", label: "Tag colorida (canto superior direito)", type: "text" },
{ k: "title", label: "Título (Caveat · embaixo)", type: "text" },
{ k: "body", label: "Descrição curta", type: "textarea" },
{ k: "position", label: "Posição (ex: 3/5)", type: "text" },
{ k: "bg", label: "Cor de fundo (atrás da foto, caso ela tenha transparência)", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor do título + corpo (texto sobre a foto · use claro)", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor da pílula colorida no canto direito", type: "color", options: STK_PAL3 },
],
defaults: { image: "", imgLabel: "look completo", eyebrow: "look 03", tag: "novo", title: "feel the vibe", body: "calça class · tee oversized · tênis branco — tudo no closet.", position: "3/5", bg: "#1b1b1a", fg: "#ffffff", accent: "#df4b5a" } },
{ id: "carousel-quote", group: "Carrossel (1080×1350)", name: "Citação · estilo livro", w: 1080, h: 1350, render: tplCarouselQuote,
fields: [
{ k: "chapter", label: "Capítulo / posição (canto superior direito)", type: "text" },
{ k: "quote", label: "Citação (Caveat · use \\n p/ quebrar)", type: "textarea" },
{ k: "author", label: "Autor / fonte (caps lock)", type: "text" },
{ k: "context", label: "Contexto pequeno (linha cinza embaixo)", type: "text" },
{ k: "position", label: "Posição rodapé esquerdo", type: "text" },
{ k: "bg", label: "Cor de fundo (preenche o card)", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor da citação principal + contexto", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor das aspas decorativas + autor + capítulo + logo", type: "color", options: STK_PAL3 },
],
defaults: { chapter: "cap. 01", quote: "moda não é\nsobre roupa.\né sobre\ncoragem.", author: "lirou closet 65", context: "manifesto · 2025", position: "1/5", bg: "#eadcbe", fg: "#1b1b1a", accent: "#674689" } },
{ id: "carousel-compare", group: "Carrossel (1080×1350)", name: "Comparação 2x · antes/depois", w: 1080, h: 1350, render: tplCarouselCompare,
fields: [
{ k: "imageLeft", label: "Foto esquerda", type: "image" },
{ k: "imageRight", label: "Foto direita", type: "image" },
{ k: "labelLeft", label: "Label da foto esquerda", type: "text" },
{ k: "labelRight", label: "Label da foto direita", type: "text" },
{ k: "eyebrow", label: "Eyebrow (canto direito superior)", type: "text" },
{ k: "title", label: "Título (Caveat)", type: "text" },
{ k: "body", label: "Descrição", type: "textarea" },
{ k: "position", label: "Posição (ex: 2/4)", type: "text" },
{ k: "bg", label: "Cor de fundo (preenche o card)", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor do título + corpo + fundo do badge esquerdo", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor do eyebrow + posição + fundo do badge direito + glifo", type: "color", options: STK_PAL3 },
],
defaults: { imageLeft: "", imageRight: "", labelLeft: "casual", labelRight: "styled", eyebrow: "1 peça · 2 looks", title: "a mesma peça,\noutro vibe.", body: "trocando só os acessórios você muda a história completa da peça. arrasta pra ver mais combinações.", position: "2/4", bg: "#eadcbe", fg: "#1b1b1a", accent: "#674689" } },
// STORIES
{ id: "story-achadinho", group: "Stories (1080×1920)", name: "Achadinho · peça destaque", w: 1080, h: 1920, render: tplStoryAchadinho,
fields: [
{ k: "image", label: "Foto da peça", type: "image" },
{ k: "imgLabel", label: "Label placeholder", type: "text" },
{ k: "title", label: "Frase grande no topo (Caveat)", type: "text" },
{ k: "badge", label: "Badge no canto da foto (Caveat curto · 1-2 palavras)", type: "text" },
{ k: "itemName", label: "Nome da peça (Caveat médio)", type: "text" },
{ k: "detail", label: "Detalhes (tamanho, cor)", type: "text" },
{ k: "price", label: "Preço (texto do botão coral)", type: "text" },
{ k: "cta", label: "CTA do botão inferior", type: "text" },
{ k: "bg", label: "Cor de fundo do story", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor dos detalhes da peça (linha pequena)", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor do glifo + 'achadinho' + nome da peça + botão CTA", type: "color", options: STK_PAL3 },
{ k: "hookColor", label: "Cor do título grande + badge + botão de preço", type: "color", options: STK_PAL3 },
],
defaults: { image: "", imgLabel: "peça nova", title: "achei pra você", badge: "novo!", itemName: "blusa cropped", detail: "preta · tam P · única", price: "R$ 89", cta: "chama no direct ↗", bg: "#eadcbe", fg: "#1b1b1a", accent: "#674689", hookColor: "#df4b5a" } },
{ id: "story-bts", group: "Stories (1080×1920)", name: "Bastidores · foto + frase", w: 1080, h: 1920, render: tplStoryBts,
fields: [
{ k: "image", label: "Foto bastidor (cobre tudo)", type: "image" },
{ k: "imgLabel", label: "Label placeholder", type: "text" },
{ k: "eyebrow", label: "Eyebrow (pílula transparente topo esquerdo)", type: "text" },
{ k: "headline", label: "Frase forte (Caveat · use \\n p/ quebrar)", type: "textarea" },
{ k: "body", label: "Texto curto explicativo", type: "textarea" },
{ k: "cta", label: "CTA no rodapé (caps lock)", type: "text" },
{ k: "bg", label: "Cor de fundo (atrás da foto)", type: "color", options: STK_PAL3 },
],
defaults: { image: "", imgLabel: "bastidor", eyebrow: "BTS · diário", headline: "preparando\no drop 05", body: "horas garimpando peças únicas, lavando, fotografando. cada drop tem amor por trás.", cta: "fica de olho · sex 19h", bg: "#1b1b1a" } },
{ id: "story-look-day", group: "Stories (1080×1920)", name: "Look do dia · com peças", w: 1080, h: 1920, render: tplStoryLookDay,
fields: [
{ k: "image", label: "Foto do look completo", type: "image" },
{ k: "eyebrow", label: "Eyebrow", type: "text" },
{ k: "title", label: "Título do look (Caveat)", type: "text" },
{ k: "pieces", label: "Peças do look (UMA por linha · até 3)", type: "textarea", hint: "ex:\\ncalça class · R$ 165\\ntop bege · R$ 79" },
{ k: "cta", label: "CTA rodapé", type: "text" },
{ k: "bg", label: "Cor de fundo do story", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor do texto das peças (dentro dos cards)", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor do eyebrow + 'peças do look' + bolinhas numeradas + bordas + CTA", type: "color", options: STK_PAL3 },
],
defaults: { image: "", eyebrow: "look do dia", title: "feel the vibe", pieces: "calça class · R$ 165\ntop bege · R$ 79\ntênis branco · R$ 95", cta: "tudo no perfil ↗", bg: "#eadcbe", fg: "#1b1b1a", accent: "#674689" } },
{ id: "story-coupon", group: "Stories (1080×1920)", name: "Cupom · flash sale", w: 1080, h: 1920, render: tplStoryCoupon,
fields: [
{ k: "eyebrow", label: "Eyebrow (topo)", type: "text" },
{ k: "discount", label: "Desconto grande (Caveat enorme · ex: -30%)", type: "text" },
{ k: "body", label: "Texto explicando", type: "textarea" },
{ k: "coupon", label: "Código do cupom (caps lock grande)", type: "text" },
{ k: "terms", label: "Termos (linha pequena)", type: "text" },
{ k: "cta", label: "CTA botão branco", type: "text" },
{ k: "bg", label: "Cor de fundo do story", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor do desconto grande + eyebrow + texto principal + termos", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor da borda tracejada do código de cupom", type: "color", options: STK_PAL3 },
],
defaults: { eyebrow: "⚡ flash sale", discount: "-30%", body: "em todas as peças usando o cupom abaixo", coupon: "LIROU30", terms: "⏱ só nas próximas 6h", cta: "vou no perfil ↗", bg: "#df4b5a", fg: "#ffffff", accent: "#674689" } },
{ id: "story-question", group: "Stories (1080×1920)", name: "Pergunta aberta · caixinha", w: 1080, h: 1920, render: tplStoryQuestion,
fields: [
{ k: "title", label: "Título grande (Caveat · use \\n p/ quebrar)", type: "textarea" },
{ k: "label", label: "Label dentro da caixa branca (caps lock)", type: "text" },
{ k: "question", label: "Pergunta dentro da caixa", type: "textarea" },
{ k: "bg", label: "Cor de fundo do story", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor da pergunta (dentro da caixa branca)", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor do glifo + 'caixinha de' + título + label da caixa + 'responde aí'", type: "color", options: STK_PAL3 },
],
defaults: { title: "dúvidas\n& curiosidades", label: "pergunta", question: "quero saber sobre...", bg: "#eadcbe", fg: "#1b1b1a", accent: "#674689" } },
{ id: "story-reels-cover", group: "Stories (1080×1920)", name: "Reels · capa de vídeo", w: 1080, h: 1920, render: tplStoryReelsCover,
fields: [
{ k: "image", label: "Foto/frame do vídeo (cobre tudo)", type: "image" },
{ k: "imgLabel", label: "Label placeholder", type: "text" },
{ k: "duration", label: "Duração (ex: 0:30)", type: "text" },
{ k: "title", label: "Título (Caveat enorme · use \\n p/ quebrar)", type: "textarea" },
{ k: "subtitle", label: "Subtítulo", type: "textarea" },
{ k: "handle", label: "@handle", type: "text" },
{ k: "bg", label: "Cor de fundo (atrás da foto)", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor do título + subtítulo + handle (texto sobre a foto)", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor do glifo no topo", type: "color", options: STK_PAL3 },
{ k: "hookColor", label: "Cor da pílula de duração + linha separadora", type: "color", options: STK_PAL3 },
],
defaults: { image: "", imgLabel: "frame do reels", duration: "0:30", title: "5 looks\ncom uma\ncalça só", subtitle: "garimpada por R$ 165 e usada de mil formas durante a semana", handle: "@lirou.closet.65", bg: "#1b1b1a", fg: "#ffffff", accent: "#ffffff", hookColor: "#df4b5a" } },
{ id: "story-schedule", group: "Stories (1080×1920)", name: "Agenda semanal · roteiro", w: 1080, h: 1920, render: tplStorySchedule,
fields: [
{ k: "eyebrow", label: "Eyebrow (topo)", type: "text" },
{ k: "title", label: "Título (Caveat)", type: "text" },
{ k: "schedule", label: "Agenda (formato 'DIA | atividade' · uma por linha · até 7)", type: "textarea", hint: "ex:\\nseg | drop 05 às 19h\\nter | bazar online" },
{ k: "cta", label: "CTA rodapé", type: "text" },
{ k: "bg", label: "Cor de fundo do story", type: "color", options: STK_PAL3 },
{ k: "fg", label: "Cor da atividade (texto principal de cada linha)", type: "color", options: STK_PAL3 },
{ k: "accent", label: "Cor do eyebrow + título + dia da semana + bordas + CTA", type: "color", options: STK_PAL3 },
],
defaults: { eyebrow: "semana de", title: "agenda lirou", schedule: "seg | quiz nos stories · 14h\nqua | bastidores do garimpo\nsex | drop 05 às 19h\nsáb | bazar online\ndom | look da semana", cta: "ative as notificações ✦", bg: "#eadcbe", fg: "#1b1b1a", accent: "#674689" } },
];
if (window.LIROU_TEMPLATES) {
window.LIROU_TEMPLATES = window.LIROU_TEMPLATES.concat(TEMPLATES_V3);
}