@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;600;700;900&family=VT323&display=swap'); @tailwind base; @tailwind components; @tailwind utilities; :root { --font-body: 'Noto Sans TC'; --font-matrix: 'VT323'; --warm-bg: #f6f0e1; } html, body { margin: 0; padding: 0; min-height: 100%; background: radial-gradient(circle at 20% 20%, rgba(255, 255, 255, 0.55), transparent 35%), radial-gradient(circle at 80% 15%, rgba(209, 67, 45, 0.12), transparent 35%), #f6f0e1; color: #2a2018; } * { box-sizing: border-box; } body { font-family: var(--font-body), Arial, sans-serif; } .dashboard-shell { min-height: 100vh; background: linear-gradient(140deg, rgba(255, 255, 255, 0.65), rgba(246, 240, 225, 0.85)); } .panel-glow { border: 1px solid rgba(255, 255, 255, 0.5); background: linear-gradient(170deg, rgba(255, 248, 230, 0.86), rgba(246, 240, 225, 0.88)); box-shadow: 0 20px 45px rgba(95, 53, 44, 0.1); } .dot-matrix { font-family: var(--font-matrix), monospace; letter-spacing: 0.09em; } .status-led { width: 0.6rem; height: 0.6rem; border-radius: 9999px; display: inline-block; } .status-led-ok { background: #1a9a57; } .status-led-warn { background: #dcb53b; } .status-led-danger { background: #d1432d; } @keyframes top-edge-glow { 0% { box-shadow: 0 0 0 rgba(235, 90, 40, 0.0), 0 0 0 rgba(235, 90, 40, 0.0); border-color: rgba(188, 68, 43, 0.7); } 50% { box-shadow: 0 0 18px rgba(235, 90, 40, 0.35), 0 0 36px rgba(235, 90, 40, 0.2); border-color: rgba(235, 90, 40, 1); } 100% { box-shadow: 0 0 0 rgba(235, 90, 40, 0), 0 0 0 rgba(235, 90, 40, 0); border-color: rgba(188, 68, 43, 0.9); } } .prop-top-edge { animation: top-edge-glow 1.8s ease-in-out infinite; } @keyframes dot-matrix-pulse { 0%, 100% { opacity: 0.35; transform: translateY(0); } 50% { opacity: 1; transform: translateY(-2px); } } .dot-matrix-loading { animation: dot-matrix-pulse 1s steps(1) infinite; }