/*
* Temas sazonais do Portal — trocam a marca P.I.D. (favicon, ícone do login,
* ícone/assinatura da sidebar) por uma variante temática durante uma janela
* de datas. Dois hoje: "Halloween" (vampiro, 16 a 31/10) e "Aniversário"
* (56 anos da De Paula Contadores, só 15/10 — balões + intro de festa) — as
* duas janelas são mutuamente exclusivas por desenho (15 vs 16-31), nunca
* ativas ao mesmo tempo. Fora de qualquer janela, tudo volta ao P.I.D. normal
* (`pid-icon-eye`/`is-blinking`). Ver `docs/temas-sazonais/temas-sazonais.md`.
* Consumido por `sidebar-brand.js`, `login-logo-blink.js` e `auth.js` (troca
* de intro); incluído em toda página (mesmo padrão de `confirm-modal.js`)
* por isso mora aqui, não num arquivo específico de página.
*
* PID_HALLOWEEN_PREVIEW_FORCE/PID_ANIVERSARIO_PREVIEW_FORCE forçam o tema
* ligado o ano todo pra revisão visual; os dois já foram validados e
* desligados pelo usuário — a partir daqui só a checagem de data abaixo
* decide (todo ano). As constantes ficam aqui de propósito, em vez de
* removidas, pra revisar o visual de novo sem ter que mexer no relógio.
*
* O Halloween só passou a começar em 16/10 (antes: outubro inteiro) porque
* 15/10 é o aniversário da empresa e ganhou tema próprio — os dois nunca
* disputavam o mesmo dia antes disso por acaso, agora é por definição.
*/
const PID_HALLOWEEN_PREVIEW_FORCE = false;
const PID_ANIVERSARIO_PREVIEW_FORCE = false;
const PID_HALLOWEEN_MES = 9; // outubro, 0-indexed (Date#getMonth())
const PID_HALLOWEEN_DIA_INICIO = 16; // 16 a 31/10 — dia 15 é do tema de aniversário
const PID_ANIVERSARIO_MES = 9; // outubro, 0-indexed
const PID_ANIVERSARIO_DIA = 15; // aniversário da De Paula Contadores
const PID_HALLOWEEN_SCARE_MS = 900;
const PID_ANIVERSARIO_PARTY_MS = 650;
/* Preferência do usuário (menu da conta → "Temas sazonais") pra desligar
qualquer tema sazonal (hoje só o Halloween, mas vale pra futuros também)
e manter sempre o P.I.D. padrão — motivos: gosto pessoal ou, no caso do
Halloween, aracnofobia. Mesmo padrão de armazenamento do tema claro/escuro
(`theme.js`, só `localStorage`, nunca migrado pro banco — é preferência
de navegador, não dado de negócio). Tem prioridade sobre tudo, inclusive
`PID_HALLOWEEN_PREVIEW_FORCE`: se o usuário desligou, fica desligado. */
const PID_SEASONAL_OPT_OUT_KEY = "pid_seasonal_theme_opt_out";
function pidSeasonalThemesOptedOut() {
try {
return localStorage.getItem(PID_SEASONAL_OPT_OUT_KEY) === "1";
} catch (e) {
return false;
}
}
function pidSetSeasonalThemesOptedOut(optedOut) {
try {
if (optedOut) {
localStorage.setItem(PID_SEASONAL_OPT_OUT_KEY, "1");
} else {
localStorage.removeItem(PID_SEASONAL_OPT_OUT_KEY);
}
} catch (e) {
// localStorage indisponível (modo privado, storage bloqueado etc.) — a
// preferência simplesmente não persiste, mas a página continua funcionando.
}
}
function pidIsHalloweenActive(data) {
if (pidSeasonalThemesOptedOut()) return false;
if (PID_HALLOWEEN_PREVIEW_FORCE) return true;
const hoje = data || new Date();
return hoje.getMonth() === PID_HALLOWEEN_MES && hoje.getDate() >= PID_HALLOWEEN_DIA_INICIO;
}
function pidIsAniversarioActive(data) {
if (pidSeasonalThemesOptedOut()) return false;
if (PID_ANIVERSARIO_PREVIEW_FORCE) return true;
const hoje = data || new Date();
return hoje.getMonth() === PID_ANIVERSARIO_MES && hoje.getDate() === PID_ANIVERSARIO_DIA;
}
/* `iconFile` é o nome do arquivo em `static/img/` a usar como favicon
(`pid-halloween-icone-escuro.svg` ou `pid-aniversario-icone-escuro.svg`) —
sempre a variante "ícone/cores completas" de cada tema, nunca um favicon
dedicado simplificado: o favicon "sem balões"/"sem capa" pensado só pra
tamanhos bem pequenos destoava do resto da marca sazonal na aba do
navegador (mesmo motivo pelo qual o P.I.D. normal também usa
`pid-icone-escuro.svg` como favicon em vez do `pid-favicon.svg` dedicado —
ver "Logos em `static/img/`" no CLAUDE.md). */
function pidApplySeasonalFavicon(iconFile) {
const link = document.querySelector('link[rel="icon"]');
if (link && link.href.indexOf("pid-icone-escuro.svg") !== -1) {
link.href = link.href.replace("pid-icone-escuro.svg", iconFile);
}
}
const PID_VAMP_FACE_FRIENDLY = `
`;
const PID_VAMP_FACE_SCARE = `
`;
function pidVampireIconRigMarkup() {
return `
${PID_VAMP_FACE_FRIENDLY}${PID_VAMP_FACE_SCARE}`;
}
/* Substitui o conteúdo de um