portal_publico/static/css/base.css

154 lines
2.8 KiB
CSS

*,
*::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 <g class="pid-icon-eye"> 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);
}