/*
 * Modelo "Órbita" (02/11/2026): pôster surreal e futurista, no jeito das
 * capas do Behance. Uma paisagem de sonho à noite: o planeta se pondo no
 * horizonte, um portal em arco que mostra outro mundo (a foto em duas cores
 * dentro do arco), o astronauta saindo dele, esferas e nuvens soltas no ar e
 * o chão que reflete a luz. Paleta de noite ultravioleta: anil quase preto,
 * violeta, magenta e um ciano frio só no portal.
 *
 * O que ele mostra do editor:
 *  - Retícula Viva na sombra do planeta (bolinhas anil no lado escuro), no
 *    brilho do chão (linhas que engrossam no reflexo) e no pé do título;
 *  - foto dentro de um desenho (o arco em curvas Bézier) com duas cores;
 *  - o contorno vetorial: o "07" gigante só no contorno, de cantos redondos,
 *    e o contorno por fora em degradê no astronauta (linha fina, nítida em
 *    qualquer zoom);
 *  - meias órbitas em curva (a de trás passa atrás do planeta), degradês com
 *    pontos e paradas, brilho, mistura em tela, transparência e grão.
 * Em outro tamanho (o post quadrado), a composição encaixa inteira
 * (`encaixar`, o mesmo dos modelos dos ramos).
 *
 * Na mesma linha (02/11/2026), dois de cada tema, cada um com a sua paleta:
 *  - música: "Frequência" (festival eletrônico, lima no verde quase preto,
 *    o rapaz de fone em duas cores no meio dos anéis de som) e "Lado B"
 *    (noite do vinil, vinho, coral e creme, a bailarina saltando do disco);
 *  - tecnologia: "Mente sintética" (IA: o rosto em gelo e azul-noite com
 *    linhas de varredura, chão em grade e as marcações) e "Beta" (claro:
 *    título cromado, esfera holográfica e o robô no pedestal);
 *  - moda: "Noir" (papel, preto e vermelho: o sol negro com chuva só dentro
 *    dele, a moça de casaco vermelho) e "Salto alto" (cobalto e rosa: o
 *    sapato gigante sobre as nuvens com a moça pequenininha em cima).
 */
import { DEPOSITO_DA_BIBLIOTECA } from "./biblioteca";
import { novoId, type DocumentoDoBanner, type EfeitoDaPeca, type Peca, type PecaDeForma, type PecaDeImagem, type PecaDeTexto, type PecaDeTraco, type Pintura, type PontoDoTraco } from "./documento";
import { documento, fundoDoBanner, type PedidoDoModelo } from "./modelos-base";
import { encaixar } from "./modelos-colecao";
import { metalicoPeloNome } from "./metalicos";
import { f, foto, linear, marca, nada, radial, t, tex } from "./modelos-ramos";

const W = 1080;
const H = 1350;
const NOITE = "#07041A";
const ANIL = "#160A4A";
const VIOLETA = "#6A3CFF";
const MAGENTA = "#FF3EA5";
const ROSA = "#FF9AD5";
const CIANO = "#5CF2FF";
const LILAS = "#C9BBFF";
const BRANCO = "#F6F3FF";
/* A linha do horizonte (o chão começa aqui). */
const HORIZONTE = 905;

type Lugar = { x: number; y: number; w: number; h: number; rot?: number };
type No = { x: number; y: number; e?: { x: number; y: number }; s?: { x: number; y: number } };

const recorte = (nome: string, codigo: string, l: Lugar, extra: Partial<PecaDeImagem> = {}) => foto(nome, `${DEPOSITO_DA_BIBLIOTECA}/${codigo}.webp`, l, { ajuste: "conter", ...extra });
const brilhoDe = (cor: string, desfoque: number, opacidade: number): EfeitoDaPeca => ({ tipo: "brilho", cor, x: 0, y: 0, desfoque, opacidade });

/* A alça do círculo em Bézier (um quarto de volta). */
const K = 0.5523;

/* Um desenho em curvas com os nós em px da arte: a caixa é a justa (com folga para a linha) e os nós viram fração dela. */
function curva(nome: string, nos: No[], fechado: boolean, o: { cor?: string; espessura?: number; preenchimento?: Pintura; rot?: number; extra?: Partial<PecaDeTraco> }): PecaDeTraco {
  const espessura = o.espessura ?? 0;
  const todos = nos.flatMap((n) => [n, n.e, n.s].filter((q): q is { x: number; y: number } => Boolean(q)));
  const folga = espessura + 2;
  const x = Math.min(...todos.map((q) => q.x)) - folga;
  const y = Math.min(...todos.map((q) => q.y)) - folga;
  const w = Math.max(...todos.map((q) => q.x)) + folga - x;
  const h = Math.max(...todos.map((q) => q.y)) + folga - y;
  const fr = (q: { x: number; y: number }) => ({ x: (q.x - x) / w, y: (q.y - y) / h });
  const pontos: PontoDoTraco[] = nos.map((n) => ({ ...fr(n), ...(n.e ? { e: fr(n.e) } : {}), ...(n.s ? { s: fr(n.s) } : {}), no: n.e && n.s ? "suave" : "canto" }));
  return { id: novoId("tr"), tipo: "traco", nome, x, y, w, h, rot: o.rot ?? 0, opacidade: 1, pontos, fechado, suave: false, cor: o.cor ?? BRANCO, espessura, tracejado: "solido", inicio: "nada", fim: "nada", preenchimento: o.preenchimento ?? nada, sombra: null, ...o.extra };
}

/* O arco do portal: os lados retos e o topo em meia-volta perfeita. */
function arco(nome: string, l: Lugar, pintura: Pintura, extra: Partial<PecaDeTraco> = {}) {
  const r = l.w / 2;
  const cx = l.x + r;
  const ombro = l.y + r;
  const base = l.y + l.h;
  return curva(
    nome,
    [
      { x: l.x, y: base },
      { x: l.x, y: ombro, s: { x: l.x, y: ombro - K * r } },
      { x: cx, y: l.y, e: { x: cx - K * r, y: l.y }, s: { x: cx + K * r, y: l.y } },
      { x: l.x + l.w, y: ombro, e: { x: l.x + l.w, y: ombro - K * r } },
      { x: l.x + l.w, y: base },
    ],
    true,
    { preenchimento: pintura, extra },
  );
}

/* Meia órbita (elipse): a da frente passa por baixo do planeta, a de trás por cima; o giro inclina as duas juntas. */
function meiaOrbita(nome: string, cx: number, cy: number, rx: number, ry: number, rot: number, frente: boolean, cor: string, espessura: number, opacidade: number) {
  const lado = frente ? 1 : -1;
  return curva(
    nome,
    [
      { x: cx - rx, y: cy, s: { x: cx - rx, y: cy + lado * K * ry } },
      { x: cx, y: cy + lado * ry, e: { x: cx - K * rx, y: cy + lado * ry }, s: { x: cx + K * rx, y: cy + lado * ry } },
      { x: cx + rx, y: cy, e: { x: cx + rx, y: cy + lado * K * ry } },
    ],
    false,
    { cor, espessura, rot, extra: { opacidade } },
  );
}

/* Esfera de vidro: degradê redondo com a luz em cima à esquerda. */
function esfera(nome: string, x: number, y: number, lado: number, clara: string, meio: string, escura: string, extra: Partial<PecaDeForma> = {}) {
  const pintura: Pintura = { tipo: "radial", cor: clara, cor2: escura, angulo: 0, pontos: { x1: 0.32, y1: 0.26, x2: 1.02, y2: 1.02 }, paradas: [{ pos: 0.45, cor: meio }] };
  return f(nome, "circulo", { x, y, w: lado, h: lado }, pintura, extra);
}

/* A sombra mole no chão (embaixo do que flutua). */
const sombraNoChao = (x: number, y: number, w: number, h: number, forca = 0.6) => f("Sombra no chão", "circulo", { x, y, w, h }, radial("#030110", "#030110", forca, 0));

/* Brilho de quatro pontas. */
const faisca = (x: number, y: number, lado: number, cor = BRANCO) => ({ ...f("Brilho", "estrela", { x, y, w: lado, h: lado }, cor, { pontas: 4, profundidade: 0.8 }), efeitos: [brilhoDe(cor, lado * 0.8, 0.8)] });

/* Texto miúdo de ficha técnica (mono, espaçado). */
const ficha = (nome: string, l: Lugar, texto: string, alinhamento: PecaDeTexto["alinhamento"] = "esquerda", cor = LILAS) => t(nome, l, { texto, fonte: "space-mono", peso: 400, tamanho: 19, linha: 1.5, espaco: 0.14, cor, alinhamento });

function orbita(p: PedidoDoModelo): DocumentoDoBanner {
  /* O planeta se pondo: magenta em cima, violeta embaixo; a sombra em retícula anil no lado de baixo. */
  const planeta = f("Planeta", "circulo", { x: 170, y: 344, w: 740, h: 740 }, { tipo: "linear", cor: ROSA, cor2: VIOLETA, angulo: 180, paradas: [{ pos: 0.42, cor: MAGENTA }] }, {
    reticulaViva: { pontos: [{ x: 0.1, y: 0.95, cor: ANIL, alcance: 1.15 }, { x: 0.95, y: 0.98, cor: ANIL, alcance: 0.5 }], tamanho: 15, angulo: 45, forma: "pontos", papel: null },
    efeitos: [brilhoDe(MAGENTA, 140, 0.55)],
  });

  /* O portal: a espessura (atrás, deslocada), a moldura clara e o arco de dentro com o outro mundo. */
  const portal = { x: 352, y: 392, w: 336, h: 523 };
  const profundidade = arco("Fundo do portal", { x: portal.x - 6, y: portal.y - 26, w: portal.w + 58, h: portal.h + 26 }, { tipo: "linear", cor: "#2A1680", cor2: "#0E0634", angulo: 180 });
  const moldura = arco("Moldura do portal", { x: portal.x - 22, y: portal.y - 22, w: portal.w + 44, h: portal.h + 22 }, { tipo: "linear", cor: "#EDE6FF", cor2: "#8C6BFF", angulo: 160, paradas: [{ pos: 0.55, cor: LILAS }] }, { efeitos: [brilhoDe(CIANO, 90, 0.35)] });
  const vao = arco("Vão do portal", portal, { tipo: "linear", cor: "#7CF7FF", cor2: "#1B0E5C", angulo: 180 });
  const outroMundo = recorte("Outro mundo", "natureza-reflection-of-mountain-in-sea", { x: 196, y: 392, w: 648, h: 523 }, { ajuste: "cobrir", dentroDe: vao.id, duotone: { escuro: "#140A44", claro: "#8CF8FF" }, enquadre: { zoom: 1.25, x: 50, y: 48 } });

  /* O astronauta saindo do portal, com a luz fria do outro mundo na borda e o contorno fino em degradê. */
  const astronauta = recorte("Astronauta", "pessoas-astronauts", { x: 618, y: 352, w: 356, h: 360, rot: 14 }, {
    filtros: { brilho: 106, contraste: 108, saturacao: 95, desfoque: 0, sobreposicao: { cor: MAGENTA, forca: 0.18, mistura: "luz-suave" } },
    efeitos: [{ tipo: "contorno", cor: CIANO, cor2: MAGENTA, x: 0, y: 0, desfoque: 0, opacidade: 0.9, largura: 3 }, brilhoDe(CIANO, 46, 0.35)],
  });

  /* O chão espelhado: a luz do planeta vira linhas que engrossam no reflexo (Retícula Viva em linhas deitadas). */
  const chao = f("Chão", "retangulo", { x: 0, y: HORIZONTE, w: W, h: H - HORIZONTE }, { tipo: "linear", cor: "#1C0D5E", cor2: NOITE, angulo: 180 }, {
    reticulaViva: { pontos: [{ x: 0.5, y: 0.02, cor: MAGENTA, alcance: 0.56 }, { x: 0.5, y: 0.0, cor: CIANO, alcance: 0.24 }], tamanho: 10, angulo: 0, forma: "linhas", papel: null },
  });

  /* O título com a retícula violeta subindo pelo pé das letras. */
  const titulo: PecaDeTexto = {
    ...t("Título", { x: 40, y: 92, w: 1000, h: 190 }, { texto: "ÓRBITA", fonte: "unbounded", peso: 800, tamanho: 172, linha: 0.95, espaco: -0.01, cor: BRANCO, alinhamento: "centro" }),
    reticulaViva: { pontos: [{ x: 0.15, y: 1.25, cor: VIOLETA, alcance: 0.95 }, { x: 0.5, y: 1.3, cor: VIOLETA, alcance: 0.95 }, { x: 0.85, y: 1.25, cor: VIOLETA, alcance: 0.95 }], tamanho: 9, angulo: 45, forma: "pontos", papel: null },
  };

  /* O "07" grande só no contorno, deitado no chão (contorno vetorial de cantos redondos). */
  const numero: PecaDeTexto = {
    ...t("Número", { x: 60, y: 946, w: 470, h: 210 }, { texto: "07", fonte: "unbounded", peso: 800, tamanho: 196, linha: 0.9, espaco: -0.04, cor: BRANCO, alinhamento: "esquerda" }),
    pintura: nada,
    contorno: { cor: LILAS, largura: 2, cantos: "redondos" },
    opacidade: 0.55,
  };

  const pecas: Peca[] = [
    /* Céu: o brilho do horizonte e as estrelas. */
    f("Brilho do horizonte", "circulo", { x: -320, y: 420, w: 1720, h: 980 }, radial("#5B2BEA", NOITE, 0.75, 0)),
    tex("Estrelas", "brilhos", { x: 0, y: 0, w: W, h: 860 }, BRANCO, { opacidade: 0.75, quantidade: 120, tamanho: 4.5, transparencia: { x1: 0.5, y1: 0, x2: 0.5, y2: 1, alfa: 1, alfa2: 0.1 } }),
    meiaOrbita("Órbita de trás", 540, 700, 520, 118, -9, false, LILAS, 2, 0.45),
    planeta,
    meiaOrbita("Órbita da frente", 540, 700, 520, 118, -9, true, LILAS, 2, 0.55),
    recorte("Nuvem de trás", "efeitos-cloud", { x: 720, y: 640, w: 400, h: 226 }, { mistura: "tela", opacidade: 0.45, duotone: { escuro: NOITE, claro: "#E9D2FF" } }),
    chao,
    f("Reflexo do planeta", "circulo", { x: 250, y: HORIZONTE - 40, w: 580, h: 260 }, radial(MAGENTA, MAGENTA, 0.42, 0), { mistura: "tela", dentroDe: chao.id }),
    numero,
    /* O portal no chão: degrau, espessura, moldura, vão e o outro mundo. */
    f("Degrau", "retangulo", { x: 286, y: HORIZONTE - 6, w: 508, h: 26 }, { tipo: "linear", cor: "#B9A6FF", cor2: "#4A2BC0", angulo: 180 }, { raio: 4 }),
    f("Luz do degrau", "circulo", { x: 300, y: HORIZONTE + 6, w: 480, h: 90 }, radial(CIANO, CIANO, 0.35, 0), { mistura: "tela" }),
    profundidade,
    moldura,
    vao,
    outroMundo,
    f("Névoa do portal", "retangulo", { x: portal.x, y: portal.y + portal.h * 0.55, w: portal.w, h: portal.h * 0.45 }, { tipo: "linear", cor: CIANO, cor2: CIANO, angulo: 180, alfa: 0, alfa2: 0.35 }, { mistura: "tela", dentroDe: vao.id }),
    esfera("Lua da órbita", 932, 700, 26, BRANCO, LILAS, VIOLETA),
    recorte("Nuvem da frente", "efeitos-cloud", { x: 236, y: 800, w: 440, h: 248 }, { mistura: "tela", opacidade: 0.8, duotone: { escuro: NOITE, claro: "#F4DDFF" } }),
    /* As esferas soltas no ar (e a sombra das que estão perto do chão). */
    esfera("Esfera lilás", 128, 520, 104, "#F1EBFF", "#9C7DFF", "#2A137A", { efeitos: [brilhoDe(VIOLETA, 40, 0.45)] }),
    esfera("Esfera ciano", 236, 452, 40, "#E6FEFF", CIANO, "#1B4FA8"),
    esfera("Esfera branca", 880, 452, 22, BRANCO, LILAS, VIOLETA),
    sombraNoChao(792, 1112, 220, 40),
    esfera("Esfera magenta", 812, 948, 168, "#FFD3EC", MAGENTA, "#4A0E6E", { efeitos: [brilhoDe(MAGENTA, 60, 0.4)] }),
    /* O selo de texto em volta da esfera (texto em curva fechada). */
    { ...t("Selo em volta", { x: 766, y: 902, w: 260, h: 260, rot: -20 }, { texto: "EXPERIÊNCIA IMERSIVA · NOVA ERA · ÓRBITA 07 · GRAVIDADE ZERO · ", fonte: "space-mono", peso: 400, tamanho: 14, espaco: 0.06, cor: LILAS, alinhamento: "centro" }), curva: 100, opacidade: 0.85 },
    astronauta,
    faisca(330, 360, 20),
    faisca(948, 300, 16, CIANO),
    faisca(724, 236, 12),
    faisca(84, 860, 14, ROSA),
    /* A vinheta escurece só a cena (a tipografia vem por cima). */
    f("Vinheta", "retangulo", { x: 0, y: 0, w: W, h: H }, { ...radial(NOITE, NOITE, 0, 0.6), pontos: { x1: 0.5, y1: 0.52, x2: 1.18, y2: 1.12 } }, { bloqueada: true }),
    /* Tipografia. */
    titulo,
    t("Subtítulo", { x: 140, y: 268, w: 800, h: 64 }, { texto: "sonhos em gravidade zero", fonte: "instrument-serif", peso: 400, tamanho: 48, italico: true, linha: 1.1, cor: LILAS, alinhamento: "centro" }),
    marca(p, 64, 52, 34, BRANCO, "esquerda", 320),
    ficha("Série", { x: 616, y: 54, w: 400, h: 32 }, "Nº 07 — SÉRIE NOVA ERA", "direita"),
    f("Linha", "retangulo", { x: 64, y: 1176, w: W - 128, h: 1.5 }, LILAS, { opacidade: 0.35 }),
    t("Chamada", { x: 64, y: 1200, w: 380, h: 90 }, { texto: "EXPERIÊNCIA\nIMERSIVA", fonte: "space-grotesk", peso: 700, tamanho: 32, linha: 1.08, espaco: 0.02, cor: BRANCO }),
    ficha("Data", { x: 430, y: 1202, w: 280, h: 64 }, "12 — 14 DEZ\n19H ÀS 23H"),
    ficha("Lugar", { x: 696, y: 1202, w: 320, h: 64 }, "ESPAÇO NOVA ERA\nSÃO PAULO · BR", "direita"),
    /* A moldura fina do pôster e as cruzes de registro nos cantos. */
    f("Moldura", "retangulo", { x: 30, y: 30, w: W - 60, h: H - 60 }, nada, { borda: { cor: LILAS, largura: 1.5 }, opacidade: 0.28 }),
    ...[
      [30, 30],
      [W - 30, 30],
      [30, H - 30],
      [W - 30, H - 30],
    ].map(([cx, cy]) => t("Registro", { x: cx - 16, y: cy - 20, w: 32, h: 40 }, { texto: "+", fonte: "space-mono", peso: 400, tamanho: 30, linha: 1, cor: LILAS, alinhamento: "centro", vertical: "meio" })),
    { ...ficha("Lateral", { x: -268, y: 663, w: 600, h: 24 }, "UMA VIAGEM PELO QUE AINDA NÃO EXISTE", "centro"), rot: -90, opacidade: 0.6 },
    { ...ficha("Lateral 2", { x: W - 332, y: 663, w: 600, h: 24 }, "ÓRBITA / 07 — 2077", "centro"), rot: 90, opacidade: 0.6 },
    tex("Grão", "grao", { x: 0, y: 0, w: W, h: H }, BRANCO, { opacidade: 0.05 }),
  ];
  const doc = documento(W, H, fundoDoBanner({ cor: NOITE, cor2: "#241070", angulo: 180, textura: "nenhuma" }), pecas);
  return p.largura === W && p.altura === H ? doc : encaixar(doc, p.largura, p.altura);
}


/* ------------------------------------------------------------ ajudantes dos temas */

/* Anel fino (círculo só com a borda). */
const anel = (nome: string, cx: number, cy: number, r: number, cor: string, largura: number, opacidade: number) => f(nome, "circulo", { x: cx - r, y: cy - r, w: 2 * r, h: 2 * r }, nada, { borda: { cor, largura }, opacidade });
/* Letra só no contorno (contorno vetorial de cantos redondos). É outra peça: id próprio (o eco é a cópia do título). */
const vazado = (p: PecaDeTexto, cor: string, largura: number): PecaDeTexto => ({ ...p, id: novoId("t"), nome: `${p.nome ?? "Texto"} (contorno)`, pintura: nada, contorno: { cor, largura, cantos: "redondos" } });
/* Fio de 1,5 px. */
const fio = (nome: string, x: number, y: number, w: number, cor: string, opacidade = 0.4) => f(nome, "retangulo", { x, y, w, h: 1.5 }, cor, { opacidade });
/* Texto miúdo de ficha numa cor qualquer. */
const fichaEm = (cor: string) => (nome: string, l: Lugar, texto: string, alinhamento: PecaDeTexto["alinhamento"] = "esquerda") => t(nome, l, { texto, fonte: "space-mono", peso: 400, tamanho: 18, linha: 1.5, espaco: 0.14, cor, alinhamento });
/* As cruzes de registro nos quatro cantos da moldura. */
const registros = (cor: string, margem = 30) =>
  [
    [margem, margem],
    [W - margem, margem],
    [margem, H - margem],
    [W - margem, H - margem],
  ].map(([cx, cy]) => t("Registro", { x: cx - 16, y: cy - 20, w: 32, h: 40 }, { texto: "+", fonte: "space-mono", peso: 400, tamanho: 30, linha: 1, cor, alinhamento: "centro", vertical: "meio" }));
const molduraFina = (cor: string, opacidade = 0.28) => f("Moldura", "retangulo", { x: 30, y: 30, w: W - 60, h: H - 60 }, nada, { borda: { cor, largura: 1.5 }, opacidade });
/* Texto em pé na lateral (gira 90°: a caixa é deitada e o centro fica em cx, cy). */
const emPe = (p: PecaDeTexto, cx: number, cy: number, giro = -90): PecaDeTexto => ({ ...p, x: cx - p.w / 2, y: cy - p.h / 2, rot: giro });
const vinheta = (cor: string, forca = 0.55) => f("Vinheta", "retangulo", { x: 0, y: 0, w: W, h: H }, { ...radial(cor, cor, 0, forca), pontos: { x1: 0.5, y1: 0.5, x2: 1.18, y2: 1.12 } }, { bloqueada: true });
const grao = (opacidade = 0.05) => tex("Grão", "grao", { x: 0, y: 0, w: W, h: H }, "#FFFFFF", { opacidade });
const montar = (p: PedidoDoModelo, fundo: Parameters<typeof fundoDoBanner>[0], pecas: Peca[]) => {
  const doc = documento(W, H, fundoDoBanner(fundo), pecas);
  return p.largura === W && p.altura === H ? doc : encaixar(doc, p.largura, p.altura);
};

/* ============================================================ MÚSICA */

/* "Frequência": festival eletrônico. Lima no verde quase preto; o rapaz de fone em duas cores no meio dos anéis de som, o sol listrado (Retícula Viva em linhas) e o equalizador. */
function frequencia(p: PedidoDoModelo): DocumentoDoBanner {
  const PRETO = "#040A06";
  const LIMA = "#C8FF2E";
  const MENTA = "#8DFFCF";
  const CLARO = "#F1FFE2";
  const cabeca = { x: 690, y: 430 };
  const ficha$ = fichaEm(MENTA);
  /* O equalizador: barras com a altura de uma onda (sempre a mesma: o desenho não muda a cada montagem). */
  const barras: Peca[] = Array.from({ length: 40 }, (_, i) => {
    const onda = 0.55 * Math.abs(Math.sin(i * 0.41)) + 0.45 * Math.sin(i * 0.13 + 0.6) ** 2;
    const h = Math.round(36 + 210 * onda);
    return f(`Barra ${i + 1}`, "retangulo", { x: 60 + i * 24, y: 1176 - h, w: 14, h }, { tipo: "linear", cor: LIMA, cor2: LIMA, angulo: 180, alfa: 0.15, alfa2: 0.95 }, { raio: 3 });
  });
  const titulo = t("Título", { x: 0, y: 0, w: 1150, h: 150 }, { texto: "FREQUÊNCIA", fonte: "unbounded", peso: 800, tamanho: 127, linha: 1, espaco: -0.01, cor: LIMA, alinhamento: "centro" });
  const pecas: Peca[] = [
    f("Brilho verde", "circulo", { x: -200, y: 40, w: 1480, h: 1100 }, radial("#1F5A2E", PRETO, 0.8, 0)),
    tex("Estrelas", "brilhos", { x: 0, y: 0, w: W, h: 900 }, CLARO, { opacidade: 0.45, quantidade: 70, tamanho: 4 }),
    /* O sol listrado: as linhas lima engrossam para baixo. */
    f("Sol", "circulo", { x: 250, y: 90, w: 760, h: 760 }, linear("#163E22", "#08170D", 180), {
      reticulaViva: { pontos: [{ x: 0.5, y: 1.08, cor: LIMA, alcance: 1.3 }], tamanho: 16, angulo: 0, forma: "linhas", papel: null },
      efeitos: [brilhoDe(LIMA, 90, 0.18)],
    }),
    ...[250, 330, 420, 520, 630].map((r, i) => anel(`Anel de som ${i + 1}`, cabeca.x, cabeca.y, r, LIMA, 1.5, 0.6 - i * 0.11)),
    ...barras,
    recorte("Rapaz de fone", "homens-listening-music", { x: 360, y: 210, w: 690, h: 1180 }, { duotone: { escuro: "#06120B", claro: "#E6FFA6" }, efeitos: [brilhoDe(LIMA, 50, 0.25)] }),
    /* O pé escurece para o texto ler em cima do rapaz. */
    f("Escuro do pé", "retangulo", { x: 0, y: 0, w: W, h: H }, { tipo: "linear", cor: PRETO, cor2: PRETO, angulo: 180, alfa: 0, alfa2: 0.94, pontos: { x1: 0.5, y1: 1010 / H, x2: 0.5, y2: 1 } }, { bloqueada: true }),
    vinheta(PRETO, 0.5),
    /* O título em pé: o eco só no contorno, deslocado, e o cheio por cima. */
    emPe({ ...vazado(titulo, LIMA, 1.5), opacidade: 0.55 }, 114, 596),
    emPe(titulo, 96, 616),
    faisca(cabeca.x - 290, cabeca.y - 250, 18, LIMA),
    faisca(cabeca.x + 260, cabeca.y - 300, 12, CLARO),
    faisca(330, 980, 14, MENTA),
    marca(p, 64, 52, 34, CLARO, "esquerda", 320),
    ficha$("Edição", { x: 616, y: 54, w: 400, h: 32 }, "EDIÇÃO 04 — 2026", "direita"),
    t("Line-up", { x: 220, y: 1150, w: 796, h: 30 }, { texto: "NEON 88 · DJ VÁCUO · LUA FRIA · SINAL VERDE", fonte: "space-mono", peso: 700, tamanho: 17, espaco: 0.12, cor: CLARO, alinhamento: "direita" }),
    fio("Linha", 64, 1196, W - 128, LIMA, 0.45),
    t("Chamada", { x: 64, y: 1218, w: 400, h: 80 }, { texto: "FESTIVAL DE\nMÚSICA ELETRÔNICA", fonte: "space-grotesk", peso: 700, tamanho: 26, linha: 1.1, espaco: 0.02, cor: CLARO }),
    ficha$("Data", { x: 470, y: 1220, w: 260, h: 64 }, "SEX 22.11\n22H ÀS 06H"),
    ficha$("Lugar", { x: 700, y: 1220, w: 316, h: 64 }, "ARMAZÉM 9\nSÃO PAULO · BR", "direita"),
    molduraFina(LIMA, 0.22),
    ...registros(LIMA),
    grao(0.05),
  ];
  return montar(p, { cor: PRETO, cor2: "#0B1F12", angulo: 180, textura: "nenhuma" }, pecas);
}

/* "Lado B": noite do vinil. Vinho, coral e creme; o disco gigante com os sulcos, a luz e o selo em retícula, e a bailarina saltando dele. */
function ladoB(p: PedidoDoModelo): DocumentoDoBanner {
  const VINHO = "#1C0408";
  const CORAL = "#FF5B3A";
  const CREME = "#F7E8D2";
  const OURO = "#E9B44C";
  const centro = { x: 540, y: 820 };
  const ficha$ = fichaEm(CREME);
  const disco = f("Disco", "circulo", { x: centro.x - 430, y: centro.y - 430, w: 860, h: 860 }, radial("#1B1B20", "#060608", 1, 1), { efeitos: [{ tipo: "sombra", cor: "#000000", x: 0, y: 30, desfoque: 60, opacidade: 0.55 }] });
  const pecas: Peca[] = [
    f("Luz quente", "circulo", { x: -260, y: -200, w: 1600, h: 1300 }, radial("#5A1220", VINHO, 0.9, 0)),
    /* O sol coral atrás, com a retícula vinho subindo do pé. */
    f("Sol coral", "circulo", { x: 560, y: 80, w: 470, h: 470 }, CORAL, {
      reticulaViva: { pontos: [{ x: 0.2, y: 1.0, cor: VINHO, alcance: 1.1 }], tamanho: 14, angulo: 45, forma: "pontos", papel: null },
    }),
    disco,
    ...Array.from({ length: 13 }, (_, i) => anel(`Sulco ${i + 1}`, centro.x, centro.y, 410 - i * 19, "#2C2C33", 1.2, 0.9)),
    { ...f("Reflexo do disco", "circulo", { x: centro.x - 430, y: centro.y - 430, w: 860, h: 860 }, { tipo: "linear", cor: "#FFFFFF", cor2: "#FFFFFF", angulo: 125, alfa: 0, alfa2: 0, paradas: [{ pos: 0.42, cor: "#FFFFFF", alfa: 0 }, { pos: 0.5, cor: "#FFFFFF", alfa: 0.22 }, { pos: 0.58, cor: "#FFFFFF", alfa: 0 }] }), mistura: "tela" as const, dentroDe: disco.id },
    f("Selo do disco", "circulo", { x: centro.x - 150, y: centro.y - 150, w: 300, h: 300 }, CORAL, {
      reticulaViva: { pontos: [{ x: 0.85, y: 0.85, cor: VINHO, alcance: 0.8 }], tamanho: 10, angulo: 45, forma: "pontos", papel: null },
    }),
    { ...t("Selo em volta", { x: centro.x - 130, y: centro.y - 130, w: 260, h: 260 }, { texto: "LADO B · 33⅓ RPM · SÓ VINIL · ", fonte: "space-mono", peso: 700, tamanho: 15, espaco: 0.08, cor: CREME, alinhamento: "centro" }), curva: 100 },
    f("Furo", "circulo", { x: centro.x - 10, y: centro.y - 10, w: 20, h: 20 }, VINHO),
    /* O título atrás da bailarina (ela passa por cima das letras). */
    t("Título", { x: 50, y: 74, w: 900, h: 300 }, { texto: "Lado B", fonte: "instrument-serif", peso: 400, tamanho: 280, italico: true, linha: 0.9, espaco: -0.02, cor: CREME }),
    recorte("Bailarina", "mulheres-dancer", { x: 70, y: 210, w: 900, h: 790 }, { filtros: { brilho: 104, contraste: 108, saturacao: 92, desfoque: 0, sobreposicao: { cor: CORAL, forca: 0.22, mistura: "luz-suave" } }, efeitos: [{ tipo: "sombra", cor: "#000000", x: 0, y: 24, desfoque: 40, opacidade: 0.45 }] }),
    faisca(980, 640, 18, OURO),
    faisca(120, 860, 14, CREME),
    marca(p, 64, 52, 34, CREME, "esquerda", 320),
    ficha$("Edição", { x: 616, y: 54, w: 400, h: 32 }, "NOITE DO VINIL — Nº 12", "direita"),
    t("Chamada", { x: 64, y: 372, w: 200, h: 60 }, { texto: "DISCOTECAGEM\nSÓ EM VINIL", fonte: "space-mono", peso: 700, tamanho: 17, linha: 1.45, espaco: 0.14, cor: CORAL }),
    fio("Linha", 64, 1270, W - 128, CREME, 0.35),
    ficha$("Data", { x: 64, y: 1284, w: 300, h: 34 }, "SÁB 30.11 · 21H"),
    ficha$("Lugar", { x: 640, y: 1284, w: 376, h: 34 }, "BAR DA ESQUINA · SP", "direita"),
    vinheta(VINHO, 0.5),
    grao(0.06),
  ];
  return montar(p, { cor: VINHO, cor2: "#330912", angulo: 180, textura: "nenhuma" }, pecas);
}

/* ============================================================ TECNOLOGIA */

/* "Mente sintética": IA. Gelo e azul-noite com um laranja de alerta; o rosto em duas cores com linhas de varredura (Retícula Viva em linhas), o chão em grade em perspectiva e as marcações. */
function menteSintetica(p: PedidoDoModelo): DocumentoDoBanner {
  const NOITE2 = "#020817";
  const GELO = "#C4F7FF";
  const CIANO2 = "#3EE6FF";
  const LARANJA = "#FF6A2B";
  const ficha$ = fichaEm(GELO);
  const rosto = { x: 300, y: 300, w: 820, h: 837 };
  const ponto = (fx: number, fy: number) => ({ x: rosto.x + rosto.w * fx, y: rosto.y + rosto.h * fy });
  const olho = ponto(0.573, 0.296);
  const boca = ponto(0.683, 0.478);
  const nuca = ponto(0.317, 0.406);
  const marcacao = (nome: string, de: { x: number; y: number }, para: { x: number; y: number }, texto: string, alinhamento: PecaDeTexto["alinhamento"]) => [
    anel(`${nome}: alvo`, de.x, de.y, 13, CIANO2, 1.5, 0.95),
    f(`${nome}: ponto`, "circulo", { x: de.x - 3, y: de.y - 3, w: 6, h: 6 }, CIANO2),
    curva(`${nome}: fio`, [{ x: de.x, y: de.y }, { x: para.x, y: para.y }, { x: para.x + (alinhamento === "direita" ? -150 : 150), y: para.y }], false, { cor: CIANO2, espessura: 1.2, extra: { opacidade: 0.8 } }),
    t(`${nome}: rótulo`, { x: alinhamento === "direita" ? para.x - 190 : para.x, y: para.y - 34, w: 190, h: 28 }, { texto, fonte: "space-mono", peso: 700, tamanho: 13, espaco: 0.1, cor: GELO, alinhamento: "centro", vertical: "meio", fundo: { forma: "retangulo", cor: NOITE2, raio: 2 } }),
  ];
  const sintetica = t("Título 2", { x: 60, y: 186, w: 960, h: 130 }, { texto: "SINTÉTICA", fonte: "unbounded", peso: 800, tamanho: 112, linha: 1, espaco: -0.01, cor: GELO });
  const pecas: Peca[] = [
    f("Halo", "circulo", { x: 260, y: 220, w: 900, h: 900 }, radial("#0E3A7A", NOITE2, 0.9, 0)),
    tex("Grade do chão", "grade", { x: -420, y: 930, w: 1920, h: 420 }, CIANO2, { opacidade: 0.4, tamanho: 64, distorcao: { cantos: [[0.33, 0], [0.67, 0], [1, 1], [0, 1]] }, transparencia: { x1: 0.5, y1: 0, x2: 0.5, y2: 1, alfa: 0, alfa2: 1 } }),
    t("Código", { x: 40, y: 420, w: 230, h: 520 }, { texto: "01001101\n01000101\n01001110\n01010100\n01000101\n00100000\n01010011\n01001001\n01001110\n01010100\n01000101\n01010011\n01000101", fonte: "space-mono", peso: 400, tamanho: 15, linha: 2.3, espaco: 0.18, cor: CIANO2, opacidade: 0.28 }),
    recorte("Rosto", "moda-beautiful-girl-2", rosto, {
      duotone: { escuro: NOITE2, claro: GELO },
      desvanecer: { lado: "baixo", tamanho: 0.3 },
      reticulaViva: { pontos: [{ x: 0.08, y: 0.45, cor: CIANO2, alcance: 0.95 }], tamanho: 8, angulo: 0, forma: "linhas", papel: null, mistura: "tela" },
    }),
    vinheta(NOITE2, 0.45),
    ...marcacao("Olho", olho, { x: 1016, y: 420 }, "ÍRIS · 98,7%", "direita"),
    ...marcacao("Boca", boca, { x: 1016, y: 800 }, "VOZ · 0,004 MS", "direita"),
    ...marcacao("Nuca", nuca, { x: 120, y: 1000 }, "PADRÃO NEURAL", "esquerda"),
    t("Título", { x: 60, y: 80, w: 960, h: 130 }, { texto: "MENTE", fonte: "unbounded", peso: 800, tamanho: 112, linha: 1, espaco: -0.01, cor: "#FFFFFF" }),
    vazado(sintetica, GELO, 2),
    t("Selo IA", { x: 64, y: 336, w: 160, h: 46 }, { texto: "IA · 2027", fonte: "space-mono", peso: 700, tamanho: 18, espaco: 0.1, cor: NOITE2, alinhamento: "centro", fundo: { forma: "retangulo", cor: LARANJA, raio: 2 } }),
    f("Ponto laranja", "circulo", { x: olho.x - 4, y: olho.y - 4, w: 8, h: 8 }, LARANJA, { efeitos: [brilhoDe(LARANJA, 24, 0.9)] }),
    marca(p, 64, 52, 30, "#FFFFFF", "esquerda", 320),
    ficha$("Edição", { x: 616, y: 54, w: 400, h: 30 }, "SIMPÓSIO 03", "direita"),
    fio("Linha", 64, 1196, W - 128, GELO, 0.35),
    t("Chamada", { x: 64, y: 1218, w: 420, h: 80 }, { texto: "CONFERÊNCIA DE\nIA E DESIGN", fonte: "space-grotesk", peso: 700, tamanho: 26, linha: 1.1, espaco: 0.02, cor: "#FFFFFF" }),
    ficha$("Data", { x: 470, y: 1220, w: 260, h: 64 }, "14 — 15 NOV\nONLINE"),
    ficha$("Lugar", { x: 700, y: 1220, w: 316, h: 64 }, "AO VIVO E\nGRATUITO", "direita"),
    molduraFina(GELO, 0.2),
    ...registros(GELO),
    grao(0.05),
  ];
  return montar(p, { cor: NOITE2, cor2: "#071B45", angulo: 180, textura: "nenhuma" }, pecas);
}

/* "Beta": laboratório claro. Cinza-gelo e grafite, o título cromado, a esfera holográfica em órbita e o robô no pedestal. */
function beta(p: PedidoDoModelo): DocumentoDoBanner {
  const GRAFITE = "#15171C";
  const CLARO = "#ECEEF3";
  const ficha$ = fichaEm(GRAFITE);
  const esferaHolo: Pintura = { tipo: "linear", cor: "#FF9BDA", cor2: "#8E7CFF", angulo: 140, paradas: [{ pos: 0.35, cor: "#8EEBFF" }, { pos: 0.68, cor: "#FFE89A" }] };
  const centro = { x: 760, y: 610 };
  const esfera$ = f("Esfera holográfica", "circulo", { x: centro.x - 210, y: centro.y - 210, w: 420, h: 420 }, esferaHolo, {
    reticulaViva: { pontos: [{ x: 0.92, y: 0.95, cor: GRAFITE, alcance: 0.7 }], tamanho: 11, angulo: 45, forma: "pontos", papel: null },
    efeitos: [{ tipo: "sombra", cor: "#3B3F66", x: 0, y: 40, desfoque: 70, opacidade: 0.3 }],
  });
  const pecas: Peca[] = [
    tex("Grade", "grade", { x: 0, y: 0, w: W, h: H }, GRAFITE, { opacidade: 0.06, tamanho: 54 }),
    f("Luz", "circulo", { x: 120, y: 160, w: 1100, h: 900 }, radial("#FFFFFF", "#FFFFFF", 0.85, 0)),
    { ...t("Título", { x: 30, y: 96, w: 1020, h: 270 }, { texto: "BETA", fonte: "unbounded", peso: 800, tamanho: 250, linha: 0.95, espaco: -0.03, cor: GRAFITE, alinhamento: "centro" }), pintura: metalicoPeloNome("cromado")!, efeitos: [{ tipo: "sombra", cor: "#2A2F3A", x: 0, y: 18, desfoque: 30, opacidade: 0.28 }] },
    meiaOrbita("Órbita de trás", centro.x, centro.y, 300, 70, -14, false, GRAFITE, 1.5, 0.45),
    esfera$,
    f("Brilho da esfera", "circulo", { x: centro.x - 160, y: centro.y - 175, w: 200, h: 140, rot: -25 }, radial("#FFFFFF", "#FFFFFF", 0.85, 0), { dentroDe: esfera$.id }),
    meiaOrbita("Órbita da frente", centro.x, centro.y, 300, 70, -14, true, GRAFITE, 1.5, 0.7),
    esfera("Lua", centro.x + 270, centro.y + 30, 30, "#FFFFFF", "#B8C0D6", "#4A5068"),
    /* O pedestal: o tampo em elipse sobre o corpo, a sombra no chão. */
    f("Sombra do pedestal", "circulo", { x: 150, y: 1120, w: 460, h: 70 }, radial("#5A6074", "#5A6074", 0.45, 0)),
    f("Pé do pedestal", "circulo", { x: 210, y: 1122, w: 340, h: 56 }, linear("#FFFFFF", "#C3C9D6", 0)),
    f("Corpo do pedestal", "retangulo", { x: 210, y: 1000, w: 340, h: 150 }, linear("#FFFFFF", "#C3C9D6", 0)),
    f("Tampo do pedestal", "circulo", { x: 210, y: 974, w: 340, h: 56 }, linear("#FFFFFF", "#DDE2EC", 180), { borda: { cor: "#C3C9D6", largura: 1 } }),
    recorte("Robô", "eletronicos-robots", { x: 205, y: 598, w: 350, h: 414 }, { efeitos: [{ tipo: "sombra", cor: "#2A2F3A", x: 0, y: 16, desfoque: 24, opacidade: 0.3 }] }),
    faisca(centro.x - 250, centro.y - 220, 18, "#8E7CFF"),
    faisca(centro.x + 230, centro.y - 250, 12, "#FF9BDA"),
    marca(p, 64, 52, 30, GRAFITE, "esquerda", 320),
    ficha$("Edição", { x: 616, y: 54, w: 400, h: 30 }, "PROTÓTIPO Nº 01", "direita"),
    t("Chamada", { x: 640, y: 900, w: 380, h: 120 }, { texto: "Teste antes\nde todo mundo.", fonte: "instrument-serif", peso: 400, tamanho: 50, italico: true, linha: 1.05, cor: GRAFITE, alinhamento: "direita" }),
    t("Botão", { x: 760, y: 1040, w: 260, h: 64 }, { texto: "QUERO TESTAR", fonte: "space-grotesk", peso: 700, tamanho: 20, espaco: 0.1, cor: CLARO, alinhamento: "centro", fundo: { forma: "pilula", cor: GRAFITE } }),
    fio("Linha", 64, 1196, W - 128, GRAFITE, 0.35),
    t("Rodapé", { x: 64, y: 1218, w: 420, h: 80 }, { texto: "LABORATÓRIO\nDE IDEIAS", fonte: "space-grotesk", peso: 700, tamanho: 26, linha: 1.1, espaco: 0.02, cor: GRAFITE }),
    ficha$("Versão", { x: 470, y: 1220, w: 260, h: 64 }, "VERSÃO 0.9.7\nTESTE ABERTO"),
    ficha$("Prazo", { x: 700, y: 1220, w: 316, h: 64 }, "INSCRIÇÕES\nATÉ 30.11", "direita"),
    molduraFina(GRAFITE, 0.25),
    ...registros(GRAFITE),
    grao(0.07),
  ];
  return montar(p, { cor: CLARO, cor2: "#D3D8E4", angulo: 180, textura: "nenhuma" }, pecas);
}

/* ============================================================ MODA */

/* "Noir": editorial de papel, preto e vermelho. O sol negro com a chuva só dentro dele (textura dentro da forma) e a luz em retícula, o título vermelho atrás da moça de casaco vermelho. */
function noir(p: PedidoDoModelo): DocumentoDoBanner {
  const PAPEL = "#ECE8E1";
  const TINTA = "#0E0E0E";
  const VERMELHO = "#D7141E";
  const ficha$ = fichaEm(TINTA);
  const sol = f("Sol negro", "circulo", { x: 130, y: 250, w: 820, h: 820 }, TINTA, {
    reticulaViva: { pontos: [{ x: 0.18, y: 0.14, cor: "#3A3A3A", alcance: 0.8 }], tamanho: 16, angulo: 45, forma: "pontos", papel: null },
  });
  const noirTxt = t("Título", { x: 0, y: 76, w: W, h: 330 }, { texto: "NOIR", fonte: "bodoni-moda", peso: 900, tamanho: 330, italico: true, linha: 0.9, espaco: -0.02, cor: VERMELHO, alinhamento: "centro" });
  const pecas: Peca[] = [
    sol,
    { ...tex("Chuva", "listras", { x: 130, y: 250, w: 820, h: 820 }, PAPEL, { opacidade: 0.16, tamanho: 22, giro: 72 }), dentroDe: sol.id },
    /* O título: o eco só no contorno, deslocado, e o cheio por cima. */
    { ...vazado({ ...noirTxt, x: 12, y: 90 }, TINTA, 1.5), opacidade: 0.6 },
    noirTxt,
    f("Sombra da moça", "circulo", { x: 330, y: 1270, w: 420, h: 50 }, radial("#000000", "#000000", 0.4, 0)),
    recorte("Moça de casaco vermelho", "moda-fashion-girl-3", { x: 272, y: 232, w: 536, h: 1100 }, { filtros: { brilho: 100, contraste: 110, saturacao: 112, desfoque: 0 } }),
    emPe(t("Lateral", { x: 0, y: 0, w: 620, h: 26 }, { texto: "COLEÇÃO OUTONO · INVERNO 2027", fonte: "space-mono", peso: 400, tamanho: 16, espaco: 0.2, cor: TINTA, alinhamento: "centro" }), 62, 700),
    emPe(t("Lateral 2", { x: 0, y: 0, w: 620, h: 26 }, { texto: "LOOKBOOK — Nº 27", fonte: "space-mono", peso: 400, tamanho: 16, espaco: 0.2, cor: VERMELHO, alinhamento: "centro" }), W - 62, 700, 90),
    marca(p, 64, 52, 30, TINTA, "esquerda", 320),
    ficha$("Edição", { x: 616, y: 54, w: 400, h: 30 }, "EDITORIAL · Nº 27", "direita"),
    fio("Linha", 64, 1196, W - 128, TINTA, 0.5),
    t("Chamada", { x: 64, y: 1208, w: 520, h: 110 }, { texto: "Elegância que atravessa\na tempestade.", fonte: "instrument-serif", peso: 400, tamanho: 44, italico: true, linha: 1.05, cor: TINTA }),
    ficha$("Onde", { x: 640, y: 1220, w: 376, h: 64 }, "LOOKBOOK\nDISPONÍVEL ONLINE", "direita"),
    f("Fio vermelho", "retangulo", { x: 64, y: 1196, w: 120, h: 3 }, VERMELHO),
    molduraFina(TINTA, 0.3),
    ...registros(TINTA),
    tex("Grão", "grao", { x: 0, y: 0, w: W, h: H }, "#FFFFFF", { opacidade: 0.1 }),
  ];
  return montar(p, { cor: PAPEL, cor2: "#E2DDD4", angulo: 180, textura: "nenhuma" }, pecas);
}

/* "Salto alto": cobalto e rosa. O sapato gigante flutuando sobre as nuvens, a moça pequenininha em cima dele (adesivo vetorial) e o sol rosa em retícula. */
function saltoAlto(p: PedidoDoModelo): DocumentoDoBanner {
  const COBALTO = "#1636FF";
  const FUNDO = "#0B1BB5";
  const ROSA2 = "#FF5FB0";
  const CREME = "#FFF4E8";
  const ficha$ = fichaEm(CREME);
  const titulo = t("Título", { x: 50, y: 96, w: 980, h: 420 }, { texto: "SALTO\nALTO", fonte: "big-shoulders-display", peso: 900, tamanho: 250, linha: 0.8, espaco: 0.01, cor: CREME });
  const pecas: Peca[] = [
    f("Luz", "circulo", { x: -200, y: 200, w: 1500, h: 1200 }, radial("#3B5CFF", FUNDO, 0.8, 0)),
    f("Sol rosa", "circulo", { x: 470, y: 250, w: 600, h: 600 }, ROSA2, {
      reticulaViva: { pontos: [{ x: 0.5, y: 1.08, cor: COBALTO, alcance: 1.15 }], tamanho: 15, angulo: 45, forma: "pontos", papel: null },
    }),
    { ...vazado({ ...titulo, x: 64, y: 110 }, ROSA2, 2), opacidade: 0.9 },
    titulo,
    recorte("Nuvem de trás", "efeitos-cloud", { x: 40, y: 960, w: 560, h: 316 }, { mistura: "tela", opacidade: 0.75, duotone: { escuro: FUNDO, claro: "#FFE3F2" } }),
    f("Sombra do sapato", "circulo", { x: 300, y: 1090, w: 620, h: 64 }, radial("#030A5C", "#030A5C", 0.6, 0)),
    recorte("Sapato", "moda-high-heels-shoe", { x: 210, y: 390, w: 820, h: 734, rot: -12 }, { efeitos: [{ tipo: "sombra", cor: "#030A5C", x: 0, y: 30, desfoque: 50, opacidade: 0.5 }] }),
    recorte("Moça pequenininha", "moda-fashion-girl-17", { x: 690, y: 655, w: 120, h: 225 }, { adesivo: { cor: CREME, largura: 5 }, efeitos: [{ tipo: "sombra", cor: "#030A5C", x: 0, y: 8, desfoque: 10, opacidade: 0.45 }] }),
    recorte("Nuvem da frente", "efeitos-cloud", { x: 640, y: 1000, w: 520, h: 294 }, { mistura: "tela", opacidade: 0.85, duotone: { escuro: FUNDO, claro: "#FFFFFF" } }),
    faisca(980, 520, 20, CREME),
    faisca(560, 300, 14, "#FFC2E1"),
    faisca(140, 760, 12, CREME),
    marca(p, 64, 52, 30, CREME, "esquerda", 320),
    ficha$("Edição", { x: 616, y: 54, w: 400, h: 60 }, "NOVA COLEÇÃO\nDO 34 AO 40", "direita"),
    fio("Linha", 64, 1196, W - 128, CREME, 0.4),
    t("Chamada", { x: 64, y: 1206, w: 520, h: 110 }, { texto: "Pise no topo.", fonte: "instrument-serif", peso: 400, tamanho: 56, italico: true, linha: 1, cor: CREME }),
    t("Botão", { x: 776, y: 1222, w: 240, h: 60 }, { texto: "VER COLEÇÃO", fonte: "space-grotesk", peso: 700, tamanho: 19, espaco: 0.1, cor: FUNDO, alinhamento: "centro", fundo: { forma: "pilula", cor: CREME } }),
    molduraFina(CREME, 0.25),
    ...registros(CREME),
    grao(0.06),
  ];
  return montar(p, { cor: COBALTO, cor2: FUNDO, angulo: 165, textura: "nenhuma" }, pecas);
}

export const MODELOS_SURREAIS = [
  {
    chave: "post-orbita-surreal",
    nome: "Órbita · surreal futurista",
    descricao: "Pôster surreal: planeta no horizonte, portal com outro mundo dentro, astronauta, esferas e chão que reflete; Retícula Viva, contorno vetorial e foto dentro do desenho",
    montar: orbita,
    feitoPara: "post" as const,
  },
  { chave: "post-frequencia-musica", nome: "Frequência · música", descricao: "Festival eletrônico: rapaz de fone em duas cores nos anéis de som, sol listrado em Retícula Viva, equalizador e título em pé com eco vazado", montar: frequencia, feitoPara: "post" as const },
  { chave: "post-lado-b-musica", nome: "Lado B · música", descricao: "Noite do vinil: disco gigante com sulcos e selo em retícula, bailarina saltando, sol coral e texto em volta do selo", montar: ladoB, feitoPara: "post" as const },
  { chave: "post-mente-sintetica-tecnologia", nome: "Mente sintética · tecnologia", descricao: "IA: rosto em duas cores com linhas de varredura, chão em grade em perspectiva, marcações com alvos e título vazado", montar: menteSintetica, feitoPara: "post" as const },
  { chave: "post-beta-tecnologia", nome: "Beta · tecnologia", descricao: "Laboratório claro: título cromado, esfera holográfica em órbita com retícula, robô no pedestal", montar: beta, feitoPara: "post" as const },
  { chave: "post-noir-moda", nome: "Noir · moda", descricao: "Editorial de papel: sol negro com a chuva só dentro dele, título vermelho com eco vazado, moça de casaco vermelho", montar: noir, feitoPara: "post" as const },
  { chave: "post-salto-alto-moda", nome: "Salto alto · moda", descricao: "Sapato gigante sobre as nuvens com a moça pequenininha em cima, sol rosa em retícula, título condensado com eco", montar: saltoAlto, feitoPara: "post" as const },
];
