/* =================================================== TradeStorm — Editorial Tech Design System Playfair Display · Space Grotesk · Space Mono =================================================== */ :root { --bg: #f7f6f2; --fg: #1a1a1a; --primary: #3d7068; --primary-hover: #2f5a53; --border: #e5e4de; --muted: #505050; --card-bg: #ffffff; --card-hover: #fafaf8; --success: #3d7068; --warning: #b08d3a; --danger: #a04040; --info: #3b82f6; --font-serif: 'Playfair Display', 'Georgia', serif; --font-sans: 'Space Grotesk', system-ui, -apple-system, sans-serif; --font-mono: 'Space Mono', 'Courier New', monospace; --ease-editorial: cubic-bezier(0.16, 1, 0.3, 1); --duration: 700ms; --radius: 2px; } /* ===== RESET ===== */ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } html { font-size: 16px; -webkit-font-smoothing: antialiased; } body { font-family: var(--font-sans); background: var(--bg); color: var(--fg); line-height: 1.6; min-height: 100vh; } #root { min-height: 100vh; display: flex; flex-direction: column; } /* ===== FIXED BACKGROUND GRID ===== */ .bg-grid { position: fixed; inset: 0; pointer-events: none; z-index: 0; } .bg-grid::before { content: ''; position: absolute; inset: 0; background-image: linear-gradient(to right, var(--border) 1px, transparent 1px), linear-gradient(to bottom, var(--border) 1px, transparent 1px); background-size: 40px 40px; mask-image: radial-gradient(ellipse 60% 60% at 50% 50%, rgba(0,0,0,0.40) 0%, transparent 100%); -webkit-mask-image: radial-gradient(ellipse 60% 60% at 50% 50%, rgba(0,0,0,0.40) 0%, transparent 100%); } .bg-grid::after { content: ''; position: absolute; top: 0; bottom: 0; left: 25%; right: 25%; border-left: 1px solid var(--border); border-right: 1px solid var(--border); background: linear-gradient(to right, transparent calc(50% - 0.5px), var(--border) calc(50% - 0.5px), var(--border) calc(50% + 0.5px), transparent calc(50% + 0.5px)); opacity: 0.5; } /* ===== SCROLLBAR ===== */ ::-webkit-scrollbar { width: 4px; } ::-webkit-scrollbar-track { background: var(--bg); } ::-webkit-scrollbar-thumb { background: var(--border); } ::-webkit-scrollbar-thumb:hover { background: var(--muted); } /* ===== LOADING ===== */ .loading-screen { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; gap: 2rem; position: relative; z-index: 1; } .loading-logo { width: 140px; object-fit: contain; border-radius: var(--radius); mix-blend-mode: multiply; filter: contrast(1.05); animation: editorialPulse 2.5s var(--ease-editorial) infinite; } @keyframes editorialPulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.6; transform: scale(1.02); } } .loading-spinner { width: 40px; height: 2px; background: var(--border); position: relative; overflow: hidden; border-radius: 0; } .loading-spinner::after { content: ''; position: absolute; left: 0; top: 0; width: 60%; height: 100%; background: var(--primary); animation: scanSlide 1.5s cubic-bezier(0.8, 0, 0.2, 1) infinite; } @keyframes scanSlide { 0% { transform: translateX(-100%); } 100% { transform: translateX(250%); } } .loading-text { font-family: var(--font-mono); font-size: 12px; text-transform: uppercase; letter-spacing: 0.3em; color: var(--muted); } /* ===== TOP BAR ===== */ .top-bar { display: flex; align-items: center; justify-content: space-between; padding: 14px 32px; background: rgba(247, 246, 242, 0.8); border-bottom: 1px solid var(--border); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); position: sticky; top: 0; z-index: 100; transition: all var(--duration) var(--ease-editorial); } .brand { display: flex; align-items: center; gap: 14px; } .brand-icon { width: 42px; height: 42px; border: none; border-radius: var(--radius); display: flex; align-items: center; justify-content: center; overflow: hidden; } .brand-icon img { mix-blend-mode: multiply; filter: contrast(1.05); } .brand h1 { font-family: var(--font-serif); font-size: 1.65rem; font-weight: 300; letter-spacing: -0.01em; } .brand h1 span { color: var(--fg); } .brand-sub { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.3em; color: var(--muted); } .top-bar-right { display: flex; align-items: center; gap: 16px; } .scenario-pill { display: inline-flex; align-items: center; gap: 6px; padding: 5px 14px; background: transparent; border: 1px solid var(--border); border-radius: var(--radius); font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.25em; color: var(--primary); transition: all var(--duration) var(--ease-editorial); } .scenario-pill:hover { border-color: var(--primary); } .month-badge { padding: 5px 14px; background: var(--fg); border: none; border-radius: var(--radius); font-family: var(--font-mono); font-size: 12px; font-weight: 700; letter-spacing: 0.2em; color: var(--bg); } /* ===== MAIN LAYOUT ===== */ .main-content { display: grid; grid-template-columns: 280px 1px 1fr; flex: 1; min-height: 0; height: calc(100vh - 68px); overflow: hidden; position: relative; z-index: 1; } .layout-divider { background: var(--border); width: 1px; } /* ===== SIDEBAR ===== */ .sidebar { display: flex; flex-direction: column; gap: 0; height: 100%; overflow-y: auto; padding: 0; } /* ===== PANELS ===== */ .panel { background: transparent; border-bottom: 1px solid var(--border); padding: 20px 24px; transition: background var(--duration) var(--ease-editorial); } .panel:hover { background: rgba(255,255,255,0.5); } .panel-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; } .panel-title { display: flex; align-items: center; gap: 8px; font-family: var(--font-mono); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.25em; color: var(--muted); } .panel-title svg { width: 14px; height: 14px; color: var(--primary); } /* ===== FORMS ===== */ .form-group { margin-bottom: 14px; } .form-label { display: block; font-family: var(--font-mono); font-size: 11px; font-weight: 400; text-transform: uppercase; letter-spacing: 0.2em; color: var(--muted); margin-bottom: 6px; } .form-select, .form-input { width: 100%; padding: 10px 0; background: transparent; border: none; border-bottom: 1px solid var(--border); color: var(--fg); font-family: var(--font-sans); font-size: 1rem; outline: none; border-radius: 0; transition: border-color var(--duration) var(--ease-editorial); appearance: none; } .form-select:focus, .form-input:focus { border-bottom-color: var(--primary); } .form-select option { background: var(--bg); color: var(--fg); } /* ===== BUTTONS ===== */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 12px 20px; border: 1px solid var(--border); border-radius: var(--radius); font-family: var(--font-mono); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.25em; cursor: pointer; position: relative; overflow: hidden; transition: all var(--duration) var(--ease-editorial); } .btn::after { content: ''; position: absolute; inset: 0; background: rgba(255,255,255,0.20); transform: translateY(100%); transition: transform var(--duration) var(--ease-editorial); } .btn:hover::after { transform: translateY(0); } .btn:hover { letter-spacing: 0.4em; } .btn:active { transform: scale(0.98); } .btn svg { width: 14px; height: 14px; } .btn-primary { background: var(--primary); color: #fff; border-color: var(--primary); } .btn-primary:hover { background: var(--primary-hover); border-color: var(--primary-hover); } .btn-success { background: var(--primary); color: #fff; border-color: var(--primary); } .btn-warning { background: transparent; color: var(--warning); border-color: var(--warning); } .btn-warning:hover { background: var(--warning); color: #fff; } .btn-danger { background: transparent; color: var(--danger); border-color: var(--danger); } .btn-outline { background: transparent; color: var(--fg); border-color: var(--border); } .btn-outline:hover { border-color: var(--fg); } .btn-sm { padding: 8px 14px; font-size: 11px; } .btn-block { width: 100%; } /* ===== KPI CARDS ===== */ .kpi-grid { display: grid; grid-template-columns: repeat(4, 1fr); border-bottom: 1px solid var(--border); } .kpi-card { padding: 24px; border-right: 1px solid var(--border); transition: background var(--duration) var(--ease-editorial); } .kpi-card:last-child { border-right: none; } .kpi-card:hover { background: var(--card-bg); } .kpi-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; } .kpi-label { font-family: var(--font-mono); font-size: 11px; font-weight: 400; text-transform: uppercase; letter-spacing: 0.25em; color: var(--muted); } .kpi-icon { width: 48px; height: 48px; border: 1px solid var(--border); border-radius: var(--radius); display: flex; align-items: center; justify-content: center; } .kpi-icon svg { width: 14px; height: 14px; } .kpi-value { font-family: var(--font-serif); font-size: 3rem; font-weight: 300; letter-spacing: -0.02em; line-height: 1.1; color: var(--fg); } .kpi-change { font-family: var(--font-mono); font-size: 11px; font-weight: 400; letter-spacing: 0.1em; margin-top: 6px; } .kpi-change.positive { color: var(--primary); } .kpi-change.negative { color: var(--danger); } /* ===== EVENTS ===== */ .event-list { display: flex; flex-direction: column; gap: 0; max-height: 180px; overflow-y: auto; } .event-item { display: flex; align-items: flex-start; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--border); font-family: var(--font-sans); font-size: 0.92rem; line-height: 1.5; animation: editorialSlide 700ms var(--ease-editorial); } .event-item:last-child { border-bottom: none; } .event-item.warning { color: var(--warning); } .event-item.danger { color: var(--danger); } .event-item.success { color: var(--primary); } .event-item.info { color: var(--fg); } @keyframes editorialSlide { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } /* ===== CHARTS ===== */ .charts-grid { display: grid; grid-template-columns: repeat(2, 1fr); } .chart-container { height: 200px; } /* ===== SHIPMENTS ===== */ .shipment-list { display: flex; flex-direction: column; gap: 0; max-height: 200px; overflow-y: auto; } .shipment-item { display: flex; align-items: center; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid var(--border); font-size: 0.92rem; transition: background var(--duration) var(--ease-editorial); } .shipment-item:last-child { border-bottom: none; } .shipment-badge { padding: 3px 10px; border: 1px solid var(--border); border-radius: var(--radius); font-family: var(--font-mono); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.15em; } .shipment-badge.transit { color: var(--info); border-color: var(--info); } .shipment-badge.arriving { color: var(--primary); border-color: var(--primary); } .shipment-badge.delivered { color: var(--muted); } /* ===== DECISION PREVIEW ===== */ .preview-grid { display: grid; grid-template-columns: 1fr 1fr; border: 1px solid var(--border); border-radius: var(--radius); } .preview-item { padding: 10px 14px; border-bottom: 1px solid var(--border); border-right: 1px solid var(--border); } .preview-item:nth-child(2n) { border-right: none; } .preview-item:nth-last-child(-n+2) { border-bottom: none; } .preview-item .label { font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.2em; color: var(--muted); } .preview-item .value { font-family: var(--font-mono); font-size: 1rem; font-weight: 700; color: var(--fg); margin-top: 2px; } .preview-item .value.affordable { color: var(--primary); } .preview-item .value.expensive { color: var(--danger); } /* ===== ORACLE BANNER ===== */ .oracle-banner { border-bottom: 1px solid var(--border); padding: 20px 28px; animation: editorialSlide 1s var(--ease-editorial); } .oracle-banner .oracle-title { font-family: var(--font-mono); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.25em; color: var(--primary); margin-bottom: 6px; display: flex; align-items: center; gap: 8px; } .oracle-banner .oracle-text { font-family: var(--font-serif); font-size: 1.2rem; font-weight: 300; font-style: italic; color: var(--fg); line-height: 1.6; } /* ===== MAP ===== */ .map-container { border-bottom: 1px solid var(--border); overflow: hidden; height: 600px; min-height: 500px; } /* ===== INVENTORY BARS ===== */ .inventory-bar-track { height: 2px; background: var(--border); margin-top: 6px; position: relative; overflow: hidden; } .inventory-bar-fill { height: 100%; transition: width 800ms var(--ease-editorial); } /* ===== SCAN LINE ===== */ .scan-line { width: 100%; height: 2px; background: var(--border); position: relative; overflow: hidden; } .scan-line::after { content: ''; position: absolute; left: 0; top: 0; width: 40%; height: 100%; background: var(--info); animation: scanSlide 2s cubic-bezier(0.8, 0, 0.2, 1) infinite; } /* ===== UTILITY ===== */ .text-mono { font-family: var(--font-mono); } .text-serif { font-family: var(--font-serif); } .text-muted { color: var(--muted); } .flex { display: flex; } .flex-col { flex-direction: column; } .items-center { align-items: center; } .justify-between { justify-content: space-between; } .gap-sm { gap: 8px; } .gap-md { gap: 14px; } .gap-lg { gap: 20px; } /* ===== LEAFLET OVERRIDES ===== */ .leaflet-container { font-family: var(--font-sans); background: #eae9e4 !important; } .leaflet-control-zoom { border: none !important; box-shadow: none !important; } .leaflet-control-zoom a { background: var(--bg) !important; color: var(--fg) !important; border: 1px solid var(--border) !important; border-radius: var(--radius) !important; width: 28px !important; height: 28px !important; line-height: 28px !important; font-size: 14px !important; } .leaflet-control-zoom a:hover { background: var(--card-bg) !important; border-color: var(--primary) !important; } .leaflet-popup-content-wrapper { background: var(--bg) !important; color: var(--fg) !important; border: 1px solid var(--border) !important; border-radius: var(--radius) !important; box-shadow: none !important; font-family: var(--font-sans) !important; } .leaflet-popup-tip { background: var(--bg) !important; box-shadow: none !important; } .leaflet-popup-close-button { color: var(--muted) !important; } .map-marker-label { font-family: var(--font-mono); font-size: 11px; font-weight: 700; letter-spacing: 0.05em; padding: 3px 8px; border-radius: var(--radius); white-space: nowrap; border: 1px solid; } .map-marker-label.factory { background: rgba(247, 246, 242, 0.95); color: var(--warning); border-color: var(--warning); } .map-marker-label.port { background: rgba(247, 246, 242, 0.95); color: var(--info); border-color: var(--info); } .map-marker-label.warehouse { background: rgba(247, 246, 242, 0.95); color: var(--primary); border-color: var(--primary); } .leaflet-control-attribution { background: rgba(247, 246, 242, 0.7) !important; color: var(--muted) !important; font-size: 9px !important; font-family: var(--font-mono) !important; } .leaflet-control-attribution a { color: var(--primary) !important; } /* ===== RESPONSIVE ===== */ @media (max-width: 1024px) { .main-content { grid-template-columns: 1fr; height: auto; overflow: visible; } .layout-divider { display: none; } .sidebar { height: auto; overflow: visible; } .kpi-grid { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 640px) { .top-bar { padding: 10px 16px; flex-wrap: wrap; gap: 8px; } .kpi-grid { grid-template-columns: 1fr; } .charts-grid { grid-template-columns: 1fr; } }