Files

513 lines
17 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ═══════════════════════════════════════════
Ri.NET GOTHAM THEME — Intelligence OS
Palantir-inspired dark data-dense UI
v1.0.0 | 06.04.2026
═══════════════════════════════════════════ */
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&family=IBM+Plex+Sans:wght@300;400;500;600;700&display=swap');
:root {
/* Core palette — deep navy monocrome */
--bg: #0d0d0d;
--bg2: #141414;
--bg3: #1a1a1a;
--bg4: #1a2332;
--bg5: #243044;
/* Borders — barely visible */
--border: #1e293b;
--border2: rgba(30,41,59,0.6);
--border3: rgba(56, 97, 150, 0.4);
/* Text — cool blue-gray hierarchy */
--text: #94a3b8;
--text2: #cbd5e1;
--text3: #c0c0d0;
--text-bright: #f1f5f9;
/* Accent — steel blue, NOT neon */
--accent: #3b82c4;
--accent2: #2563a0;
--accent-glow: rgba(59, 130, 196, 0.12);
/* Status — muted, not screaming */
--green: #22c55e;
--red: #ef4444;
--amber: #f59e0b;
--cyan: #06b6d4;
/* Typography */
--sans: 'IBM Plex Sans', -apple-system, sans-serif;
--mono: 'JetBrains Mono', 'Fira Code', monospace;
/* Sizing */
--radius: 4px;
--radius-lg: 6px;
/* Chart colors — subtle blue ramp */
--chart1: #3b82c4;
--chart2: #1d6fa8;
--chart3: #0f5a8e;
--chart4: #064572;
/* Gradient — subtle, not flashy */
--gradient-main: linear-gradient(135deg, #1a3a5c, #0f2440);
--gradient-accent: linear-gradient(90deg, #2563a0, #1d6fa8);
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body, #root { height: 100%; background: var(--bg); color: var(--text); }
body {
font-family: var(--sans);
font-size: 12px;
font-weight: 400;
line-height: 1.4;
-webkit-font-smoothing: antialiased;
letter-spacing: 0.01em;
}
/* ═══ SCROLLBAR — thin, invisible ═══ */
::-webkit-scrollbar { width: 4px; height: 4px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 2px; }
::-webkit-scrollbar-thumb:hover { background: var(--border3); }
/* ═══ CARD — glass panel ═══ */
.card {
background: var(--bg2);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 12px;
}
.card:hover { border-color: var(--border2); }
/* ═══ GLASS — frosted overlay ═══ */
.glass {
background: rgba(8, 12, 20, 0.85);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border);
}
/* ═══ TABLE — dense, Bloomberg style ═══ */
.tbl {
width: 100%;
border-collapse: collapse;
font-family: var(--mono);
font-size: 11px;
}
.tbl th {
text-align: left;
padding: 6px 8px;
font-weight: 500;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text3);
border-bottom: 1px solid var(--border2);
background: var(--bg3);
position: sticky;
top: 0;
z-index: 1;
}
.tbl td {
padding: 4px 8px;
border-bottom: 1px solid var(--border);
white-space: nowrap;
color: var(--text);
}
.tbl tr:hover td { background: var(--accent-glow); }
.tbl tr:nth-child(even) td { background: rgba(255,255,255,0.01); }
/* ═══ BUTTONS ═══ */
.btn {
font-family: var(--sans);
font-size: 11px;
font-weight: 500;
padding: 6px 12px;
border-radius: var(--radius);
border: 1px solid var(--border2);
background: var(--bg3);
color: var(--text);
cursor: pointer;
transition: all 0.15s;
letter-spacing: 0.02em;
}
.btn:hover { background: var(--bg4); border-color: var(--border3); }
.btn-primary {
background: var(--accent2);
border-color: var(--accent);
color: white;
}
.btn-primary:hover { background: var(--accent); }
.btn-ghost {
background: transparent;
border-color: var(--border);
color: var(--text2);
}
.btn-ghost:hover { color: var(--text); border-color: var(--border2); }
/* ═══ INPUT ═══ */
input, select, textarea {
font-family: var(--mono);
font-size: 12px;
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius);
color: var(--text);
padding: 8px 10px;
outline: none;
transition: border-color 0.15s;
}
input:focus, select:focus, textarea:focus { border-color: var(--accent); }
input::placeholder { color: var(--text3); }
/* ═══ KPI NUMBERS — mono, bright ═══ */
.kpi-value {
font-family: var(--mono);
font-weight: 700;
font-size: 20px;
color: var(--text-bright);
letter-spacing: -0.02em;
}
.kpi-label {
font-size: 9px;
text-transform: uppercase;
letter-spacing: 0.8px;
color: var(--text3);
margin-top: 2px;
}
.kpi-delta {
font-family: var(--mono);
font-size: 10px;
font-weight: 500;
}
.kpi-up { color: var(--green); }
.kpi-down { color: var(--red); }
/* ═══ RISK BADGES ═══ */
.risk { font-family: var(--mono); font-size: 9px; font-weight: 700; padding: 2px 6px; border-radius: 2px; }
.risk-critical { background: rgba(239,68,68,0.12); color: var(--red); }
.risk-high { background: rgba(212,160,23,0.12); color: var(--amber); }
.risk-medium { background: rgba(6,182,212,0.12); color: var(--cyan); }
.risk-low { background: rgba(34,197,94,0.12); color: var(--green); }
/* ═══ GRID LAYOUT ═══ */
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; }
.grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.grid-23 { display: grid; grid-template-columns: 2fr 3fr; gap: 8px; }
.grid-32 { display: grid; grid-template-columns: 3fr 2fr; gap: 8px; }
/* ═══ SECTION HEADERS — minimal ═══ */
.section-title {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--text3);
padding-bottom: 6px;
border-bottom: 1px solid var(--border);
margin-bottom: 8px;
}
/* ═══ ENTITY LINK ═══ */
.entity-link {
color: var(--accent);
cursor: pointer;
text-decoration: none;
transition: color 0.15s;
}
.entity-link:hover { color: var(--text-bright); text-shadow: 0 0 8px var(--accent-glow, rgba(0,212,255,0.3)); }
/* ═══ LIVE INDICATOR ═══ */
.live-dot {
width: 5px; height: 5px;
border-radius: 50%;
background: var(--green);
display: inline-block;
animation: livePulse 2s ease infinite;
}
@keyframes livePulse { 0%,100%{opacity:1} 50%{opacity:0.3} }
/* ═══ CHART AREA — dark bg ═══ */
.chart-container {
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 8px;
}
/* ═══ FADE IN ═══ */
.fade-in { animation: fadeIn 0.3s ease; }
@keyframes fadeIn { from{opacity:0;transform:translateY(4px)} to{opacity:1;transform:none} }
/* ═══ RESPONSIVE ═══ */
@media (max-width: 768px) {
.grid-2, .grid-3, .grid-4, .grid-23, .grid-32 { grid-template-columns: 1fr; }
.vnav { display: none !important; }
.vnav-open { display: flex !important; position: fixed !important; z-index: 9999 !important; }
.mobile-menu-btn { display: flex !important; }
.tbl { font-size: 10px; }
.tbl td, .tbl th { padding: 3px 4px; }
}
@media (min-width: 769px) { .mobile-menu-btn { display: none !important; } }
/* ═══ RECHARTS OVERRIDE ═══ */
.recharts-cartesian-grid line { stroke: var(--border) !important; }
.recharts-text { fill: var(--text3) !important; font-family: var(--mono) !important; font-size: 10px !important; }
.recharts-tooltip-wrapper .recharts-default-tooltip { background: var(--bg3) !important; border: 1px solid var(--border2) !important; border-radius: var(--radius) !important; }
/* === GRID-5, GRID-6, GRID-8 — KPI strips === */
.grid-5 { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; }
.grid-6 { display: grid; grid-template-columns: repeat(6, 1fr); gap: 6px; }
.grid-8 { display: grid; grid-template-columns: repeat(8, 1fr); gap: 6px; }
/* === KPI STRIP — Palantir Ops style === */
.kpi-strip {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 1px;
background: var(--border);
border: 1px solid var(--border);
border-radius: var(--radius);
overflow: hidden;
}
.kpi-strip .kpi-cell {
background: var(--bg2);
padding: 10px 12px;
text-align: center;
}
.kpi-strip .kpi-cell .kpi-value { font-size: 22px; line-height: 1.1; }
.kpi-strip .kpi-cell .kpi-label { margin-top: 4px; }
.kpi-strip .kpi-cell .kpi-delta { font-size: 10px; margin-top: 2px; }
/* === DONUT ROW === */
.donut-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
/* === CONTEXT MENU (...) === */
.ctx-btn {
position: absolute; top: 6px; right: 6px;
background: transparent; border: none; color: var(--text3);
cursor: pointer; font-size: 14px; padding: 2px 6px;
border-radius: var(--radius); letter-spacing: 2px;
font-family: var(--mono);
}
.ctx-btn:hover { background: var(--bg4); color: var(--text); }
.ctx-menu {
position: absolute; top: 24px; right: 6px; z-index: 100;
background: var(--bg3); border: 1px solid var(--border2);
border-radius: var(--radius); min-width: 160px;
box-shadow: 0 8px 32px rgba(0,0,0,0.5);
}
.ctx-menu button {
display: block; width: 100%; text-align: left;
padding: 6px 12px; background: none; border: none;
color: var(--text); font-family: var(--sans); font-size: 11px;
cursor: pointer;
}
.ctx-menu button:hover { background: var(--bg4); }
.ctx-menu hr { border: none; border-top: 1px solid var(--border); margin: 2px 0; }
/* === CARD RELATIVE (for ctx) === */
.card-rel { position: relative; }
@media (max-width: 768px) {
.grid-5, .grid-6, .grid-8 { grid-template-columns: repeat(2, 1fr); }
.kpi-strip { grid-template-columns: repeat(2, 1fr); }
.donut-row { grid-template-columns: repeat(2, 1fr); }
}
/* === CTX MENU V2 — Palantir Foundry style === */
.ctx-menu button {
display: flex; align-items: center; gap: 8px;
width: 100%; text-align: left;
padding: 7px 14px; background: none; border: none;
color: var(--text); font-family: var(--sans); font-size: 12px;
cursor: pointer; transition: background 0.1s;
}
.ctx-menu button:hover { background: var(--accent-glow); color: var(--text-bright); }
.ctx-menu hr { border: none; border-top: 1px solid var(--border); margin: 4px 0; }
.ctx-menu {
position: absolute; top: 28px; right: 6px; z-index: 100;
background: var(--bg3); border: 1px solid var(--border2);
border-radius: var(--radius); min-width: 200px;
box-shadow: 0 12px 48px rgba(0,0,0,0.6);
padding: 4px 0;
}
/* === V1.01 GLOBAL THIN FONTS === */
body { font-weight: 300 !important; }
h1, h2, h3, h4, h5, h6 { font-weight: 500 !important; }
.kpi-value { font-weight: 500 !important; }
.kpi-label { font-weight: 400 !important; }
.section-title { font-weight: 400 !important; }
.tbl th { font-weight: 400 !important; }
.tbl td { font-weight: 300 !important; }
.btn { font-weight: 400 !important; }
.risk { font-weight: 500 !important; }
.ctx-btn { font-weight: 300 !important; }
/* === RECHARTS TOOLTIP FIX — dark, transparent === */
.recharts-tooltip-wrapper .recharts-default-tooltip {
background: rgba(13,13,13,0.95) !important;
border: 1px solid var(--border2) !important;
border-radius: 4px !important;
font-size: 11px !important;
font-family: var(--mono) !important;
color: var(--text) !important;
box-shadow: 0 4px 16px rgba(0,0,0,0.4) !important;
padding: 6px 10px !important;
}
.recharts-tooltip-wrapper .recharts-default-tooltip .recharts-tooltip-label {
color: var(--text2) !important;
font-weight: 300 !important;
}
.recharts-tooltip-wrapper .recharts-default-tooltip .recharts-tooltip-item {
color: var(--text) !important;
font-weight: 300 !important;
}
/* Kill any cursor background rect */
.recharts-tooltip-cursor { fill: rgba(59,130,196,0.06) !important; stroke: none !important; }
.recharts-active-dot circle { r: 3 !important; }
/* === CLICKABLE LINKS in AI Insights === */
.cc-link {
color: var(--accent) !important;
cursor: pointer !important;
text-decoration: none;
border-bottom: 1px dotted rgba(59,130,196,0.3);
transition: all 0.15s;
font-weight: 400 !important;
}
.cc-link:hover {
color: var(--text-bright) !important;
border-bottom-color: var(--accent);
background: var(--accent-glow);
padding: 0 2px;
border-radius: 2px;
}
/* ═══════════════════════════════════════════════════════
MOBILE RESPONSIVE — v1.11
Comprehensive mobile layout for all pages
═══════════════════════════════════════════════════════ */
@media (max-width: 768px) {
/* === SIDEBAR === */
.vnav { width: 0 !important; display: none !important; overflow: hidden !important; }
.vnav-open { width: 260px !important; display: flex !important; position: fixed !important; left: 0; top: 0; bottom: 0; z-index: 9999 !important; box-shadow: 4px 0 24px rgba(0,0,0,0.6); }
.mobile-menu-btn { display: flex !important; position: fixed; top: 8px; left: 8px; z-index: 10000; width: 36px; height: 36px; border-radius: 6px; background: var(--bg2); border: 1px solid var(--border); align-items: center; justify-content: center; color: var(--text); font-size: 16px; cursor: pointer; }
/* === MAIN CONTENT === */
main { width: 100vw !important; max-width: 100vw !important; overflow-x: hidden !important; }
main > div { padding: 8px !important; padding-top: 48px !important; }
/* === GRIDS → stack === */
.grid-2, .grid-3, .grid-4, .grid-23, .grid-32 { display: flex !important; flex-direction: column !important; gap: 8px !important; }
.grid-5, .grid-6, .grid-8, .kpi-strip { grid-template-columns: repeat(2, 1fr) !important; }
.donut-row { grid-template-columns: 1fr 1fr !important; }
/* === CARDS === */
.card, .card-rel { min-width: 0 !important; width: 100% !important; max-width: 100vw !important; box-sizing: border-box !important; }
/* === TABLES === */
.tbl { display: block !important; overflow-x: auto !important; white-space: nowrap !important; font-size: 10px !important; -webkit-overflow-scrolling: touch; }
.tbl td, .tbl th { padding: 4px 6px !important; }
/* === TYPOGRAPHY — slightly smaller === */
.kpi-value { font-size: 16px !important; }
.kpi-label { font-size: 8px !important; }
.section-title { font-size: 9px !important; }
h1 { font-size: 14px !important; }
/* === RECHARTS === */
.recharts-wrapper, .recharts-surface { max-width: 100% !important; }
/* === FLEX CONTAINERS — wrap on mobile === */
div[style*="display: flex"][style*="gap"] { flex-wrap: wrap !important; }
div[style*="display:\"flex\""] { flex-wrap: wrap !important; }
/* === HIDE less important on mobile === */
.ctx-btn { display: none !important; }
/* === CONTROL CENTER — stack graph + panel === */
div[style*="width: 300px"], div[style*="width:300px"] { width: 100% !important; }
div[style*="width: 280px"], div[style*="width:280px"] { width: 100% !important; }
div[style*="width: 220px"], div[style*="width:220px"] { width: 100% !important; }
div[style*="width: 380px"], div[style*="width:380px"] { width: 100% !important; }
/* === CANVAS / 3D GRAPH === */
canvas { max-height: 300px !important; width: 100% !important; }
/* === INPUTS === */
input, select, textarea { font-size: 16px !important; /* prevent iOS zoom */ }
/* === TABS — scrollable === */
div[style*="width: fit-content"], div[style*="width:\"fit-content\""] { width: 100% !important; overflow-x: auto !important; -webkit-overflow-scrolling: touch; flex-wrap: nowrap !important; }
/* === IFRAME (invoice viewer) === */
iframe { height: 300px !important; }
/* === KPI STRIP cells === */
.kpi-strip .kpi-cell { padding: 6px 4px !important; }
/* === CENTERED TEXT on small items === */
.risk { font-size: 8px !important; padding: 1px 4px !important; }
}
/* === TABLET (769-1024) === */
@media (min-width: 769px) and (max-width: 1024px) {
.grid-3, .grid-4 { grid-template-columns: 1fr 1fr !important; }
.grid-5, .grid-6, .grid-8, .kpi-strip { grid-template-columns: repeat(3, 1fr) !important; }
.donut-row { grid-template-columns: 1fr 1fr !important; }
}
@media (min-width: 769px) {
.mobile-menu-btn { display: none !important; }
}
/* ═══ Mobile touch-target minimums — overnight forensic fix ═══ */
@media (max-width: 768px) {
button:not(.tile-icon):not(.chip),
a[href]:not(.inline-link),
[role="button"]:not(.icon-only) {
min-height: 44px;
min-width: 44px;
}
input, textarea, select { font-size: 16px; } /* prevent iOS auto-zoom */
body { -webkit-text-size-adjust: 100%; }
}
/* ═══ KPI CLICKABLE ═══ */
.kpi-clickable {
cursor: pointer;
transition: all 0.15s;
position: relative;
}
.kpi-clickable:hover {
background: var(--bg3, rgba(255,255,255,0.04));
transform: translateY(-1px);
box-shadow: 0 0 12px rgba(0, 212, 255, 0.15);
}
.kpi-clickable:hover .kpi-label {
color: var(--accent);
}
.kpi-clickable::after {
content: "";
position: absolute;
top: 4px;
right: 6px;
font-size: 11px;
color: var(--text3);
opacity: 0.5;
}
.kpi-clickable:hover::after {
color: var(--accent);
opacity: 1;
}
.person-row:hover {
background: var(--bg3, rgba(255,255,255,0.03));
}