@tailwind base; @tailwind components; @tailwind utilities; /* ─── Design Tokens (Strict Minimalist Light Theme: White & Dark Grey Only) ─── */ :root { --bg-base: #ffffff; /* Pure White */ --bg-surface: #ffffff; /* Pure White */ --bg-elevated: #ffffff; /* Pure White */ --bg-overlay: rgba(255, 255, 255, 0.98); --accent-primary: #09090b; /* Zinc 950 */ --accent-cyan: #18181b; /* Zinc 900 */ --accent-indigo: #18181b; --accent-emerald: #09090b; --accent-amber: #27272a; --accent-rose: #09090b; --border-subtle: #fafafa; /* Zinc 50 */ --border-medium: #f4f4f5; /* Zinc 100 */ --border-strong: #e4e4e7; /* Zinc 200 */ --text-primary: #09090b; /* Zinc 950 */ --text-secondary: #27272a; /* Zinc 900 */ --text-muted: #71717a; /* Zinc 500 */ --text-faint: #a1a1aa; /* Zinc 400 */ --glow-blue: none; --glow-cyan: none; --radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px; --radius-xl: 14px; --radius-2xl: 16px; --radius-3xl: 20px; } /* ─── Base Reset ─── */ *, *::before, *::after { box-sizing: border-box; } html { scroll-behavior: smooth; } body { background-color: var(--bg-base); color: var(--text-primary); font-family: 'Inter', -apple-system, BlinkMacSystemFont, system-ui, sans-serif; font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11'; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; overflow-x: hidden; line-height: 1.6; } /* ─── Typography ─── */ h1, h2, h3, h4, h5, h6 { font-weight: 700; line-height: 1.2; letter-spacing: -0.02em; } .font-mono, code, pre, .mono { font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace; } /* ─── Scrollbar ─── */ ::-webkit-scrollbar { width: 4px; height: 4px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: rgba(113, 113, 122, 0.2); border-radius: 99px; } ::-webkit-scrollbar-thumb:hover { background: rgba(113, 113, 122, 0.35); } /* ─── Glass Components ─── */ .glass { background: #ffffff; border: 1px solid var(--border-medium); } .glass-panel { background: #ffffff; border: 1px solid var(--border-medium); } .glass-card { background: #ffffff; border: 1px solid var(--border-medium); box-shadow: none; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .glass-card:hover { border-color: var(--border-strong); background: #ffffff; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.015); } /* ─── Card Glow Variants (Clean zinc shadows) ─── */ .card-glow-blue, .card-glow-cyan, .card-glow-emerald, .card-glow-amber, .card-glow-rose { box-shadow: 0 4px 20px rgba(24, 24, 27, 0.02); } /* ─── Gradient Text ─── */ .gradient-text, .gradient-text-blue, .gradient-text-cyan { background: linear-gradient(135deg, var(--text-primary) 0%, var(--text-secondary) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } /* ─── Buttons ─── */ .btn-primary { background: var(--text-primary); color: white; font-weight: 500; border: 1px solid var(--text-primary); border-radius: var(--radius-md); padding: 8px 16px; font-size: 12px; cursor: pointer; transition: all 0.12s ease; position: relative; overflow: hidden; } .btn-primary:hover { background: #27272a; border-color: #27272a; } .btn-primary:active { transform: scale(0.98); } .btn-primary:disabled { background: #f4f4f5; border-color: #f4f4f5; color: #a1a1aa; cursor: not-allowed; transform: none; box-shadow: none; } .btn-ghost { background: #ffffff; color: var(--text-secondary); border: 1px solid var(--border-medium); border-radius: var(--radius-md); padding: 8px 16px; font-size: 12px; font-weight: 500; cursor: pointer; transition: all 0.12s ease; } .btn-ghost:hover { background: #fafafa; border-color: var(--border-strong); color: var(--text-primary); } /* ─── Form Inputs ─── */ .input-field { width: 100%; background: #ffffff; border: 1px solid var(--border-medium); border-radius: var(--radius-md); padding: 0 12px; height: 36px; color: var(--text-primary); font-size: 12.5px; font-family: inherit; transition: all 0.12s ease; outline: none; } .input-field::placeholder { color: var(--text-muted); } .input-field:focus { border-color: var(--text-primary); background: #ffffff; } select.input-field option { background: #ffffff; color: var(--text-primary); } /* Chrome Autofill Styling Override */ .input-field:-webkit-autofill, .input-field:-webkit-autofill:hover, .input-field:-webkit-autofill:focus, .input-field:-webkit-autofill:active { -webkit-text-fill-color: var(--text-primary) !important; -webkit-box-shadow: 0 0 0px 1000px #ffffff inset !important; box-shadow: 0 0 0px 1000px #ffffff inset !important; transition: background-color 5000s ease-in-out 0s; } /* Hide native Chrome autofill key/card icons to prevent overlap with Lucide icons */ .input-field::-webkit-contacts-auto-fill-button, .input-field::-webkit-credentials-auto-fill-button { visibility: hidden; display: none !important; pointer-events: none; } /* ─── Status Badges (Strict Minimalist Grays) ─── */ .badge { display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: 99px; font-size: 11px; font-weight: 650; letter-spacing: 0.01em; background: #f4f4f5; color: #27272a; border: 1px solid #e4e4e7; } .badge-emerald, .badge-blue, .badge-indigo, .badge-slate { background: #f4f4f5; color: #18181b; border: 1px solid #e4e4e7; } .badge-amber { background: #fffbeb; color: #78350f; border: 1px solid #fef3c7; } .badge-rose { background: #fef2f2; color: #991b1b; border: 1px solid #fee2e2; } /* ─── Dividers ─── */ .divider { border: none; border-top: 1px solid var(--border-subtle); margin: 0; } /* ─── Ambient Background Effects (Flowing Cyber Wave & Tech Grid) ─── */ .ambient-bg, .mesh-bg { position: fixed; inset: 0; pointer-events: none; z-index: 0; background-color: var(--bg-base); background-image: radial-gradient(circle at 50% 50%, rgba(6, 182, 212, 0.08) 0%, rgba(59, 130, 246, 0.03) 40%, transparent 70%), radial-gradient(circle at 50% 50%, transparent 30%, var(--bg-base) 85%), linear-gradient(rgba(148, 163, 184, 0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(148, 163, 184, 0.03) 1px, transparent 1px), url("data:image/svg+xml;utf8,"); background-size: cover, cover, 80px 80px, 80px 80px, cover; background-position: center; background-repeat: no-repeat, no-repeat, repeat, repeat, no-repeat; } .mesh-bg { position: absolute; } /* Translucent Glass Overlay for Cards and Modals */ .glass-overlay { background-color: rgba(255, 255, 255, 0.45) !important; backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid rgba(228, 228, 231, 0.6) !important; } .dark .glass-overlay { background-color: rgba(9, 9, 11, 0.45) !important; backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid rgba(39, 39, 42, 0.4) !important; } /* ─── Kiosk Scanner Laser ─── */ @keyframes scan-line { 0% { top: 0%; opacity: 1; } 48% { opacity: 1; } 50% { top: 100%; opacity: 0; } 51% { top: 0%; opacity: 0; } 52% { opacity: 1; } 100% { top: 100%; opacity: 1; } } .scanner-laser { position: absolute; left: 0; width: 100%; height: 1.5px; background: linear-gradient(90deg, transparent 0%, rgba(24, 24, 27, 0.5) 30%, rgba(24, 24, 27, 0.5) 70%, transparent 100%); box-shadow: 0 0 8px rgba(24, 24, 27, 0.15); animation: scan-line 3s cubic-bezier(0.4,0,0.6,1) infinite; } /* ─── Fade In Animation ─── */ @keyframes fadeInUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .animate-fadeInUp { animation: fadeInUp 0.35s cubic-bezier(0.4,0,0.2,1) both; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .animate-fade-in { animation: fadeIn 0.25s ease both; } /* ─── Pulse Ring ─── */ @keyframes pulse-ring { 0% { transform: scale(1); opacity: 0.5; } 100% { transform: scale(1.4); opacity: 0; } } .pulse-ring::after { content: ''; position: absolute; inset: 0; border-radius: 50%; background: currentColor; animation: pulse-ring 1.5s ease infinite; } /* ─── Loading Skeleton ─── */ @keyframes shimmer { 0% { background-position: -400px 0; } 100% { background-position: 400px 0; } } .skeleton { background: linear-gradient(90deg, rgba(24, 24, 27, 0.02) 25%, rgba(24, 24, 27, 0.05) 50%, rgba(24, 24, 27, 0.02) 75%); background-size: 400px 100%; animation: shimmer 1.5s infinite; border-radius: var(--radius-md); } /* ─── Page Transition ─── */ .page-enter { animation: fadeInUp 0.3s cubic-bezier(0.4,0,0.2,1) both; } /* ─── Sidebar Active Indicator ─── */ .nav-active-dot { width: 3px; height: 24px; border-radius: 99px; background: var(--text-primary); } /* ─── Table Styles ─── */ .data-table { width: 100%; border-collapse: collapse; } .data-table thead tr { border-bottom: 1px solid var(--border-medium); } .data-table thead th { padding: 10px 16px; font-size: 9.5px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); font-family: var(--font-inter), sans-serif; background: #ffffff; border-bottom: 1px solid var(--border-medium); } .data-table tbody tr { border-bottom: 1px solid var(--border-medium); transition: background 0.12s ease; } .data-table tbody tr:last-child { border-bottom: none; } .data-table tbody tr:hover { background: #fafafa; } .data-table tbody td { padding: 12px 16px; font-size: 12px; color: var(--text-secondary); } /* ─── Modal Backdrop ─── */ .modal-backdrop { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.2); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); z-index: 50; display: flex; align-items: center; justify-content: center; padding: 16px; animation: fadeIn 0.2s ease; } .modal-content { background: var(--bg-surface); border: 1px solid var(--border-medium); border-radius: var(--radius-2xl); padding: 28px; width: 100%; max-height: 90vh; overflow-y: auto; animation: fadeInUp 0.25s cubic-bezier(0.4,0,0.2,1) both; box-shadow: 0 12px 40px rgba(0, 0, 0, 0.06); } /* ─── Stat Card Accent Lines ─── */ .stat-card { position: relative; overflow: hidden; } .stat-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: var(--border-medium); } /* ─── Kiosk Full Screen ─── */ .kiosk-frame { background: #ffffff; } /* ─── Corner Brackets ─── */ .corner-bracket { position: absolute; width: 20px; height: 20px; } .corner-bracket-tl { top: 0; left: 0; border-top: 2px solid; border-left: 2px solid; border-radius: 4px 0 0 0; } .corner-bracket-tr { top: 0; right: 0; border-top: 2px solid; border-right: 2px solid; border-radius: 0 4px 0 0; } .corner-bracket-bl { bottom: 0; left: 0; border-bottom: 2px solid; border-left: 2px solid; border-radius: 0 0 0 4px; } .corner-bracket-br { bottom: 0; right: 0; border-bottom: 2px solid; border-right: 2px solid; border-radius: 0 0 4px 0; } /* ─── Tooltip ─── */ [data-tooltip] { position: relative; } [data-tooltip]::after { content: attr(data-tooltip); position: absolute; bottom: calc(100% + 6px); left: 50%; transform: translateX(-50%); background: rgba(24, 24, 27, 0.95); border: 1px solid var(--border-medium); color: #ffffff; font-size: 11px; padding: 5px 10px; border-radius: var(--radius-sm); white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity 0.15s ease; z-index: 99; } [data-tooltip]:hover::after { opacity: 1; } /* ─── Number Ticker ─── */ @keyframes countUp { from { transform: translateY(6px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .count-up { animation: countUp 0.5s cubic-bezier(0.4,0,0.2,1) both; } /* ─── Custom Form Icon Padding Helpers ─── */ .input-field.pl-icon { padding-left: 40px !important; } .input-field.pr-icon { padding-right: 40px !important; } /* ─── Robotic Eye & Cybernetic Animations ─── */ @keyframes eyeBlink { 0%, 90%, 94%, 98%, 100% { transform: scaleY(1); } 92%, 96% { transform: scaleY(0.15); } } @keyframes pupilPulse { 0%, 100% { transform: scale(1); filter: drop-shadow(0 0 2px #22d3ee) drop-shadow(0 0 6px #0891b2); } 50% { transform: scale(1.15); filter: drop-shadow(0 0 4px #22d3ee) drop-shadow(0 0 12px #0891b2); } } @keyframes rotateRing { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @keyframes laserFlicker { 0%, 100% { opacity: 0.4; } 50% { opacity: 0.85; filter: drop-shadow(0 0 3px #22d3ee); } } .animate-eye-lid { transform-origin: 50px 50px; animation: eyeBlink 5s ease-in-out infinite; } .animate-pupil { transform-origin: 50px 50px; animation: pupilPulse 2s ease-in-out infinite; } .animate-rotate-ring { transform-origin: 50px 50px; animation: rotateRing 12s linear infinite; } .animate-rotate-ring-reverse { transform-origin: 50px 50px; animation: rotateRing 8s linear infinite reverse; } .animate-laser { animation: laserFlicker 1.5s ease-in-out infinite; } /* ─── Dark Theme Overrides ─── */ .dark { --bg-base: #09090b; /* Zinc 950 */ --bg-surface: #09090b; /* Zinc 950 */ --bg-elevated: #18181b; /* Zinc 900 */ --bg-overlay: rgba(9, 9, 11, 0.98); --accent-primary: #ffffff; --accent-cyan: #22d3ee; --accent-indigo: #818cf8; --accent-emerald: #34d399; --accent-amber: #fbbf24; --accent-rose: #f87171; --border-subtle: #18181b; /* Zinc 900 */ --border-medium: #27272a; /* Zinc 800 */ --border-strong: #3f3f46; /* Zinc 700 */ --text-primary: #f4f4f5; /* Zinc 100 */ --text-secondary: #e4e4e7; /* Zinc 200 */ --text-muted: #a1a1aa; /* Zinc 400 */ --text-faint: #71717a; /* Zinc 500 */ } /* Dynamic dark mode utility overrides for hardcoded Tailwind classes */ .dark .bg-white { background-color: #18181b !important; } .dark .border-zinc-100, .dark .border-slate-100, .dark .border-slate-200, .dark .border-slate-250 { border-color: #27272a !important; } .dark .text-slate-900, .dark .text-slate-800, .dark .text-zinc-950, .dark .text-zinc-900, .dark .text-zinc-850, .dark .text-zinc-805, .dark .text-zinc-800, .dark .text-zinc-755, .dark .text-zinc-750 { color: #f4f4f5 !important; /* Zinc 100 */ } .dark .text-slate-555, .dark .text-slate-550, .dark .text-slate-500, .dark .text-slate-450, .dark .text-slate-400, .dark .text-zinc-555, .dark .text-zinc-550, .dark .text-zinc-500, .dark .text-zinc-450, .dark .text-zinc-400 { color: #a1a1aa !important; /* Zinc 400 */ } .dark .text-slate-650, .dark .text-slate-600, .dark .text-slate-700, .dark .text-zinc-650, .dark .text-zinc-605, .dark .text-zinc-600, .dark .text-zinc-700 { color: #d4d4d8 !important; /* Zinc 300 */ } .dark .bg-zinc-50, .dark .bg-zinc-55, .dark .bg-slate-50, .dark .bg-slate-100 { background-color: #27272a !important; } .dark .bg-zinc-100 { background-color: #18181b !important; } .dark .border-zinc-200 { border-color: #3f3f46 !important; } .dark .hover\:bg-zinc-50:hover, .dark .hover\:bg-zinc-100:hover, .dark .hover\:bg-slate-50:hover, .dark .hover\:bg-slate-100:hover { background-color: #27272a !important; } .dark .hover\:bg-white\/\[0\.015\]:hover { background-color: rgba(255, 255, 255, 0.03) !important; } .dark .hover\:border-zinc-205:hover, .dark .hover\:border-zinc-200:hover, .dark .hover\:border-zinc-300:hover, .dark .hover\:border-slate-200:hover, .dark .hover\:border-slate-300:hover { border-color: #3f3f46 !important; } /* Component overrides */ .dark .glass, .dark .glass-panel, .dark .glass-card { background: #18181b; border-color: #27272a; } .dark .data-table thead th { background: #18181b; border-color: #27272a; } .dark .data-table tbody tr { border-color: #27272a; } .dark .data-table tbody tr:hover { background: #27272a !important; } .dark .modal-content { background: #18181b; border-color: #27272a; box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4); } .dark .input-field { background: #18181b !important; color: #f4f4f5 !important; border-color: #27272a !important; } .dark .input-field:focus { border-color: #ffffff !important; } .dark select.input-field option { background: #18181b; color: #f4f4f5; } .dark .bg-zinc-50\/30 { background-color: rgba(39, 39, 42, 0.3) !important; } .dark .border-zinc-150 { border-color: #27272a !important; } .dark .divide-zinc-100 > :not([hidden]) ~ :not([hidden]) { border-color: #27272a !important; } .dark .badge-emerald { background-color: rgba(16, 185, 129, 0.1) !important; color: #34d399 !important; border-color: rgba(16, 185, 129, 0.2) !important; } .dark .badge-amber { background-color: rgba(245, 158, 11, 0.1) !important; color: #fbbf24 !important; border-color: rgba(245, 158, 11, 0.2) !important; } .dark .badge-rose { background-color: rgba(244, 63, 94, 0.1) !important; color: #f87171 !important; border-color: rgba(244, 63, 94, 0.2) !important; } /* Custom dark mode overrides for buttons, active components, and alerts */ .dark .btn-primary { background: #ffffff !important; color: #09090b !important; border-color: #ffffff !important; } .dark .btn-primary:hover { background: #e4e4e7 !important; border-color: #e4e4e7 !important; } .dark .btn-primary:disabled { background: #27272a !important; border-color: #27272a !important; color: #71717a !important; } .dark .btn-ghost { background: #18181b !important; color: var(--text-secondary) !important; border-color: var(--border-medium) !important; } .dark .btn-ghost:hover { background: #27272a !important; border-color: var(--border-strong) !important; color: var(--text-primary) !important; } /* Background overrides for active elements */ .dark .bg-zinc-950 { background-color: #ffffff !important; color: #09090b !important; } .dark .border-zinc-950 { border-color: #ffffff !important; } .dark .bg-zinc-900 { background-color: #27272a !important; } /* Specific overrides for non-badge amber alerts in dark mode */ .dark .bg-amber-50\/50 { background-color: rgba(245, 158, 11, 0.1) !important; } .dark .border-amber-200\/50 { border-color: rgba(245, 158, 11, 0.2) !important; } .dark .text-amber-900 { color: #fbbf24 !important; } .dark .text-amber-700 { color: #f59e0b !important; } /* Accent icon/text color overrides */ .dark .text-emerald-600 { color: #34d399 !important; } .dark .text-blue-600 { color: #60a5fa !important; } .dark .text-rose-600 { color: #f87171 !important; } .dark .text-amber-600 { color: #fbbf24 !important; } .dark .border-rose-100 { border-color: rgba(244, 63, 94, 0.2) !important; } .dark .hover\:bg-rose-50:hover { background-color: rgba(244, 63, 94, 0.1) !important; } .dark .border-zinc-300 { border-color: #52525b !important; } /* Dark mode flowing wave background */ .dark .ambient-bg, .dark .mesh-bg { background-color: #09090b !important; background-image: radial-gradient(circle at 50% 50%, rgba(6, 182, 212, 0.12) 0%, rgba(37, 99, 235, 0.06) 40%, transparent 70%), radial-gradient(circle at 50% 50%, transparent 30%, #09090b 85%), linear-gradient(rgba(34, 211, 238, 0.02) 1px, transparent 1px), linear-gradient(90deg, rgba(34, 211, 238, 0.02) 1px, transparent 1px), url("data:image/svg+xml;utf8,") !important; background-size: cover, cover, 80px 80px, 80px 80px, cover !important; background-position: center !important; background-repeat: no-repeat, no-repeat, repeat, repeat, no-repeat !important; } /* Kiosk header and footer translucent glass overlays */ .kiosk-header { background-color: rgba(255, 255, 255, 0.45) !important; backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); } .dark .kiosk-header { background-color: rgba(9, 9, 11, 0.45) !important; backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); } .kiosk-footer { background-color: rgba(255, 255, 255, 0.45) !important; backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); } .dark .kiosk-footer { background-color: rgba(9, 9, 11, 0.45) !important; backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); }