senti-beta / frontend /src /index.css
joseph njoroge kariuki
Deploy Senti AI to Hugging Face Spaces
021e065
@import '@fontsource/dm-serif-display';
@import '@fontsource/ibm-plex-sans/400.css';
@import '@fontsource/ibm-plex-sans/500.css';
@import '@fontsource/ibm-plex-sans/600.css';
@import '@fontsource/ibm-plex-mono/400.css';
@import '@fontsource/ibm-plex-mono/500.css';
@import "tailwindcss";
@config "../tailwind.config.js";
/* ─── Design Engineering: Custom Easing Curves ─── */
:root {
--ease-out-expo: cubic-bezier(0.23, 1, 0.32, 1);
--ease-in-out-expo: cubic-bezier(0.77, 0, 0.175, 1);
--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1);
}
@layer utilities {
.glass-card {
@apply bg-white/5 backdrop-blur-2xl border border-white/10;
}
.glass-ai-bubble {
@apply bg-senti-primary-container/5 backdrop-blur-xl border border-senti-primary-container/20 relative;
}
.glass-ai-bubble-biz {
@apply bg-senti-blue-600/5 backdrop-blur-xl border border-senti-blue-500/20 relative;
}
.glass-ai-bubble::before {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
padding: 1px;
background: linear-gradient(135deg, rgba(80, 250, 123, 0.3), transparent, rgba(0, 218, 243, 0.3));
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
}
.glass-ai-bubble-biz::before {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
padding: 1px;
background: linear-gradient(135deg, rgba(59, 130, 246, 0.4), transparent, rgba(168, 85, 247, 0.3));
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
}
/* ─── Neon glow: custom curve replaces ease-in-out ─── */
.neon-glow {
animation: neon-pulse 3s infinite cubic-bezier(0.77, 0, 0.175, 1);
}
/* ─── Button Press Feedback (Emil Design Eng) ─── */
.btn-press {
transition: transform 160ms var(--ease-out-expo);
cursor: pointer;
}
.btn-press:active {
transform: scale(0.97);
}
/* ─── Stagger Cascade Reveal (Stitch + High-End) ─── */
.stagger-item {
opacity: 0;
transform: translateY(8px);
animation: fadeSlideIn 350ms var(--ease-out-expo) forwards;
}
.stagger-item:nth-child(1) { animation-delay: 0ms; }
.stagger-item:nth-child(2) { animation-delay: 40ms; }
.stagger-item:nth-child(3) { animation-delay: 80ms; }
.stagger-item:nth-child(4) { animation-delay: 120ms; }
.stagger-item:nth-child(5) { animation-delay: 160ms; }
.stagger-item:nth-child(6) { animation-delay: 200ms; }
.stagger-item:nth-child(7) { animation-delay: 240ms; }
.stagger-item:nth-child(8) { animation-delay: 280ms; }
.stagger-item:nth-child(9) { animation-delay: 320ms; }
.stagger-item:nth-child(10) { animation-delay: 360ms; }
/* ─── Nav stagger: tighter 30ms intervals ─── */
.stagger-nav {
opacity: 0;
transform: translateY(6px);
animation: fadeSlideIn 300ms var(--ease-out-expo) forwards;
}
.stagger-nav:nth-child(1) { animation-delay: 0ms; }
.stagger-nav:nth-child(2) { animation-delay: 30ms; }
.stagger-nav:nth-child(3) { animation-delay: 60ms; }
.stagger-nav:nth-child(4) { animation-delay: 90ms; }
.stagger-nav:nth-child(5) { animation-delay: 120ms; }
.stagger-nav:nth-child(6) { animation-delay: 150ms; }
.stagger-nav:nth-child(7) { animation-delay: 180ms; }
.stagger-nav:nth-child(8) { animation-delay: 210ms; }
.stagger-nav:nth-child(9) { animation-delay: 240ms; }
.stagger-nav:nth-child(10) { animation-delay: 270ms; }
/* ─── Modal overlay entrance ─── */
.modal-enter {
animation: modalFadeIn 200ms var(--ease-out-expo) forwards;
}
.modal-panel-enter {
animation: modalPanelIn 250ms var(--ease-out-expo) forwards;
}
}
/* ─── Keyframes ─── */
@keyframes neon-pulse {
0%, 100% { opacity: 0.8; box-shadow: 0 0 10px rgba(80, 250, 123, 0.3); }
50% { opacity: 1; box-shadow: 0 0 20px rgba(80, 250, 123, 0.6); }
}
@keyframes fadeSlideIn {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes modalFadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes modalPanelIn {
from {
opacity: 0;
transform: scale(0.96);
}
to {
opacity: 1;
transform: scale(1);
}
}
/* ─── Alert pulse: subtle opacity only, no bounce ─── */
@keyframes alertPulse {
0%, 100% { opacity: 0.6; }
50% { opacity: 1; }
}
.alert-pulse {
animation: alertPulse 2.5s cubic-bezier(0.77, 0, 0.175, 1) infinite;
}
/* ─── Accessibility: Reduced Motion ─── */
@media (prefers-reduced-motion: reduce) {
.stagger-item,
.stagger-nav,
.modal-enter,
.modal-panel-enter {
animation: none;
opacity: 1;
transform: none;
}
.neon-glow {
animation: none;
}
.btn-press:active {
transform: none;
}
}
/* ─── Touch Device Hover Gate ─── */
@media (hover: none) {
.hover-gate:hover {
background: initial;
transform: none;
}
}
/* Custom Scrollbar for dark theme */
* {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
}
*::-webkit-scrollbar {
display: none; /* Chrome, Safari and Opera */
}
.scrollbar-hide::-webkit-scrollbar {
display: none;
}
.scrollbar-hide {
-ms-overflow-style: none;
scrollbar-width: none;
}
.chat-scroll::-webkit-scrollbar {
width: 4px;
}
.chat-scroll::-webkit-scrollbar-track {
background: transparent;
}
.chat-scroll::-webkit-scrollbar-thumb {
background: rgba(80, 250, 123, 0.1);
border-radius: 10px;
}