aboodhay's picture
feat: unified Space - serve frontend + backend in one container
8521cd6
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
/* RASAD Premium Dark Design System */
--background: 220 20% 5%; /* #0A0C0F INK */
--foreground: 40 25% 92%;
--surface: 215 30% 9%; /* #0F1722 deep navy */
--surface-2: 215 25% 12%;
--paper: 42 27% 92%; /* #F0EDE6 */
--card: 215 30% 9%;
--card-foreground: 40 25% 92%;
--popover: 215 30% 9%;
--popover-foreground: 40 25% 92%;
--primary: 5 65% 48%; /* signal red #C8392D */
--primary-foreground: 0 0% 100%;
--primary-glow: 5 80% 58%;
--secondary: 215 25% 14%;
--secondary-foreground: 40 25% 92%;
--muted: 215 20% 14%;
--muted-foreground: 0 0% 60%;
--accent: 5 65% 48%;
--accent-foreground: 0 0% 100%;
--verified: 152 68% 32%; /* #1A8A5A */
--verified-foreground: 0 0% 100%;
--warning: 36 80% 52%; /* #E8A020 */
--warning-foreground: 0 0% 8%;
--info: 212 50% 63%; /* #6B9BD4 */
--info-foreground: 0 0% 8%;
--destructive: 5 65% 48%;
--destructive-foreground: 0 0% 100%;
--border: 0 0% 100% / 0.08;
--input: 215 25% 14%;
--ring: 5 65% 48%;
--radius: 0.75rem;
--gradient-hero: radial-gradient(ellipse at top right, hsl(5 65% 48% / 0.15), transparent 60%),
radial-gradient(ellipse at bottom left, hsl(212 50% 30% / 0.18), transparent 55%);
--gradient-signal: linear-gradient(135deg, hsl(5 65% 48%), hsl(5 80% 58%));
--gradient-card: linear-gradient(180deg, hsl(215 30% 11% / 0.9), hsl(215 30% 7% / 0.95));
--shadow-glow: 0 0 40px hsl(5 65% 48% / 0.25);
--shadow-elev: 0 12px 40px -12px hsl(0 0% 0% / 0.6);
--sidebar-background: 215 30% 9%;
--sidebar-foreground: 40 25% 92%;
--sidebar-primary: 5 65% 48%;
--sidebar-primary-foreground: 0 0% 100%;
--sidebar-accent: 215 25% 14%;
--sidebar-accent-foreground: 40 25% 92%;
--sidebar-border: 0 0% 100% / 0.06;
--sidebar-ring: 5 65% 48%;
}
}
@layer base {
* { @apply border-border; }
html {
font-family: 'Noto Kufi Arabic', system-ui, sans-serif;
scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
/* Anchor offsets so headers don't get hidden under the sticky navbar */
:target,
[id^="verify-"], [id^="section-"] {
scroll-margin-top: 96px;
}
/* Better focus rings */
*:focus-visible {
outline: 2px solid hsl(var(--primary) / 0.6);
outline-offset: 2px;
border-radius: 6px;
}
/* Custom scrollbar (subtle) */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
background: hsl(0 0% 100% / 0.06);
border-radius: 999px;
border: 2px solid transparent;
background-clip: padding-box;
}
::-webkit-scrollbar-thumb:hover { background: hsl(0 0% 100% / 0.12); background-clip: padding-box; }
body {
@apply bg-background text-foreground antialiased;
background-image:
radial-gradient(ellipse at 20% -10%, hsl(5 65% 35% / 0.08), transparent 50%),
radial-gradient(ellipse at 90% 10%, hsl(212 50% 25% / 0.08), transparent 50%),
linear-gradient(hsl(0 0% 100% / 0.015) 1px, transparent 1px),
linear-gradient(90deg, hsl(0 0% 100% / 0.015) 1px, transparent 1px);
background-size: auto, auto, 56px 56px, 56px 56px;
}
h1, h2, h3, h4 { font-family: 'Noto Kufi Arabic', sans-serif; font-weight: 800; letter-spacing: -0.005em; }
/* Latin display (numbers, codes, EN labels) β€” Bebas for impact */
.display, .font-display { font-family: 'Bebas Neue', 'Noto Kufi Arabic', sans-serif; letter-spacing: 0.02em; }
.font-mono, code, .mono { font-family: 'IBM Plex Mono', ui-monospace, monospace; }
}
@layer components {
.glass-panel {
@apply rounded-2xl border border-white/[0.06] bg-[var(--gradient-card)] backdrop-blur-xl;
box-shadow: var(--shadow-elev);
}
.signal-glow { box-shadow: var(--shadow-glow); }
.hairline { @apply border border-white/[0.06]; }
.chip {
@apply inline-flex items-center gap-1.5 rounded-full border border-white/[0.08] bg-white/[0.03] px-3 py-1 text-xs text-foreground/80;
}
.grid-bg {
background-image:
linear-gradient(hsl(0 0% 100% / 0.03) 1px, transparent 1px),
linear-gradient(90deg, hsl(0 0% 100% / 0.03) 1px, transparent 1px);
background-size: 32px 32px;
}
.radar-bg {
background:
radial-gradient(circle at center, transparent 0, transparent 30%, hsl(5 65% 48% / 0.06) 31%, transparent 32%),
radial-gradient(circle at center, transparent 0, transparent 50%, hsl(5 65% 48% / 0.05) 51%, transparent 52%),
radial-gradient(circle at center, transparent 0, transparent 70%, hsl(5 65% 48% / 0.04) 71%, transparent 72%);
}
}
@keyframes pulse-ring {
0% { box-shadow: 0 0 0 0 hsl(5 65% 48% / 0.55); }
70% { box-shadow: 0 0 0 18px hsl(5 65% 48% / 0); }
100% { box-shadow: 0 0 0 0 hsl(5 65% 48% / 0); }
}
.pulse-ring { animation: pulse-ring 2.2s infinite; }
@keyframes radar-sweep {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.radar-sweep { animation: radar-sweep 6s linear infinite; transform-origin: center; }
@keyframes spin-slow {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.animate-spin-slow { animation: spin-slow 3s linear infinite; }
@keyframes wire-scroll {
from { transform: translateX(0); }
to { transform: translateX(50%); }
}
.animate-wire-scroll {
animation: wire-scroll 60s linear infinite;
}
.animate-wire-scroll:hover { animation-play-state: paused; }
/* Editorial rule β€” newspaper-style horizontal divider with end caps */
.editorial-rule {
display: flex;
align-items: center;
gap: 0.75rem;
color: hsl(var(--muted-foreground));
}
.editorial-rule::before,
.editorial-rule::after {
content: "";
flex: 1;
height: 1px;
background: hsl(0 0% 100% / 0.08);
}
/* Inverted "paper" surface for the contrast section */
.paper-surface {
background: hsl(var(--paper));
color: hsl(220 20% 12%);
}
.paper-surface .muted {
color: hsl(220 10% 38%);
}
.paper-surface a { color: hsl(5 65% 38%); }
/* Subtle hover lift used across cards */
.hover-lift {
transition: transform 240ms cubic-bezier(0.22, 1, 0.36, 1),
border-color 240ms ease,
box-shadow 240ms ease;
}
.hover-lift:hover {
transform: translateY(-2px);
border-color: hsl(var(--primary) / 0.3);
box-shadow: 0 12px 32px -8px hsl(var(--primary) / 0.18);
}
/* Shimmer effect for highlighted text on hero */
@keyframes shimmer {
0% { background-position: -100% 50%; }
100% { background-position: 200% 50%; }
}
.text-shimmer {
background: linear-gradient(
90deg,
hsl(var(--primary)) 0%,
hsl(var(--primary-glow)) 35%,
hsl(var(--primary)) 65%,
hsl(var(--primary-glow)) 100%
);
background-size: 200% 100%;
background-clip: text;
-webkit-background-clip: text;
color: transparent;
-webkit-text-fill-color: transparent;
animation: shimmer 4.5s linear infinite;
}
/* Soft floating motion */
@keyframes float-y {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-6px); }
}
.float-y { animation: float-y 4s ease-in-out infinite; }
/* ─── Mount entrance animations (stagger via inline animation-delay) ─── */
@keyframes enter-up {
from { opacity: 0; transform: translateY(22px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes enter-down {
from { opacity: 0; transform: translateY(-14px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes enter-fade {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes enter-left {
/* In RTL the visual "left" column slides in from the left edge */
from { opacity: 0; transform: translateX(-32px) scale(0.985); }
to { opacity: 1; transform: translateX(0) scale(1); }
}
@keyframes enter-right {
from { opacity: 0; transform: translateX(32px) scale(0.985); }
to { opacity: 1; transform: translateX(0) scale(1); }
}
@keyframes enter-pop {
0% { opacity: 0; transform: scale(0.9); }
60% { opacity: 1; transform: scale(1.04); }
100% { opacity: 1; transform: scale(1); }
}
@keyframes hero-glow-fade {
from { opacity: 0; }
to { opacity: 1; }
}
.enter-up { animation: enter-up 720ms cubic-bezier(0.22, 1, 0.36, 1) both; }
.enter-down { animation: enter-down 600ms cubic-bezier(0.22, 1, 0.36, 1) both; }
.enter-fade { animation: enter-fade 900ms cubic-bezier(0.22, 1, 0.36, 1) both; }
.enter-left { animation: enter-left 900ms cubic-bezier(0.22, 1, 0.36, 1) both; }
.enter-right { animation: enter-right 900ms cubic-bezier(0.22, 1, 0.36, 1) both; }
.enter-pop { animation: enter-pop 620ms cubic-bezier(0.34, 1.56, 0.64, 1) both; }
/* Animated underline that draws in once on mount */
@keyframes underline-draw {
from { transform: scaleX(0); }
to { transform: scaleX(1); }
}
.underline-draw {
position: relative;
display: inline-block;
}
.underline-draw::after {
content: "";
position: absolute;
inset-inline: 0;
bottom: -4px;
height: 3px;
border-radius: 2px;
background: linear-gradient(90deg, hsl(var(--primary)), hsl(var(--primary-glow)));
transform-origin: right;
animation: underline-draw 800ms cubic-bezier(0.22, 1, 0.36, 1) 900ms both;
}
@media (prefers-reduced-motion: reduce) {
.enter-up, .enter-down, .enter-fade, .enter-left, .enter-right, .enter-pop,
.underline-draw::after, .float-y, .text-shimmer, .cta-glow, .pulse-ring,
.radar-sweep, .animate-spin-slow {
animation: none !important;
opacity: 1 !important;
transform: none !important;
}
}
/* Glow pulse for primary CTA */
@keyframes cta-glow {
0%, 100% { box-shadow: 0 0 0 0 hsl(var(--primary) / 0.4), 0 12px 28px -8px hsl(var(--primary) / 0.35); }
50% { box-shadow: 0 0 0 8px hsl(var(--primary) / 0), 0 16px 40px -10px hsl(var(--primary) / 0.55); }
}
.cta-glow { animation: cta-glow 2.6s ease-in-out infinite; }
/* Card edge gradient on hover (overlays the border subtly) */
.card-glow { position: relative; }
.card-glow::before {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
padding: 1px;
background: linear-gradient(
135deg,
transparent 30%,
hsl(var(--primary) / 0.0) 50%,
hsl(var(--primary) / 0.5) 75%,
transparent 100%
);
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
opacity: 0;
transition: opacity 280ms ease;
pointer-events: none;
}
.card-glow:hover::before { opacity: 1; }