@metropolle/design-system
Version:
Sistema de design unificado para a plataforma Metropolle
439 lines (371 loc) • 14.7 kB
CSS
/* ============================================
Metropolle Design System - Meridian
Flat, zero-border, theme-adaptive (DSC-011 / EPIC-010)
(legacy filename liquid-glass.css; tokens repointed to Meridian)
============================================ */
/* =========================
CSS Custom Properties
========================= */
:root {
/* =========================
Centralized Theme Variables
Use these across all repos
========================= */
/* Typography */
--mds-font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
--mds-font-family-brand: 'Helvetica', 'Inter Tight', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
/* Brand Colors (Meridian: neutraliza roxo/periwinkle do glass; brand-primary mantido) */
--mds-color-brand-primary: #0055FF;
--mds-color-brand-secondary: #3A3A42;
--mds-color-brand-accent: #2563eb;
/* Status Colors (paleta Meridian — prototype-28) */
--mds-color-success: #1a7f4b;
--mds-color-warning: #9a6b00;
--mds-color-error: #b42318;
--mds-color-info: #2563eb;
--mds-color-accent: #2563eb;
/* =========================
Meridian aliases (--mds-meridian-*) — stable, theme-adaptive handles
onto the canonical Meridian short tokens emitted by tokens.css.
Consumers may target these without depending on the legacy --mds-liquid-*
surface vars. Light defaults; dark override below.
========================= */
--mds-meridian-bg: var(--bg, #FCFCFD);
--mds-meridian-panel: var(--panel, #FFFFFF);
--mds-meridian-surface: var(--glass, #FFFFFF);
--mds-meridian-surface-2: var(--glass-2, #F4F2EE);
--mds-meridian-field: var(--field, #F1F2F5);
--mds-meridian-ink: var(--ink, #17171C);
--mds-meridian-ink-dim: var(--ink-dim, rgba(0, 0, 0, 0.58));
--mds-meridian-accent: var(--accent, #17171C);
--mds-meridian-accent-soft: var(--accent-soft, rgba(0, 0, 0, 0.06));
--mds-meridian-on-accent: var(--on-accent, #FFFFFF);
--mds-meridian-stroke: var(--stroke, rgba(0, 0, 0, 0.12));
--mds-meridian-radius: var(--r, 2px);
--mds-meridian-radius-floating: var(--r-sm, 4px);
--mds-meridian-card-shadow: var(--card-shadow, 0 1px 3px rgba(0, 0, 0, 0.05), 0 16px 34px -18px rgba(0, 0, 0, 0.14));
--mds-meridian-card-shadow-sm: var(--card-shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05), 0 6px 16px -12px rgba(0, 0, 0, 0.10));
--mds-meridian-modal-elevation: var(--modal-elevation, 0 18px 44px -22px rgba(0, 0, 0, 0.34), 0 2px 12px rgba(0, 0, 0, 0.08));
--mds-meridian-ok: var(--ok, #1a7f4b);
--mds-meridian-info: var(--info, #2563eb);
--mds-meridian-warn: var(--warn, #9a6b00);
--mds-meridian-bad: var(--bad, #b42318);
--mds-meridian-gold: var(--gold, #f5a623);
--mds-chart-mono-1: var(--accent, #17171C);
--mds-chart-mono-2: rgba(var(--ink-rgb, 23, 23, 28), 0.58);
--mds-chart-mono-3: rgba(var(--ink-rgb, 23, 23, 28), 0.36);
--mds-chart-mono-4: rgba(var(--ink-rgb, 23, 23, 28), 0.22);
--mds-chart-status-ok: var(--ok, #1a7f4b);
--mds-chart-status-info: var(--info, #2563eb);
--mds-chart-status-warn: var(--warn, #9a6b00);
--mds-chart-status-bad: var(--bad, #b42318);
--mds-chart-status-arch: var(--arch, #8A8A92);
--mds-chart-status-gold: var(--gold, #f5a623);
}
/* =========================
Dark Theme (Default)
========================= */
:root,
html[data-theme="dark"] {
/* Meridian semantic colors (DARK) — FEAT-0235 re-point */
--mds-color-text-primary: #F2F0EC;
--mds-color-text-secondary: rgba(255, 255, 255, 0.60);
--mds-color-text-tertiary: rgba(255, 255, 255, 0.42);
--mds-color-background-primary: #0B0B0D;
--mds-color-background-secondary: #161619;
--mds-color-background-tertiary: #1C1C20;
--mds-color-border-default: rgba(255, 255, 255, 0.07);
--mds-color-border-light: rgba(255, 255, 255, 0.04);
/* Scrollbar */
--mds-scrollbar-track: rgba(40, 40, 40, 0.8);
--mds-scrollbar-thumb: rgba(80, 80, 80, 0.8);
--mds-scrollbar-thumb-hover: rgba(100, 100, 100, 0.8);
/* =========================
Meridian flat tokens (ex-"Liquid Glass") — FEAT-0235 re-point.
blur=0, superfícies OPACAS, zero-borda, sombras flat, sem specular/glow.
Nomes --mds-liquid-* mantidos (rename = P1b); só os VALORES viram Meridian.
========================= */
/* Blur — Meridian é flat: zero blur */
--mds-liquid-blur-sm: 0px;
--mds-liquid-blur-md: 0px;
--mds-liquid-blur-lg: 0px;
/* Saturate — sem realce */
--mds-liquid-saturate-default: 100%;
--mds-liquid-saturate-vibrant: 100%;
/* Superfícies — OPACAS (Meridian: distinção por sombra, não transparência) */
--mds-liquid-bg-glass: #1C1C20;
--mds-liquid-bg-glass-thick: #1C1C20;
--mds-liquid-bg-overlay: rgba(0, 0, 0, 0.62);
--mds-liquid-bg-sidebar: #161619;
--mds-liquid-bg-navbar: #161619;
--mds-liquid-bg-card: #1C1C20;
--mds-liquid-bg-input: #202024;
--mds-liquid-bg-button: #202024;
--mds-liquid-bg-button-hover: #27272C;
/* Bordas — zero-borda (transparente; preserva o box-model sem linha visível) */
--mds-liquid-border-subtle: transparent;
--mds-liquid-border-default: transparent;
--mds-liquid-border-bright: rgba(255, 255, 255, 0.06);
/* Sombras Meridian (flat + leve glow interno no escuro) */
--mds-liquid-shadow-raised: inset 0 1px 0 rgba(255, 255, 255, 0.04), 0 4px 14px -8px rgba(0, 0, 0, 0.7);
--mds-liquid-shadow-floating: 0 16px 36px -18px rgba(0, 0, 0, 0.9), inset 0 1px 0 rgba(255, 255, 255, 0.05);
--mds-liquid-shadow-elevated: 0 16px 36px -18px rgba(0, 0, 0, 0.9), inset 0 1px 0 rgba(255, 255, 255, 0.05);
--mds-liquid-shadow-dramatic: 0 24px 56px -20px rgba(0, 0, 0, 0.95), inset 0 1px 0 rgba(255, 255, 255, 0.05);
--mds-modal-elevation: 0 22px 54px -24px rgba(0, 0, 0, 0.72), 0 0 0 1px rgba(255, 255, 255, 0.05), 0 0 26px rgba(242, 240, 236, 0.10);
--mds-chart-mono-1: var(--accent, #F2F0EC);
--mds-chart-mono-2: rgba(var(--ink-rgb, 242, 240, 236), 0.60);
--mds-chart-mono-3: rgba(var(--ink-rgb, 242, 240, 236), 0.42);
--mds-chart-mono-4: rgba(var(--ink-rgb, 242, 240, 236), 0.24);
/* Glow/specular — Meridian não usa; no-ops VÁLIDOS em lista de box-shadow / background */
--mds-liquid-glow-edge: 0 0 0 0 transparent;
--mds-liquid-glow-soft: 0 0 0 0 transparent;
--mds-liquid-specular-intense: linear-gradient(transparent, transparent);
/* Transitions (sem transform no hover = regra de classe) */
--mds-liquid-transition: all 0.2s cubic-bezier(0.25, 0.1, 0.25, 1);
--mds-liquid-transition-fast: all 0.14s cubic-bezier(0.25, 0.1, 0.25, 1);
/* Fundo flat */
--mds-liquid-gradient: #0B0B0D;
}
/* =========================
Light Theme
========================= */
html[data-theme="light"] {
/* Meridian semantic colors (LIGHT) — FEAT-0235 re-point */
--mds-color-text-primary: #17171C;
--mds-color-text-secondary: rgba(0, 0, 0, 0.58);
--mds-color-text-tertiary: rgba(0, 0, 0, 0.40);
--mds-color-background-primary: #FCFCFD;
--mds-color-background-secondary: #FFFFFF;
--mds-color-background-tertiary: #F1F2F5;
--mds-color-border-default: rgba(0, 0, 0, 0.07);
--mds-color-border-light: rgba(0, 0, 0, 0.04);
/* Scrollbar */
--mds-scrollbar-track: rgba(0, 0, 0, 0.05);
--mds-scrollbar-thumb: rgba(0, 0, 0, 0.2);
--mds-scrollbar-thumb-hover: rgba(0, 0, 0, 0.3);
/* Meridian flat surfaces (LIGHT) — opacas, cards brancos */
--mds-liquid-bg-glass: #FFFFFF;
--mds-liquid-bg-glass-thick: #FFFFFF;
--mds-liquid-bg-overlay: rgba(0, 0, 0, 0.45);
--mds-liquid-bg-sidebar: #FFFFFF;
--mds-liquid-bg-navbar: #FCFCFD;
--mds-liquid-bg-card: #FFFFFF;
--mds-liquid-bg-input: #F1F2F5;
--mds-liquid-bg-button: #F1F2F5;
--mds-liquid-bg-button-hover: #E9EAEE;
/* Bordas — zero-borda */
--mds-liquid-border-subtle: transparent;
--mds-liquid-border-default: transparent;
--mds-liquid-border-bright: rgba(0, 0, 0, 0.06);
/* Sombras Meridian (LIGHT — flat, suaves) */
--mds-liquid-shadow-raised: 0 1px 2px rgba(0, 0, 0, 0.05), 0 6px 16px -12px rgba(0, 0, 0, 0.10);
--mds-liquid-shadow-floating: 0 1px 3px rgba(0, 0, 0, 0.05), 0 16px 34px -18px rgba(0, 0, 0, 0.14);
--mds-liquid-shadow-elevated: 0 1px 3px rgba(0, 0, 0, 0.05), 0 16px 34px -18px rgba(0, 0, 0, 0.14);
--mds-liquid-shadow-dramatic: 0 24px 48px -20px rgba(0, 0, 0, 0.18);
--mds-modal-elevation: 0 18px 44px -22px rgba(0, 0, 0, 0.34), 0 2px 12px rgba(0, 0, 0, 0.08);
/* Glow/specular — no-ops válidos */
--mds-liquid-glow-edge: 0 0 0 0 transparent;
--mds-liquid-glow-soft: 0 0 0 0 transparent;
--mds-liquid-specular: linear-gradient(transparent, transparent);
--mds-liquid-specular-intense: linear-gradient(transparent, transparent);
/* Fundo flat */
--mds-liquid-gradient: #FCFCFD;
}
/* ============================================================
Meridian flatten (FEAT-0235) — mata o blur de vidro globalmente.
Os 21 `backdrop-filter: blur()` hardcoded em components.css NÃO são
!important; este reset (!important, importado por último) vence todos.
Meridian = flat, sem frosted glass. Superfícies/cores vêm dos tokens
já re-pointados acima. (Opacificação fina de superfícies rgba residuais
= P1b, polimento pós-ship; o look principal já é Meridian — ver DataTable.)
============================================================ */
*,
*::before,
*::after {
backdrop-filter: none ;
-webkit-backdrop-filter: none ;
}
/* =========================
Base surface class — Meridian flat (zero-border, no glass)
afford = opaque surface + Meridian shadow; hover = shadow/bg only (NEVER move)
========================= */
.mds-liquid-glass {
position: relative;
background: var(--mds-liquid-bg-glass);
/* Meridian: flat, no backdrop blur */
border: none;
border-radius: var(--r, 2px);
box-shadow: var(--mds-liquid-shadow-floating);
transition: var(--mds-liquid-transition);
overflow: hidden;
}
/* Specular highlight removed (Meridian is flat) — pseudo kept as inert no-op
so any descendant z-index assumptions stay intact without painting a halo. */
.mds-liquid-glass::before {
content: none;
}
/* Content stacking preserved */
.mds-liquid-glass > * {
position: relative;
z-index: 1;
}
/* Hover state — Meridian: deeper shadow only, no transform, no border */
.mds-liquid-glass:hover {
box-shadow: var(--mds-liquid-shadow-elevated);
}
/* No-hover variant */
.mds-liquid-glass--no-hover,
.mds-liquid-glass--no-hover:hover {
box-shadow: var(--mds-liquid-shadow-floating);
}
/* =========================
Size Variants
========================= */
.mds-liquid-glass--xs {
border-radius: var(--r, 2px);
}
.mds-liquid-glass--sm {
border-radius: var(--r, 2px);
}
.mds-liquid-glass--lg {
border-radius: var(--r-sm, 4px);
}
.mds-liquid-glass--xl {
border-radius: var(--r-sm, 4px);
}
/* =========================
Element-Specific Classes
========================= */
/* Navbar */
.mds-liquid-glass--navbar {
background: var(--mds-liquid-bg-navbar);
border: none;
border-radius: 0;
box-shadow: var(--mds-liquid-shadow-raised);
}
.mds-liquid-glass--navbar:hover {
box-shadow: var(--mds-liquid-shadow-raised);
}
/* Sidebar */
.mds-liquid-glass--sidebar {
background: var(--mds-liquid-bg-sidebar);
border: none;
border-radius: 0;
box-shadow: var(--mds-liquid-shadow-raised);
}
/* Card */
.mds-liquid-glass--card {
background: var(--mds-liquid-bg-card);
border-radius: var(--r, 2px);
padding: 1.5rem;
}
/* Modal — floating surface uses 4px radius */
.mds-liquid-glass--modal {
background: var(--mds-liquid-bg-glass-thick);
border-radius: var(--r-sm, 4px);
box-shadow: var(--mds-modal-elevation, var(--mds-liquid-shadow-dramatic));
}
/* Modal Overlay — scrim, no blur */
.mds-liquid-glass--overlay {
background: var(--mds-liquid-bg-overlay);
border: none;
border-radius: 0;
box-shadow: none;
}
/* Input — afford via field fill + focus ring (no border, no blur) */
.mds-liquid-glass--input {
background: var(--mds-liquid-bg-input);
border-radius: var(--r, 2px);
box-shadow: var(--mds-liquid-glow-soft);
padding: 0.75rem 1rem;
}
.mds-liquid-glass--input:focus {
box-shadow: 0 0 0 2px var(--mds-color-brand-primary);
outline: none;
}
/* Button — afford via fill; hover = fill change (no move, no border) */
.mds-liquid-glass--button {
background: var(--mds-liquid-bg-button);
border-radius: var(--r, 2px);
box-shadow: var(--mds-liquid-shadow-raised);
padding: 0.5rem 1rem;
cursor: pointer;
transition: var(--mds-liquid-transition-fast);
}
.mds-liquid-glass--button:hover {
background: var(--mds-liquid-bg-button-hover);
}
.mds-liquid-glass--button:active {
box-shadow: var(--mds-liquid-glow-soft);
}
/* Dropdown — floating surface */
.mds-liquid-glass--dropdown {
background: var(--mds-liquid-bg-glass-thick);
border-radius: var(--r-sm, 4px);
box-shadow: var(--mds-liquid-shadow-elevated);
padding: 0.5rem;
}
/* Table */
.mds-liquid-glass--table {
background: var(--mds-liquid-bg-glass);
border-radius: var(--r, 2px);
overflow: hidden;
}
/* Footer */
.mds-liquid-glass--footer {
background: var(--mds-liquid-bg-navbar);
border: none;
border-radius: 0;
}
/* TOC (Table of Contents) */
.mds-liquid-glass--toc {
background: var(--mds-liquid-bg-card);
border-radius: var(--r, 2px);
padding: 1rem;
}
/* Badge — pill stays pill (radius carries shape semantics), flat fill */
.mds-liquid-glass--badge {
background: var(--mds-liquid-bg-button);
border-radius: 999px;
box-shadow: var(--mds-liquid-shadow-raised);
padding: 0.25rem 0.75rem;
font-size: 0.75rem;
}
/* =========================
Background Utilities
========================= */
.mds-liquid-bg-gradient {
background: var(--mds-liquid-gradient) ;
background-attachment: fixed ;
}
/* =========================
Accessibility
========================= */
/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
.mds-liquid-glass,
.mds-liquid-glass--button,
.mds-liquid-glass--input {
transition: none ;
}
}
/* High contrast */
@media (prefers-contrast: high) {
.mds-liquid-glass {
background: var(--mds-color-background-secondary) ;
backdrop-filter: none ;
-webkit-backdrop-filter: none ;
border: 2px solid var(--mds-color-text-primary) ;
}
.mds-liquid-glass::before {
display: none ;
}
}
/* =========================
Browser Fallback
========================= */
@supports not (backdrop-filter: blur(1px)) {
.mds-liquid-glass {
background: var(--mds-color-background-secondary);
}
}