/*
* Tema sazonal "Halloween" do Portal — troca a marca P.I.D. (favicon, ícone
* do login, ícone/assinatura da sidebar) pela variante "vampiro" durante uma
* janela de datas (outubro) e troca a piscada de olhos ao clicar na logo por
* uma animação de "susto" (capa se abre, olhos ficam vermelhos e raivosos,
* presas de fora, tremida + brilho vermelho) só nesse período — fora da
* 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 forçava o tema ligado o ano todo pra revisão
* visual; validado e desligado pelo usuário — a partir daqui só a checagem
* de mês abaixo decide (outubro, todo ano).
*/
const PID_HALLOWEEN_PREVIEW_FORCE = false;
const PID_HALLOWEEN_MES = 9; // outubro, 0-indexed (Date#getMonth())
const PID_HALLOWEEN_SCARE_MS = 900;
/* 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;
}
/* Usa `pid-halloween-icone-escuro.svg` (o mesmo ícone/cores do vampiro
usado na sidebar e no login), não `pid-halloween-favicon.svg` — esse
último é uma variante simplificada (sem capa/gola, cores diferentes,
pensada só pra tamanhos bem pequenos) e destoava do resto da marca sazonal
na aba do navegador. Mesmo padrão do P.I.D. normal, cujo favicon também
usa `pid-icone-escuro.svg` em vez do `pid-favicon.svg` dedicado — ver
"Logos em `static/img/`" no CLAUDE.md. */
function pidApplySeasonalFavicon() {
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", "pid-halloween-icone-escuro.svg");
}
}
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