*, *::before, *::after { box-sizing: border-box; } /* Garante que o atributo/propriedade "hidden" sempre vença, mesmo em elementos cujo próprio componente define display:flex/grid/etc. */ [hidden] { display: none !important; } html, body { height: 100%; } body { margin: 0; font-family: var(--font-sans); background: var(--bg-canvas); color: var(--text-primary); -webkit-font-smoothing: antialiased; transition: background var(--transition-base), color var(--transition-base); } h1, h2, h3, h4, p { margin: 0; } button, input { font-family: inherit; color: inherit; } button { cursor: pointer; border: none; background: none; } a { color: inherit; text-decoration: none; } ul { list-style: none; margin: 0; padding: 0; } svg { display: block; flex-shrink: 0; } .visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; } ::selection { background: var(--accent); color: var(--accent-contrast); } /* Animações globais — rápidas de propósito (a ideia é sensação de fluidez, não "efeito"), e sem nenhum @media (prefers-reduced-motion) desativando: decisão deliberada do usuário, essas animações devem rodar sempre, independente da preferência de acessibilidade do sistema operacional. */ @keyframes pidFadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes pidFadeSlideUp { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } } @keyframes pidScaleIn { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } } /* Olhos do ícone "P.I.D." (o disquete) piscando ao clicar — usado tanto na logo da sidebar (`sidebar-brand.js`, `layout.css`) quanto no ícone do card de login (`login-logo-blink.js`), por isso mora aqui em vez de num CSS específico de página. Cada olho é um sem nenhum transform de atributo XML (a posição já vem dos cx/cy dos círculos) — importante porque um transform de CSS aplicado a um elemento que já tem transform de atributo SUBSTITUI o atributo inteiro, perdendo a posição; `transform-box:fill-box` faz o scaleY girar em torno do próprio olho, não da origem do SVG. */ .pid-icon-eye { transform-box: fill-box; transform-origin: center; } .pid-icon-eye.is-blinking { animation: pidIconBlink 200ms ease-in-out; } @keyframes pidIconBlink { 0%, 100% { transform: scaleY(1); } 50% { transform: scaleY(0.05); } } /* scrollbar discreta */ * { scrollbar-width: thin; scrollbar-color: var(--border-subtle) transparent; } *::-webkit-scrollbar { width: 8px; height: 8px; } *::-webkit-scrollbar-thumb { background: var(--border-subtle); border-radius: var(--radius-pill); }