Darak / front /styles.css
Antigravity AI
Update full system to Hugging Face
771f178
Raw
History Blame Contribute Delete
22.2 kB
:root {
--bg-deep: #05070d;
--bg-navy: #060c1a;
--panel: rgba(10, 16, 32, 0.82);
--panel-border: rgba(212, 175, 55, 0.28);
--panel-border-soft: rgba(148, 163, 184, 0.1);
--gold: #d4af37;
--gold-bright: #ebd076;
--gold-deep: #ad8c26;
--gold-glow: rgba(212, 175, 55, 0.18);
--text-main: #f4f1ea;
--text-dim: #a7b0c4;
--text-faint: #6d7690;
--card-bg: rgba(12, 20, 40, 0.7);
--radius-lg: 20px;
--radius-md: 14px;
--radius-sm: 10px;
--transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
height: 100%;
background: var(--bg-deep);
color: var(--text-main);
font-family: 'Tajawal', sans-serif;
-webkit-font-smoothing: antialiased;
overflow: hidden;
}
.eng { font-family: 'Poppins', 'Tajawal', sans-serif; }
a { color: inherit; text-decoration: none; }
/* ── Scene ── */
.scene {
position: relative;
height: 100vh;
display: flex;
flex-direction: column;
background: linear-gradient(160deg, #060a18 0%, #050810 50%, #040609 100%);
overflow: hidden;
}
#bg-canvas {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
z-index: 0;
pointer-events: none;
opacity: 0.7;
}
/* ── Header ── */
header {
position: relative;
z-index: 10;
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 48px;
border-bottom: 1px solid var(--panel-border-soft);
background: rgba(5, 8, 16, 0.6);
backdrop-filter: blur(20px);
flex-shrink: 0;
}
.logo-img { height: 44px; width: auto; object-fit: contain; }
.main-nav {
display: flex;
align-items: center;
gap: 6px;
}
.nav-link {
font-size: 14px;
font-weight: 500;
color: var(--text-dim);
padding: 8px 16px;
border-radius: var(--radius-sm);
transition: color var(--transition), background var(--transition);
}
.nav-link:hover { color: var(--gold-bright); background: rgba(212,175,55,0.06); }
.nav-link.active {
color: #1a1204;
background: linear-gradient(135deg, #f3cf7c, #d9a94a);
font-weight: 700;
}
.header-actions { display: flex; align-items: center; gap: 12px; }
.btn-login {
display: flex;
align-items: center;
gap: 8px;
background: linear-gradient(135deg, #f3cf7c, #d9a94a);
color: #1a1204;
font-family: 'Tajawal', sans-serif;
font-weight: 700;
font-size: 14px;
padding: 10px 22px;
border: none;
border-radius: var(--radius-md);
cursor: pointer;
box-shadow: 0 4px 16px rgba(217,169,74,0.3);
transition: transform var(--transition), box-shadow var(--transition);
}
.btn-login:hover { transform: translateY(-2px); box-shadow: 0 6px 22px rgba(217,169,74,0.45); }
/* ── HUD Layout ── */
.hud-layout {
display: grid;
grid-template-columns: 290px 1fr 300px;
gap: 20px;
flex: 1;
min-height: 0;
padding: 12px 40px 20px;
max-width: 1700px;
width: 100%;
margin: 0 auto;
position: relative;
z-index: 5;
}
.hud-col {
display: flex;
flex-direction: column;
gap: 12px;
overflow-y: auto;
min-height: 0;
}
.hud-col::-webkit-scrollbar { display: none; }
.hud-col { -ms-overflow-style: none; scrollbar-width: none; }
.col-label {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--text-faint);
padding: 0 4px;
}
/* ── Feature Cards ── */
.feat-card {
display: flex;
align-items: center;
gap: 14px;
background: var(--card-bg);
border: 1px solid var(--panel-border);
border-radius: var(--radius-md);
padding: 14px 16px;
text-decoration: none;
color: var(--text-main);
backdrop-filter: blur(16px);
transition: all var(--transition);
cursor: pointer;
}
.feat-card:hover {
border-color: var(--gold);
background: rgba(15, 25, 50, 0.85);
transform: translateX(-4px);
box-shadow: 0 8px 28px rgba(212,175,55,0.12), inset 0 0 0 1px rgba(212,175,55,0.1);
}
.feat-card:hover .feat-arrow { opacity: 1; color: var(--gold-bright); }
.feat-card:hover .feat-icon-wrap { background: rgba(212,175,55,0.18); color: var(--gold-bright); }
.feat-icon-wrap {
width: 42px;
height: 42px;
border-radius: var(--radius-sm);
background: rgba(212,175,55,0.08);
border: 1px solid rgba(212,175,55,0.15);
display: flex;
align-items: center;
justify-content: center;
color: var(--gold);
font-size: 17px;
flex-shrink: 0;
transition: all var(--transition);
}
.feat-body { flex: 1; min-width: 0; }
.feat-title { font-weight: 700; font-size: 14px; margin-bottom: 3px; }
.feat-desc { font-size: 11.5px; color: var(--text-dim); line-height: 1.5; }
.feat-arrow {
color: var(--text-faint);
font-size: 12px;
opacity: 0;
transition: all var(--transition);
flex-shrink: 0;
}
/* ── Center Column ── */
.hud-center { justify-content: flex-start; }
/* ── Hero ── */
.hero {
text-align: center;
padding: 4px 16px 0;
}
.hero-badge {
display: inline-flex;
align-items: center;
gap: 6px;
background: rgba(212,175,55,0.08);
border: 1px solid rgba(212,175,55,0.3);
color: var(--gold-bright);
font-size: 11px;
font-weight: 600;
padding: 4px 12px;
border-radius: 999px;
margin-bottom: 10px;
}
.dot-live {
width: 6px;
height: 6px;
border-radius: 50%;
background: #3ddc7a;
box-shadow: 0 0 6px #3ddc7a;
display: inline-block;
animation: pulse-dot 2s infinite;
}
@keyframes pulse-dot {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
h1.hero-title {
font-size: 28px;
line-height: 1.25;
font-weight: 900;
color: #f6f4ee;
margin-bottom: 8px;
letter-spacing: -0.3px;
}
h1.hero-title .brand {
color: var(--gold-bright);
font-weight: 800;
}
.hero-sub {
color: var(--text-dim);
font-size: 13px;
line-height: 1.6;
max-width: 500px;
margin: 0 auto 14px;
}
/* Fix #6: removed dead .hero-sub rule β€” intentionally omitted */
/* ── Search Bar ── */
.search-bar-wrap { max-width: 680px; margin: 0 auto; }
.search-bar {
display: flex;
align-items: center;
gap: 10px;
background: rgba(8, 12, 24, 0.8);
border: 1.5px solid rgba(212,175,55,0.5);
border-radius: 50px;
padding: 8px 8px 8px 16px;
box-shadow: 0 0 0 4px rgba(212,175,55,0.05), 0 12px 40px rgba(0,0,0,0.4);
transition: border-color var(--transition), box-shadow var(--transition);
}
.search-bar:focus-within {
border-color: rgba(212,175,55,0.85);
box-shadow: 0 0 0 4px rgba(212,175,55,0.1), 0 12px 40px rgba(212,175,55,0.12);
}
.search-bar input {
flex: 1;
background: transparent;
border: none;
outline: none;
color: var(--text-main);
font-family: 'Tajawal', sans-serif;
font-size: 16px;
text-align: right;
}
.search-bar input::placeholder { color: var(--text-faint); }
.icon-btn {
width: 36px;
height: 36px;
border-radius: 50%;
background: rgba(255,255,255,0.05);
border: 1px solid rgba(255,255,255,0.1);
display: flex;
align-items: center;
justify-content: center;
color: var(--text-dim);
cursor: pointer;
transition: all var(--transition);
flex-shrink: 0;
}
.icon-btn:hover { background: rgba(212,175,55,0.12); border-color: rgba(212,175,55,0.4); color: var(--gold-bright); }
.send-btn {
width: 42px;
height: 42px;
border-radius: 50%;
background: linear-gradient(135deg, #f3cf7c, #d9a94a 60%, #b8863a);
border: none;
display: flex;
align-items: center;
justify-content: center;
color: #1a1204;
font-size: 15px;
cursor: pointer;
box-shadow: 0 4px 16px rgba(217,169,74,0.4);
transition: transform var(--transition), box-shadow var(--transition);
flex-shrink: 0;
}
.send-btn:hover { transform: scale(1.08); box-shadow: 0 6px 22px rgba(217,169,74,0.55); }
.search-chips {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 6px;
margin-top: 10px;
}
.chip {
display: flex;
align-items: center;
gap: 6px;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.1);
color: var(--text-dim);
font-family: 'Tajawal', sans-serif;
font-size: 13px;
padding: 7px 14px;
border-radius: var(--radius-sm);
cursor: pointer;
transition: all var(--transition);
}
.chip:hover {
border-color: rgba(212,175,55,0.5);
color: var(--gold-bright);
background: rgba(212,175,55,0.07);
transform: translateY(-2px);
}
.chip i { color: var(--gold); font-size: 11px; }
/* ── Chat Panel ── */
.chat-panel {
display: flex;
flex-direction: column;
background: rgba(8, 13, 26, 0.88);
border: 1px solid var(--panel-border);
border-radius: var(--radius-lg);
overflow: hidden;
flex: 1;
min-height: 0;
backdrop-filter: blur(24px);
box-shadow: 0 20px 60px rgba(0,0,0,0.6), 0 0 0 1px rgba(212,175,55,0.05);
}
.chat-panel-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 20px;
border-bottom: 1px solid var(--panel-border-soft);
background: rgba(255,255,255,0.02);
flex-shrink: 0;
}
.chat-panel-title { display: flex; align-items: center; gap: 12px; }
.avatar-dot {
width: 36px;
height: 36px;
border-radius: 50%;
background: rgba(212,175,55,0.12);
border: 1px solid rgba(212,175,55,0.3);
display: flex;
align-items: center;
justify-content: center;
color: var(--gold-bright);
font-size: 14px;
}
.chat-panel-name { font-weight: 700; font-size: 14px; color: var(--text-main); }
.chat-panel-status { display: flex; align-items: center; gap: 5px; font-size: 11px; color: var(--text-faint); margin-top: 2px; }
.clear-chat-btn { font-size: 13px; }
.chat-body {
flex: 1;
overflow-y: auto;
padding: 18px 20px;
display: flex;
flex-direction: column;
gap: 14px;
min-height: 0;
}
.chat-body::-webkit-scrollbar { width: 4px; }
.chat-body::-webkit-scrollbar-track { background: transparent; }
.chat-body::-webkit-scrollbar-thumb { background: rgba(212,175,55,0.2); border-radius: 4px; }
.chat-msg {
display: flex;
gap: 10px;
align-items: flex-start;
max-width: 88%;
animation: msg-in 0.3s ease;
}
@keyframes msg-in {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
.chat-msg .avatar-ic {
width: 28px;
height: 28px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
flex-shrink: 0;
}
.msg-bubble {
padding: 12px 16px;
border-radius: 16px;
font-size: 14px;
line-height: 1.7;
}
.bot-msg { align-self: flex-start; }
.bot-msg .avatar-ic {
background: rgba(212,175,55,0.1);
color: var(--gold-bright);
border: 1px solid rgba(212,175,55,0.25);
}
.bot-msg .msg-bubble {
background: linear-gradient(145deg, rgba(13,17,32,0.8), rgba(212,167,44,0.05));
border: 1px solid rgba(212,167,44,0.15);
border-bottom-right-radius: 4px;
color: var(--text-main);
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
}
.user-msg {
align-self: flex-end;
flex-direction: row-reverse;
}
.user-msg .avatar-ic {
background: rgba(0,0,0,0.2);
color: #1a1204;
}
.user-msg .msg-bubble {
background: linear-gradient(135deg, #f0c84a, #d9a94a);
color: #1a1204;
font-weight: 600;
border-bottom-left-radius: 4px;
box-shadow: 0 8px 25px rgba(212,175,55,0.4);
}
.chat-footer {
padding: 14px 16px;
border-top: 1px solid var(--panel-border-soft);
background: rgba(255,255,255,0.015);
flex-shrink: 0;
}
.chat-input-row {
display: flex;
align-items: center;
gap: 10px;
background: rgba(0,0,0,0.35);
border: 1px solid var(--panel-border);
border-radius: 50px;
padding: 6px 6px 6px 16px;
transition: border-color var(--transition);
}
.chat-input-row:focus-within { border-color: rgba(212,175,55,0.6); }
.chat-input-row input {
flex: 1;
background: transparent;
border: none;
outline: none;
color: var(--text-main);
font-family: 'Tajawal', sans-serif;
font-size: 14px;
text-align: right;
}
.chat-input-row input::placeholder { color: var(--text-faint); }
/* ── Typing Indicator ── */
.typing-indicator {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 4px 0;
}
.typing-indicator span {
width: 6px;
height: 6px;
background: var(--gold);
border-radius: 50%;
animation: bounce 1.4s infinite ease-in-out both;
}
.typing-indicator span:nth-child(1) { animation-delay: -0.32s; }
.typing-indicator span:nth-child(2) { animation-delay: -0.16s; }
@keyframes bounce {
0%, 80%, 100% { transform: scale(0.4); opacity: 0.4; }
40% { transform: scale(1); opacity: 1; }
}
/* ── Right Column: Property Cards ── */
.prop-card {
background: var(--card-bg);
border: 1px solid var(--panel-border);
border-radius: var(--radius-md);
overflow: hidden;
backdrop-filter: blur(16px);
transition: all var(--transition);
cursor: pointer;
}
.prop-card:hover {
border-color: var(--gold);
transform: translateY(-3px);
box-shadow: 0 10px 30px rgba(212,175,55,0.12);
}
.prop-img-wrap {
position: relative;
height: 130px;
overflow: hidden;
}
.prop-img-wrap img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s ease;
}
.prop-card:hover .prop-img-wrap img { transform: scale(1.05); }
.prop-badge {
position: absolute;
top: 10px;
right: 10px;
background: rgba(212,175,55,0.9);
color: #1a1204;
font-size: 11px;
font-weight: 700;
padding: 3px 10px;
border-radius: 999px;
}
.prop-badge.rent { background: rgba(61,220,122,0.9); }
.prop-info { padding: 12px 14px; }
.prop-name { font-weight: 700; font-size: 13.5px; margin-bottom: 5px; }
.prop-loc { font-size: 11.5px; color: var(--text-dim); margin-bottom: 8px; display: flex; align-items: center; gap: 4px; }
.prop-loc i { color: var(--gold); font-size: 10px; }
.prop-meta {
display: flex;
gap: 12px;
font-size: 11px;
color: var(--text-faint);
margin-bottom: 10px;
}
.prop-meta span { display: flex; align-items: center; gap: 4px; }
.prop-meta i { color: var(--gold); }
.prop-price { font-size: 15px; font-weight: 800; color: var(--gold-bright); }
.prop-price span { font-size: 11px; font-weight: 500; color: var(--text-dim); }
.view-all-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 12px;
border: 1px dashed rgba(212,175,55,0.3);
border-radius: var(--radius-md);
color: var(--gold);
font-size: 13px;
font-weight: 600;
transition: all var(--transition);
}
.view-all-btn:hover { background: rgba(212,175,55,0.06); border-color: var(--gold); }
/* ── Footer ── */
.main-footer {
position: relative;
z-index: 5;
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 48px;
border-top: 1px solid var(--panel-border-soft);
background: rgba(5,8,16,0.5);
backdrop-filter: blur(10px);
flex-shrink: 0;
}
.footer-brand {
display: flex;
align-items: center;
gap: 10px;
font-family: 'Poppins', sans-serif;
font-weight: 800;
font-size: 15px;
color: var(--gold-bright);
}
.footer-copy { font-family: 'Tajawal', sans-serif; font-size: 11px; font-weight: 400; color: var(--text-faint); }
.footer-links { display: flex; gap: 24px; }
.footer-links a { font-size: 12px; color: var(--text-dim); transition: color var(--transition); }
.footer-links a:hover { color: var(--gold-bright); }
.footer-social { display: flex; gap: 14px; }
.footer-social a { font-size: 16px; color: var(--gold); transition: transform var(--transition), color var(--transition); }
.footer-social a:hover { transform: translateY(-3px); color: var(--gold-bright); }
/* Fix #9: disabled send button dims visually */
.send-btn:disabled {
opacity: 0.45;
cursor: not-allowed;
transform: none !important;
box-shadow: none !important;
}
/* Fix #7: active feature card */
.feat-card-active {
border-color: var(--gold) !important;
background: rgba(212,175,55,0.08) !important;
}
.feat-card-active .feat-icon-wrap { background: rgba(212,175,55,0.18); color: var(--gold-bright); }
.feat-card-active .feat-arrow { opacity: 1; color: var(--gold-bright); }
/* Fix #1: skeleton loaders */
.props-skeleton { display: flex; flex-direction: column; gap: 12px; }
.skeleton-card {
height: 110px;
border-radius: var(--radius-md);
background: linear-gradient(90deg, rgba(255,255,255,0.04) 25%, rgba(255,255,255,0.08) 50%, rgba(255,255,255,0.04) 75%);
background-size: 200% 100%;
animation: shimmer 1.4s infinite;
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
.props-empty {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
padding: 30px 0;
color: var(--text-faint);
font-size: 13px;
}
.props-empty i { font-size: 28px; color: var(--panel-border); }
.reveal { opacity: 0; transform: translateY(16px); transition: opacity 0.6s ease, transform 0.6s ease; }
.reveal.active { opacity: 1; transform: translateY(0); }
@keyframes fadeInUp {
from { opacity: 0; transform: translate(-50%, 12px); }
to { opacity: 1; transform: translate(-50%, 0); }
}
/* ── Responsive ── */
@media (max-width: 1300px) {
.hud-layout { grid-template-columns: 260px 1fr; }
.hud-right { display: none; }
}
@media (max-width: 900px) {
.hud-layout { grid-template-columns: 1fr; padding: 16px 20px; }
.hud-left { display: none; }
header { padding: 14px 20px; }
.main-nav { display: none; }
h1.hero-title { font-size: 30px; }
}
/* ── 1. Animated AI Thinking Waveform / Shimmer ── */
.thinking-waveform {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 4px 8px;
}
.thinking-waveform span {
width: 8px;
height: 8px;
background: var(--gold);
border-radius: 50%;
display: inline-block;
animation: bounceWave 1.2s infinite ease-in-out both;
}
.thinking-waveform span:nth-child(1) { animation-delay: -0.32s; }
.thinking-waveform span:nth-child(2) { animation-delay: -0.16s; }
.thinking-waveform span:nth-child(3) { animation-delay: 0s; }
@keyframes bounceWave {
0%, 80%, 100% { transform: scale(0.6); opacity: 0.5; }
40% { transform: scale(1.2); opacity: 1; box-shadow: 0 0 10px var(--gold); }
}
.thinking-bubble {
background: linear-gradient(135deg, rgba(212,175,55,0.15), rgba(0,0,0,0.6)) !important;
border: 1px solid rgba(212,175,55,0.5) !important;
color: #fff !important;
box-shadow: 0 0 20px rgba(212,175,55,0.15);
animation: pulseGoldBorder 2s infinite alternate;
}
@keyframes pulseGoldBorder {
from { border-color: rgba(212,175,55,0.3); box-shadow: 0 0 10px rgba(212,175,55,0.1); }
to { border-color: rgba(212,175,55,0.8); box-shadow: 0 0 25px rgba(212,175,55,0.3); }
}
/* ── 2. Silky Card Transitions ── */
.card-animate-in {
opacity: 0;
transform: translateY(20px) scale(0.97);
animation: cardSlideUp 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
@keyframes cardSlideUp {
to { opacity: 1; transform: translateY(0) scale(1); }
}
/* ── 3. Voice Input Listening Ring Glow ── */
.listening-glow {
animation: voicePulseRing 1.5s infinite;
border-color: var(--gold) !important;
background: rgba(212, 175, 55, 0.1) !important;
}
@keyframes voicePulseRing {
0% { box-shadow: 0 0 0 0 rgba(212, 175, 55, 0.7); }
70% { box-shadow: 0 0 0 14px rgba(212, 175, 55, 0); }
100% { box-shadow: 0 0 0 0 rgba(212, 175, 55, 0); }
}
/* ── 4. Royal Gold Ambient Aurora Glow (Strictly matching Logo Identity) ── */
.aurora-glow {
position: fixed;
width: 450px;
height: 450px;
border-radius: 50%;
pointer-events: none;
z-index: 0;
filter: blur(90px);
animation: auroraFloat 12s infinite alternate ease-in-out;
}
.aurora-1 {
top: -100px;
left: -100px;
background: radial-gradient(circle, rgba(212, 167, 44, 0.12), transparent 70%);
}
.aurora-2 {
bottom: -150px;
right: -100px;
background: radial-gradient(circle, rgba(13, 17, 32, 0.8), rgba(212, 167, 44, 0.08), transparent 70%);
animation-delay: -6s;
}
@keyframes auroraFloat {
0% { transform: translate(0, 0) scale(1); }
50% { transform: translate(50px, 30px) scale(1.15); }
100% { transform: translate(-30px, 50px) scale(0.95); }
}
/* ── 5. Ultra-Frosted Glassmorphism & Neon Gold Edge Lighting ── */
.hud-left, .chat-panel, .hud-right {
backdrop-filter: blur(35px) saturate(190%) !important;
background: rgba(13, 17, 32, 0.78) !important;
box-shadow: 0 20px 60px rgba(0,0,0,0.65), inset 0 0 0 1px rgba(212,167,44,0.15) !important;
transition: box-shadow 0.4s ease, border-color 0.4s ease;
}
.hud-left:hover, .chat-panel:hover, .hud-right:hover {
box-shadow: 0 25px 70px rgba(0,0,0,0.75), inset 0 0 0 1px rgba(212,167,44,0.35) !important;
border-color: rgba(212,167,44,0.4) !important;
}
/* ── 6. 3D Levitation & Deep Gold Shadow for Mascot ── */
@keyframes floatY3D {
0%, 100% { transform: translateY(0) scale(1) rotateZ(0deg); filter: drop-shadow(0 10px 15px rgba(212,167,44,0.25)); }
50% { transform: translateY(-10px) scale(1.05) rotateZ(2.5deg); filter: drop-shadow(0 22px 30px rgba(212,167,44,0.55)); }
}
.mascot, .assistant-mascot {
animation: floatY3D 3.6s ease-in-out infinite !important;
}
/* ── 7. Liquid Gold Shimmer Button Effect ── */
.btn-primary, .assistant-btn, .view-more-btn {
position: relative;
overflow: hidden;
z-index: 1;
}
.btn-primary::after, .assistant-btn::after, .view-more-btn::after {
content: '';
position: absolute;
top: -50%;
left: -75%;
width: 50%;
height: 200%;
background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.35) 50%, rgba(255,255,255,0) 100%);
transform: rotate(30deg);
transition: all 0.7s cubic-bezier(0.19, 1, 0.22, 1);
z-index: 2;
pointer-events: none;
}
.btn-primary:hover::after, .assistant-btn:hover::after, .view-more-btn:hover::after {
left: 130%;
}
/* ── 8. 3D Elastic Heart Burst ── */
@keyframes heartBurst3D {
0% { transform: scale(1); }
40% { transform: scale(1.6) rotate(-15deg); }
70% { transform: scale(0.85) rotate(10deg); }
100% { transform: scale(1) rotate(0deg); }
}
.prop-fav.active i {
animation: heartBurst3D 0.5s cubic-bezier(0.17, 0.89, 0.32, 1.49) forwards;
color: var(--gold) !important;
text-shadow: 0 0 15px rgba(212,167,44,0.8);
}
/* ── 9. 3D Perspective Tilt Class ── */
.card-3d-tilt {
transition: transform 0.15s ease-out, box-shadow 0.15s ease-out, border-color 0.25s ease !important;
transform-style: preserve-3d;
will-change: transform;
}