Kraft102's picture
fix: sql.js Docker/Alpine compatibility layer for PatternMemory and FailureMemory
5a81b95
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@300;400;500;600;700&family=Inter:wght@300;400;500;600;700&display=swap');
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
/* Cyber Terminal Dark Theme */
--background: 220 20% 4%;
--foreground: 180 100% 90%;
--card: 220 25% 6%;
--card-foreground: 180 100% 90%;
--popover: 220 25% 6%;
--popover-foreground: 180 100% 90%;
/* Neon Cyan - Primary */
--primary: 166 100% 50%;
--primary-foreground: 220 20% 4%;
/* Deep Navy - Secondary */
--secondary: 220 30% 12%;
--secondary-foreground: 180 100% 90%;
--muted: 220 25% 15%;
--muted-foreground: 200 20% 55%;
/* Electric Teal - Accent */
--accent: 175 100% 45%;
--accent-foreground: 220 20% 4%;
/* Hot Coral - Destructive/Alert */
--destructive: 0 85% 55%;
--destructive-foreground: 0 0% 100%;
/* Alert Orange */
--warning: 30 100% 55%;
--warning-foreground: 220 20% 4%;
--border: 200 50% 20%;
--input: 220 30% 15%;
--ring: 166 100% 50%;
--radius: 0.25rem;
/* Custom Design Tokens */
--glow-primary: 0 0 20px hsl(166 100% 50% / 0.5), 0 0 40px hsl(166 100% 50% / 0.3);
--glow-accent: 0 0 20px hsl(175 100% 45% / 0.5), 0 0 40px hsl(175 100% 45% / 0.3);
--glow-destructive: 0 0 20px hsl(0 85% 55% / 0.5), 0 0 40px hsl(0 85% 55% / 0.3);
--gradient-primary: linear-gradient(135deg, hsl(166 100% 50%), hsl(175 100% 45%));
--gradient-dark: linear-gradient(180deg, hsl(220 20% 4%), hsl(220 25% 8%));
--gradient-card: linear-gradient(135deg, hsl(220 25% 8%), hsl(220 30% 6%));
--scanline-opacity: 0.03;
--noise-opacity: 0.02;
--sidebar-background: 220 25% 6%;
--sidebar-foreground: 180 100% 90%;
--sidebar-primary: 166 100% 50%;
--sidebar-primary-foreground: 220 20% 4%;
--sidebar-accent: 220 30% 15%;
--sidebar-accent-foreground: 180 100% 90%;
--sidebar-border: 200 50% 20%;
--sidebar-ring: 166 100% 50%;
}
.dark {
--background: 220 20% 4%;
--foreground: 180 100% 90%;
--card: 220 25% 6%;
--card-foreground: 180 100% 90%;
--popover: 220 25% 6%;
--popover-foreground: 180 100% 90%;
--primary: 166 100% 50%;
--primary-foreground: 220 20% 4%;
--secondary: 220 30% 12%;
--secondary-foreground: 180 100% 90%;
--muted: 220 25% 15%;
--muted-foreground: 200 20% 55%;
--accent: 175 100% 45%;
--accent-foreground: 220 20% 4%;
--destructive: 0 85% 55%;
--destructive-foreground: 0 0% 100%;
--border: 200 50% 20%;
--input: 220 30% 15%;
--ring: 166 100% 50%;
}
.light {
--background: 210 20% 98%;
--foreground: 220 30% 10%;
--card: 0 0% 100%;
--card-foreground: 220 30% 10%;
--popover: 0 0% 100%;
--popover-foreground: 220 30% 10%;
--primary: 166 80% 40%;
--primary-foreground: 0 0% 100%;
--secondary: 210 20% 93%;
--secondary-foreground: 220 30% 10%;
--muted: 210 15% 90%;
--muted-foreground: 220 15% 40%;
--accent: 175 70% 35%;
--accent-foreground: 0 0% 100%;
--destructive: 0 70% 50%;
--destructive-foreground: 0 0% 100%;
--border: 210 15% 85%;
--input: 210 15% 90%;
--ring: 166 80% 40%;
--scanline-opacity: 0.01;
--noise-opacity: 0.01;
}
}
@layer base {
* {
@apply border-border;
}
html {
scroll-behavior: smooth;
}
body {
@apply bg-background text-foreground font-sans antialiased;
background-image:
repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
hsl(var(--foreground) / var(--scanline-opacity)) 2px,
hsl(var(--foreground) / var(--scanline-opacity)) 4px
);
background-attachment: fixed;
}
::selection {
background: hsl(var(--primary) / 0.3);
color: hsl(var(--primary));
}
}
@layer components {
/* Glowing text effects */
.text-glow {
text-shadow: var(--glow-primary);
}
.text-glow-accent {
text-shadow: var(--glow-accent);
}
.text-glow-destructive {
text-shadow: var(--glow-destructive);
}
/* Box glow effects */
.box-glow {
box-shadow: var(--glow-primary);
}
.box-glow-accent {
box-shadow: var(--glow-accent);
}
/* Cyber border effect */
.cyber-border {
@apply relative;
border: 1px solid hsl(var(--primary) / 0.3);
}
.cyber-border::before {
content: '';
@apply absolute inset-0 pointer-events-none;
background: linear-gradient(
90deg,
hsl(var(--primary) / 0) 0%,
hsl(var(--primary) / 0.1) 50%,
hsl(var(--primary) / 0) 100%
);
animation: scan 3s linear infinite;
}
/* Terminal cursor blink */
.cursor-blink::after {
content: '▮';
@apply text-primary ml-1;
animation: blink 1s step-end infinite;
}
/* Data stream effect */
.data-stream {
@apply overflow-hidden relative;
}
.data-stream::before {
content: '';
@apply absolute top-0 left-0 w-full h-full pointer-events-none;
background: linear-gradient(
180deg,
hsl(var(--primary) / 0.1) 0%,
transparent 10%,
transparent 90%,
hsl(var(--primary) / 0.1) 100%
);
}
/* Grid overlay */
.grid-overlay {
background-image:
linear-gradient(hsl(var(--primary) / 0.03) 1px, transparent 1px),
linear-gradient(90deg, hsl(var(--primary) / 0.03) 1px, transparent 1px);
background-size: 40px 40px;
}
/* Breaking news ticker */
.ticker {
@apply overflow-hidden whitespace-nowrap;
}
.ticker-content {
@apply inline-block;
animation: ticker 30s linear infinite;
}
/* Glitch effect */
.glitch {
@apply relative;
}
.glitch::before,
.glitch::after {
content: attr(data-text);
@apply absolute top-0 left-0 w-full h-full;
}
.glitch::before {
left: 2px;
text-shadow: -2px 0 hsl(var(--destructive));
clip-path: inset(0);
animation: glitch-1 2s infinite linear alternate-reverse;
}
.glitch::after {
left: -2px;
text-shadow: 2px 0 hsl(var(--accent));
clip-path: inset(0);
animation: glitch-2 2s infinite linear alternate-reverse;
}
/* Pulse ring */
.pulse-ring {
@apply relative;
}
.pulse-ring::before {
content: '';
@apply absolute inset-0 rounded-full;
border: 2px solid hsl(var(--primary));
animation: pulse-ring 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
}
@layer utilities {
/* Typography */
.font-display {
font-family: 'Orbitron', sans-serif;
}
.font-mono {
font-family: 'JetBrains Mono', monospace;
}
.font-sans {
font-family: 'Inter', sans-serif;
}
/* Gradient text */
.gradient-text {
@apply bg-clip-text text-transparent;
background-image: var(--gradient-primary);
}
}
/* Keyframe animations */
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
@keyframes scan {
0% { transform: translateY(-100%); }
100% { transform: translateY(100%); }
}
@keyframes ticker {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
@keyframes glitch-1 {
0%, 100% { clip-path: inset(80% 0 0 0); }
20% { clip-path: inset(10% 0 70% 0); }
40% { clip-path: inset(50% 0 30% 0); }
60% { clip-path: inset(30% 0 50% 0); }
80% { clip-path: inset(0 0 80% 0); }
}
@keyframes glitch-2 {
0%, 100% { clip-path: inset(0 0 80% 0); }
20% { clip-path: inset(30% 0 50% 0); }
40% { clip-path: inset(70% 0 10% 0); }
60% { clip-path: inset(10% 0 70% 0); }
80% { clip-path: inset(60% 0 20% 0); }
}
@keyframes pulse-ring {
0% { transform: scale(1); opacity: 1; }
100% { transform: scale(1.5); opacity: 0; }
}
@keyframes matrix-fall {
0% { transform: translateY(-100%); opacity: 0; }
10% { opacity: 1; }
90% { opacity: 1; }
100% { transform: translateY(100vh); opacity: 0; }
}
@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
@keyframes fade-in {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes slide-in-left {
from { opacity: 0; transform: translateX(-30px); }
to { opacity: 1; transform: translateX(0); }
}
@keyframes slide-in-right {
from { opacity: 0; transform: translateX(30px); }
to { opacity: 1; transform: translateX(0); }
}
@keyframes scale-in {
from { opacity: 0; transform: scale(0.9); }
to { opacity: 1; transform: scale(1); }
}