﻿// =====================================================================
// Card "tocando agora" estilo Spotify no fim do vídeo, creditando a música (sugestão do autor, 17/10)
// O vídeo do original acaba em 33,917 s; a comp principal ganha uma cauda: o último quadro do Maps
// fica congelado (com deriva mínima, nada parado), escurece um pouco e o card sobe de baixo com mola e
// rastro. Capa: arte nossa (assets/card-spotify/capa.png), sem a capa oficial do disco.
// Textos trocáveis no bloco CARD. Rodar depois do montagem.jsx (usa a comp "MAIN recriacao On My Way").
// =====================================================================
var CARD = {
  titulo: "On My Way",
  artistas: "Alan Walker, Sabrina Carpenter, Farruko",
  entra: 33.95,        // s: o card começa a subir
  fim: 36.5,           // s: nova duração da comp principal
  progresso: [0.34, 0.41]  // fração da barra no começo e no fim da cauda
};
var CP = (function () { try { return File($.fileName).parent.parent.fsName.replace(/\\/g, "/") + "/"; } catch (e) { return File.decode("<HOME>/Documents/Cria%C3%A7%C3%A3o%20de%20conteudo/07-videos/projetos/2026-10-17-subzmotion-recriacao/"); } })();   // pasta do projeto = a pasta acima de ae/ (rodar com $.evalFile)
function CARD_acha(nome) { for (var i = 1; i <= app.project.numItems; i++) { var it = app.project.item(i); if (it instanceof CompItem && it.name == nome) return it; } return null; }
function CARD_texto(comp, txt, fonte, tam, cor, pos, just) {
  var L = comp.layers.addText(txt), p = L.property("ADBE Text Properties").property("ADBE Text Document"), d = p.value;
  d.font = fonte; d.fontSize = tam; d.fillColor = cor; d.applyFill = true; d.applyStroke = false; d.tracking = 0;
  d.justification = just || ParagraphJustification.LEFT_JUSTIFY; p.setValue(d);
  L.property("ADBE Transform Group").property("ADBE Position").setValue(pos); return L;
}
function CARD_ret(comp, nome, tam, raio, cor, pos) {
  var L = comp.layers.addShape(); L.name = nome;
  var g = L.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group");
  var v = g.property("ADBE Vectors Group");
  var r = v.addProperty("ADBE Vector Shape - Rect"); r.property("ADBE Vector Rect Size").setValue(tam); r.property("ADBE Vector Rect Roundness").setValue(raio);
  var f = v.addProperty("ADBE Vector Graphic - Fill"); f.property("ADBE Vector Fill Color").setValue(cor);
  L.property("ADBE Transform Group").property("ADBE Position").setValue(pos); return L;
}
function CARD_criar() {
  var main = CARD_acha("MAIN recriacao On My Way"), K = CARD_acha("CENA K-maps");
  var velho = CARD_acha("CARD Spotify"); if (velho) velho.remove();
  for (var v = main.numLayers; v >= 1; v--) if (main.layer(v).name == "MAPS congelado (cauda)" || main.layer(v).name == "CARD Spotify") main.layer(v).remove();
  main.duration = CARD.fim;
  // 1) congela o último quadro do Maps na cauda (camada extra com remapeamento fixo + deriva mínima)
  var fim0 = 814 / 24, F = main.layers.add(K); F.name = "MAPS congelado (cauda)"; F.startTime = 0;
  F.timeRemapEnabled = true; var tr = F.property("ADBE Time Remapping");
  // apagar TODAS as chaves desliga o remapeamento: primeiro cria as novas, depois tira as antigas
  tr.setValueAtTime(fim0, fim0 - 2 / 24); tr.setValueAtTime(CARD.fim, fim0 - 2 / 24);
  for (var q = tr.numKeys; q >= 1; q--) if (tr.keyTime(q) < fim0 - 0.001 || (tr.keyTime(q) > fim0 + 0.001 && Math.abs(tr.keyTime(q) - CARD.fim) > 0.001)) tr.removeKey(q);
  F.inPoint = fim0; F.outPoint = CARD.fim;
  var fs = F.property("ADBE Transform Group").property("ADBE Scale"); fs.setValuesAtTimes([fim0, CARD.fim], [[100, 100], [103, 103]]);
  // 2) comp do card
  var C = app.project.items.addComp("CARD Spotify", 1080, 1080, 1, CARD.fim, 24); C.motionBlur = true; C.shutterAngle = 90; C.shutterPhase = -45;
  var W = 860, H = 300, cx = 540, cy = 880;   // embaixo, sem cobrir a última frase do Maps
  var escuro = C.layers.addSolid([0, 0, 0], "escurece", 1080, 1080, 1, CARD.fim);
  escuro.property("ADBE Transform Group").property("ADBE Opacity").setValuesAtTimes([CARD.entra, CARD.entra + 0.5], [0, 38]);
  var nulo = C.layers.addNull(CARD.fim); nulo.name = "CARD sobe"; nulo.enabled = false;
  nulo.property("ADBE Transform Group").property("ADBE Position").setValue([cx, cy]);
  var fundo = CARD_ret(C, "fundo", [W, H], 28, [0.094, 0.11, 0.137], [cx, cy]);
  var faixa = CARD_ret(C, "barra trilho", [W - 80, 7], 4, [0.33, 0.33, 0.35], [cx, cy + 104]);
  var cheio = CARD_ret(C, "barra cheia", [W - 80, 7], 4, [1, 1, 1], [cx, cy + 104]);
  var capaF = new ImportOptions(new File(CP + "assets/card-spotify/capa.png")), capa = C.layers.add(app.project.importFile(capaF));
  capa.name = "capa"; var tc = capa.property("ADBE Transform Group"); tc.property("ADBE Scale").setValue([100 * 196 / capa.source.width, 100 * 196 / capa.source.height]);
  tc.property("ADBE Position").setValue([cx - W / 2 + 40 + 98, cy - 30]);
  var masc = capa.property("ADBE Mask Parade").addProperty("ADBE Mask Atom"), sh = new Shape(), s = capa.source.width, r = s * 0.06;
  sh.vertices = [[r, 0], [s - r, 0], [s, r], [s, s - r], [s - r, s], [r, s], [0, s - r], [0, r]]; sh.closed = true; masc.property("ADBE Mask Shape").setValue(sh);
  var tit = CARD_texto(C, CARD.titulo, "Figtree-Bold", 58, [1, 1, 1], [cx - W / 2 + 270, cy - 52]);
  var art = CARD_texto(C, CARD.artistas, "Figtree-Medium", 30, [0.70, 0.70, 0.72], [cx - W / 2 + 270, cy - 2]);
  var gosto = C.layers.addShape(); gosto.name = "curtido";
  var gg = gosto.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group").property("ADBE Vectors Group");
  var el = gg.addProperty("ADBE Vector Shape - Ellipse"); el.property("ADBE Vector Ellipse Size").setValue([44, 44]);
  gg.addProperty("ADBE Vector Graphic - Fill").property("ADBE Vector Fill Color").setValue([0.114, 0.725, 0.329]);
  gosto.property("ADBE Transform Group").property("ADBE Position").setValue([cx + W / 2 - 64, cy - 30]);
  // check desenhado como traço (o caractere de check não existe na Figtree)
  var ok = C.layers.addShape(); ok.name = "check";
  var og = ok.property("ADBE Root Vectors Group").addProperty("ADBE Vector Group").property("ADBE Vectors Group");
  var cpth = og.addProperty("ADBE Vector Shape - Group"), chk = new Shape(); chk.vertices = [[-9, 1], [-3, 7], [9, -6]]; chk.closed = false;
  cpth.property("ADBE Vector Shape").setValue(chk);
  var st = og.addProperty("ADBE Vector Graphic - Stroke"); st.property("ADBE Vector Stroke Color").setValue([0, 0, 0]); st.property("ADBE Vector Stroke Width").setValue(4.5);
  st.property("ADBE Vector Stroke Line Cap").setValue(2); st.property("ADBE Vector Stroke Line Join").setValue(2);
  ok.property("ADBE Transform Group").property("ADBE Position").setValue([cx + W / 2 - 64, cy - 30]);
  var lista = [fundo, faixa, cheio, capa, tit, art, gosto, ok], i;
  for (i = 0; i < lista.length; i++) {
    var L = lista[i], p = L.property("ADBE Transform Group").property("ADBE Position").value;
    L.parent = nulo; L.motionBlur = true;
  }
  // barra cheia: escala x a partir da esquerda (âncora na ponta esquerda)
  var bc = cheio.property("ADBE Transform Group");
  bc.property("ADBE Anchor Point").setValue([-(W - 80) / 2, 0]); bc.property("ADBE Position").setValue([-(W - 80) / 2, 104]);
  bc.property("ADBE Scale").setValuesAtTimes([CARD.entra, CARD.fim], [[100 * CARD.progresso[0], 100], [100 * CARD.progresso[1], 100]]);
  // 3) entrada: sobe 260 px com mola curta (chega, passa ~2% e volta) + deriva lenta até o fim
  var np = nulo.property("ADBE Transform Group").property("ADBE Position"), t0 = CARD.entra;
  np.setValuesAtTimes([t0, t0 + 0.42, t0 + 0.62, CARD.fim], [[cx, cy + 420], [cx, cy - 6], [cx, cy], [cx, cy - 10]]);
  var nsc = nulo.property("ADBE Transform Group").property("ADBE Scale");
  nsc.setValuesAtTimes([t0, t0 + 0.5, CARD.fim], [[92, 92], [100, 100], [101.5, 101.5]]);
  var nop = nulo.property("ADBE Transform Group").property("ADBE Opacity"); // nulo não tem opacidade visível: usa no fundo e filhos
  for (i = 0; i < lista.length; i++) lista[i].property("ADBE Transform Group").property("ADBE Opacity").setValuesAtTimes([t0, t0 + 0.25], [0, 100]);
  var eases = [np, nsc], k;
  for (k = 0; k < eases.length; k++) for (i = 1; i <= eases[k].numKeys; i++) {
    var pv = eases[k].propertyValueType, dims = (pv == PropertyValueType.TwoD_SPATIAL || pv == PropertyValueType.ThreeD_SPATIAL) ? 1 : eases[k].value.length, e = [];  // escala tem 3 dimensões
    for (var d = 0; d < dims; d++) e.push(new KeyframeEase(0, i == 1 ? 15 : 75));
    eases[k].setTemporalEaseAtKey(i, e, e);
  }
  var LC = main.layers.add(C); LC.name = "CARD Spotify"; LC.startTime = 0; LC.inPoint = CARD.entra; LC.outPoint = CARD.fim;
  return "card ok, comp principal com " + main.duration.toFixed(2) + " s";
}
