173 lines
3.8 KiB
CSS
173 lines
3.8 KiB
CSS
@import "tailwindcss";
|
|
|
|
@theme {
|
|
--color-void: #0a0a0a;
|
|
--color-nothing: #1a1a2e;
|
|
--color-less: #16213e;
|
|
--color-anti-green: #e94560;
|
|
--color-flow-green: #2dd4bf;
|
|
--color-zen: #f5f5dc;
|
|
--color-sloth: #c3b091;
|
|
|
|
--font-family-mono: "Courier New", monospace;
|
|
--font-family-marker: var(--font-marker), "Permanent Marker", cursive;
|
|
--font-family-caveat: var(--font-caveat), "Caveat", cursive;
|
|
}
|
|
|
|
/* Pipe flow animation — core effect */
|
|
@keyframes pipe-flow {
|
|
0% { stroke-dashoffset: 24; }
|
|
100% { stroke-dashoffset: 0; }
|
|
}
|
|
|
|
@keyframes pipe-flow-fast {
|
|
0% { stroke-dashoffset: 24; }
|
|
100% { stroke-dashoffset: 0; }
|
|
}
|
|
|
|
@keyframes pipe-flow-reverse {
|
|
0% { stroke-dashoffset: 0; }
|
|
100% { stroke-dashoffset: 24; }
|
|
}
|
|
|
|
.animate-pipe-flow {
|
|
stroke-dasharray: 8 4;
|
|
animation: pipe-flow 1.5s linear infinite;
|
|
}
|
|
|
|
.animate-pipe-flow-fast {
|
|
stroke-dasharray: 8 4;
|
|
animation: pipe-flow 0.8s linear infinite;
|
|
}
|
|
|
|
.animate-pipe-flow-slow {
|
|
stroke-dasharray: 8 4;
|
|
animation: pipe-flow 2.5s linear infinite;
|
|
}
|
|
|
|
/* Particle travel along path */
|
|
@keyframes travel-path {
|
|
0% { offset-distance: 0%; opacity: 0; }
|
|
5% { opacity: 1; }
|
|
95% { opacity: 1; }
|
|
100% { offset-distance: 100%; opacity: 0; }
|
|
}
|
|
|
|
.animate-particle {
|
|
offset-rotate: 0deg;
|
|
animation: travel-path var(--duration, 3s) linear infinite;
|
|
animation-delay: var(--delay, 0s);
|
|
}
|
|
|
|
/* Water distortion */
|
|
@keyframes turbulence {
|
|
0% { }
|
|
50% { }
|
|
100% { }
|
|
}
|
|
|
|
/* Scroll reveal */
|
|
@keyframes reveal-up {
|
|
from { opacity: 0; transform: translateY(30px); }
|
|
to { opacity: 1; transform: translateY(0); }
|
|
}
|
|
|
|
/* Breathing / pulsing */
|
|
@keyframes breathe {
|
|
0%, 100% { transform: scale(1); }
|
|
50% { transform: scale(1.02); }
|
|
}
|
|
|
|
@keyframes slow-pulse {
|
|
0%, 100% { opacity: 0.3; }
|
|
50% { opacity: 0.6; }
|
|
}
|
|
|
|
@keyframes drift {
|
|
0%, 100% { transform: translateX(0); }
|
|
50% { transform: translateX(20px); }
|
|
}
|
|
|
|
@keyframes flow-gradient {
|
|
0% { background-position: 0% 50%; }
|
|
50% { background-position: 100% 50%; }
|
|
100% { background-position: 0% 50%; }
|
|
}
|
|
|
|
@keyframes float-up {
|
|
0% { opacity: 0.6; transform: translateY(0) rotate(0deg); }
|
|
100% { opacity: 0; transform: translateY(-200px) rotate(10deg); }
|
|
}
|
|
|
|
.animate-breathe { animation: breathe 6s ease-in-out infinite; }
|
|
.animate-slow-pulse { animation: slow-pulse 8s ease-in-out infinite; }
|
|
.animate-drift { animation: drift 12s ease-in-out infinite; }
|
|
.animate-flow-gradient {
|
|
background-size: 200% 200%;
|
|
animation: flow-gradient 8s ease-in-out infinite;
|
|
}
|
|
|
|
/* Wobble rotations */
|
|
.wobble-1 { transform: rotate(-1.5deg); }
|
|
.wobble-2 { transform: rotate(0.8deg); }
|
|
.wobble-3 { transform: rotate(-0.5deg); }
|
|
.wobble-4 { transform: rotate(1.2deg); }
|
|
|
|
/* Scrawl underlines */
|
|
.scrawl-underline {
|
|
position: relative;
|
|
display: inline-block;
|
|
}
|
|
.scrawl-underline::after {
|
|
content: '';
|
|
position: absolute;
|
|
left: -4%;
|
|
bottom: -4px;
|
|
width: 108%;
|
|
height: 4px;
|
|
background: var(--color-flow-green);
|
|
transform: rotate(-0.5deg) scaleX(0.95);
|
|
border-radius: 2px;
|
|
}
|
|
|
|
/* Sandbox node styles */
|
|
.flow-node {
|
|
border: 2px solid rgba(245, 245, 220, 0.2);
|
|
border-radius: 8px;
|
|
padding: 12px;
|
|
background: rgba(26, 26, 46, 0.9);
|
|
backdrop-filter: blur(4px);
|
|
min-width: 120px;
|
|
}
|
|
|
|
.flow-node:hover {
|
|
border-color: var(--color-flow-green);
|
|
}
|
|
|
|
/* Disable feTurbulence on mobile for performance */
|
|
@media (max-width: 768px) {
|
|
.water-distortion {
|
|
filter: none !important;
|
|
}
|
|
}
|
|
|
|
/* React Flow overrides */
|
|
.react-flow__background {
|
|
background-color: var(--color-void) !important;
|
|
}
|
|
|
|
.react-flow__controls button {
|
|
background-color: var(--color-nothing) !important;
|
|
border-color: rgba(245, 245, 220, 0.1) !important;
|
|
color: var(--color-zen) !important;
|
|
fill: var(--color-zen) !important;
|
|
}
|
|
|
|
.react-flow__controls button:hover {
|
|
background-color: var(--color-less) !important;
|
|
}
|
|
|
|
.react-flow__minimap {
|
|
background-color: var(--color-void) !important;
|
|
}
|