Test / style.css
Rox-Turbo's picture
Upload 10 files
55896b1 verified
/* ============================================
Premium Valentine Website - Stylesheet
============================================
@version 2.0.0
@author Valentine Experience Team
@license MIT
Architecture:
- CSS Custom Properties for maintainable design system
- Hardware-accelerated animations (transform/opacity only)
- Mobile-first responsive design with fluid typography
- WCAG 2.1 AA compliant (color contrast, focus states)
- Cross-browser compatibility with vendor prefixes
- Reduced motion support for accessibility
- Print-optimized styles
Performance:
- GPU-accelerated transforms with translate3d
- will-change hints for animation optimization
- Minimal repaints/reflows
- 60fps target on mobile devices
============================================ */
/* ===========================================
CSS Custom Properties (Design Tokens)
Corporate-Grade Design System
=========================================== */
:root {
/* Primary Colors - Premium Palette */
--color-crimson: #8b0000;
--color-crimson-dark: #6d0000;
--color-crimson-light: #a01010;
--color-blush: #ffb6c1;
--color-blush-light: #ffd1d9;
--color-champagne: #f9f9f9;
--color-white: #ffffff;
/* Accent Colors */
--color-gold: #d4af37;
--color-rose: #ff6b81;
--color-pink-soft: #ffe4e9;
/* Text Colors - WCAG 2.1 AA Compliant */
--text-primary: #2d2d2d; /* Contrast ratio: 12.63:1 */
--text-secondary: #666666; /* Contrast ratio: 5.74:1 */
--text-light: #ffffff;
/* Shadows - Layered Depth System */
--shadow-soft: 0 4px 20px rgba(139, 0, 0, 0.1);
--shadow-medium: 0 8px 32px rgba(139, 0, 0, 0.15);
--shadow-heavy: 0 12px 48px rgba(139, 0, 0, 0.2);
--shadow-glow: 0 0 40px rgba(255, 182, 193, 0.4);
--shadow-focus: 0 0 0 3px rgba(139, 0, 0, 0.3);
/* Glass Effect - Premium Glassmorphism */
--glass-bg: rgba(255, 255, 255, 0.7);
--glass-bg-fallback: rgba(255, 255, 255, 0.95);
--glass-border: rgba(255, 255, 255, 0.5);
--glass-blur: 20px;
/* Typography - Fluid Scaling System */
--font-heading: 'Playfair Display', Georgia, serif;
--font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
/* Fluid Typography */
--font-size-xs: clamp(0.75rem, 0.7rem + 0.25vw, 0.875rem);
--font-size-sm: clamp(0.875rem, 0.8rem + 0.375vw, 1rem);
--font-size-base: clamp(1rem, 0.95rem + 0.25vw, 1.125rem);
--font-size-lg: clamp(1.125rem, 1rem + 0.625vw, 1.5rem);
--font-size-xl: clamp(1.5rem, 1.2rem + 1.5vw, 2.5rem);
--font-size-2xl: clamp(2rem, 1.5rem + 2.5vw, 4rem);
/* Spacing - 8pt Grid System */
--space-xs: 0.5rem; /* 8px */
--space-sm: 1rem; /* 16px */
--space-md: 1.5rem; /* 24px */
--space-lg: 2rem; /* 32px */
--space-xl: 3rem; /* 48px */
--space-2xl: 4rem; /* 64px */
/* Transitions - Premium Easing Functions */
--ease-premium: cubic-bezier(0.4, 0, 0.2, 1); /* Material Design Standard */
--ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55); /* Playful Bounce */
--ease-smooth: cubic-bezier(0.25, 0.46, 0.45, 0.94); /* Smooth Ease Out */
--ease-elastic: cubic-bezier(0.68, -0.6, 0.32, 1.6); /* Elastic Effect */
/* Transition Durations */
--duration-instant: 100ms;
--duration-fast: 200ms;
--duration-normal: 300ms;
--duration-slow: 500ms;
--duration-slower: 800ms;
/* Z-Index Scale - Strict Layering System */
--z-base: 1;
--z-notes: 10;
--z-notes-dragging: 20;
--z-envelope: 50;
--z-question: 30;
--z-success: 60;
--z-overlay: 100;
--z-button-evading: 200;
--z-modal: 1000;
--z-confetti: 9999;
/* Border Radius - Consistent Rounding */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 24px;
--radius-full: 50px;
/* Performance Hints */
--gpu-hack: translateZ(0);
}
/* ===========================================
Reset & Base Styles
=========================================== */
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
font-size: 16px;
scroll-behavior: smooth;
-webkit-text-size-adjust: 100%;
}
body {
font-family: var(--font-body);
font-weight: 400;
line-height: 1.6;
color: var(--text-primary);
background: linear-gradient(135deg, var(--color-champagne) 0%, var(--color-blush-light) 50%, var(--color-pink-soft) 100%);
min-height: 100vh;
min-height: 100dvh;
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* Prevent text selection during drag */
.dragging {
user-select: none;
-webkit-user-select: none;
cursor: grabbing !important;
}
/* Focus visible for keyboard navigation (WCAG 2.1 AA) */
*:focus-visible {
outline: 3px solid var(--color-crimson);
outline-offset: 2px;
box-shadow: var(--shadow-focus);
transition: outline-offset var(--duration-fast) var(--ease-premium);
}
/* Remove default focus for mouse users */
*:focus:not(:focus-visible) {
outline: none;
}
/* High contrast mode support */
@media (prefers-contrast: high) {
*:focus-visible {
outline-width: 4px;
outline-offset: 3px;
}
}
/* ===========================================
Noise Texture Overlay
=========================================== */
.noise-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: var(--z-overlay);
opacity: 0.03;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
background-repeat: repeat;
}
/* ===========================================
Confetti Canvas
=========================================== */
#confetti-canvas {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: var(--z-confetti);
}
/* ===========================================
Main Container
=========================================== */
.container {
position: relative;
width: 100%;
min-height: 100vh;
min-height: 100dvh;
display: flex;
align-items: center;
justify-content: center;
padding: var(--space-md);
}
/* ===========================================
Glassmorphism Container
Premium Glass Effect with Fallbacks
=========================================== */
.glass-container {
background: var(--glass-bg);
backdrop-filter: blur(var(--glass-blur));
-webkit-backdrop-filter: blur(var(--glass-blur));
border: 1px solid var(--glass-border);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-medium);
}
/* Fallback for browsers without backdrop-filter support */
@supports not (backdrop-filter: blur(20px)) {
.glass-container {
background: var(--glass-bg-fallback);
box-shadow: var(--shadow-heavy);
}
}
/* Safari-specific optimization */
@supports (-webkit-backdrop-filter: blur(20px)) {
.glass-container {
-webkit-backdrop-filter: blur(var(--glass-blur)) saturate(180%);
}
}
/* ===========================================
Section Base Styles
=========================================== */
section {
position: absolute;
width: 100%;
max-width: 500px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
transition: opacity 0.6s var(--ease-premium), transform 0.6s var(--ease-premium);
}
section.hidden {
opacity: 0;
pointer-events: none;
transform: scale(0.95);
}
/* ===========================================
STAGE 1: Envelope Section
=========================================== */
.envelope-section {
z-index: var(--z-envelope);
}
.envelope-wrapper {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--space-lg);
}
.envelope {
position: relative;
width: 280px;
height: 200px;
perspective: 1000px;
cursor: pointer;
/* Hardware acceleration */
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.envelope-body {
position: absolute;
width: 100%;
height: 100%;
background: linear-gradient(145deg, var(--color-blush) 0%, var(--color-blush-light) 100%);
border-radius: 8px;
box-shadow: var(--shadow-medium);
overflow: hidden;
}
.envelope-body::before {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 60%;
background: linear-gradient(145deg, #f8c8d0 0%, var(--color-blush) 100%);
clip-path: polygon(0 40%, 50% 0, 100% 40%, 100% 100%, 0 100%);
}
.envelope-flap {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 50%;
background: linear-gradient(180deg, var(--color-blush-light) 0%, var(--color-blush) 100%);
clip-path: polygon(0 0, 50% 100%, 100% 0);
transform-origin: top center;
transition: transform 0.8s var(--ease-premium);
z-index: 2;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
/* Hardware acceleration */
will-change: transform;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.envelope.open .envelope-flap {
transform: rotateX(180deg);
}
.letter {
position: absolute;
top: 20%;
left: 10%;
width: 80%;
height: 70%;
background: var(--color-white);
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
display: flex;
align-items: center;
justify-content: center;
transform: translate3d(0, 0, 0);
transition: transform 0.8s var(--ease-bounce) 0.3s;
z-index: 1;
will-change: transform;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.envelope.open .letter {
transform: translate3d(0, -60%, 0);
}
.letter-content {
text-align: center;
padding: var(--space-sm);
}
.letter-icon {
font-size: 2rem;
display: block;
margin-bottom: var(--space-xs);
animation: pulse 2s ease-in-out infinite;
}
.letter-text {
font-family: var(--font-heading);
font-size: 0.9rem;
color: var(--text-secondary);
font-style: italic;
}
/* Open Button */
.btn-open {
position: relative;
padding: 16px 48px;
font-family: var(--font-body);
font-size: 1rem;
font-weight: 500;
color: var(--text-light);
background: linear-gradient(135deg, var(--color-crimson) 0%, var(--color-crimson-light) 100%);
border: none;
border-radius: 50px;
cursor: pointer;
overflow: hidden;
transition: transform 0.3s var(--ease-bounce), box-shadow 0.3s var(--ease-premium);
box-shadow: 0 4px 20px rgba(139, 0, 0, 0.3);
min-height: 48px;
min-width: 160px;
will-change: transform;
animation: pulse-shadow 2s ease-in-out infinite;
/* Hardware acceleration */
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.btn-open:hover {
transform: translate3d(0, -2px, 0) scale(1.02);
box-shadow: 0 8px 30px rgba(139, 0, 0, 0.4);
}
.btn-open:active {
transform: translate3d(0, 0, 0) scale(0.98);
}
.btn-open:disabled {
cursor: not-allowed;
opacity: 0.7;
}
.btn-open::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transition: left 0.5s ease;
}
.btn-open:hover::before {
left: 100%;
}
/* Pulse Shadow Animation */
@keyframes pulse-shadow {
0%,
100% {
box-shadow: 0 4px 20px rgba(139, 0, 0, 0.3), 0 0 0 0 rgba(139, 0, 0, 0.4);
}
50% {
box-shadow: 0 4px 20px rgba(139, 0, 0, 0.3), 0 0 0 15px rgba(139, 0, 0, 0);
}
}
@keyframes pulse {
0%,
100% {
transform: scale(1);
}
50% {
transform: scale(1.1);
}
}
/* ===========================================
STAGE 2: Notes Section
=========================================== */
.notes-section {
z-index: var(--z-notes);
width: 100%;
height: 100vh;
height: 100dvh;
max-width: none;
padding: var(--space-md);
}
.notes-container {
position: relative;
width: 100%;
height: 100%;
max-width: 600px;
max-height: 600px;
}
.draggable-note {
position: absolute;
width: 160px;
height: 160px;
cursor: grab;
transition: box-shadow 0.3s var(--ease-premium);
will-change: transform;
touch-action: none;
/* Hardware acceleration for 60fps */
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.draggable-note:active {
cursor: grabbing;
}
.draggable-note.dragging {
transition: box-shadow var(--duration-normal) var(--ease-premium);
box-shadow: var(--shadow-heavy), 0 0 30px rgba(139, 0, 0, 0.2);
z-index: var(--z-notes-dragging) !important;
}
.note-inner {
width: 100%;
height: 100%;
padding: var(--space-md);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
border-radius: 12px;
box-shadow: var(--shadow-medium);
}
.note-emoji {
font-size: 2.5rem;
margin-bottom: var(--space-sm);
}
.note-inner p {
font-family: var(--font-heading);
font-size: 0.95rem;
color: var(--text-primary);
font-style: italic;
line-height: 1.4;
}
/* Note Variations */
.note-1 {
top: 15%;
left: 20%;
transform: rotate(-5deg);
z-index: 15;
}
.note-1 .note-inner {
background: linear-gradient(145deg, #fff5f5 0%, #ffe4e9 100%);
}
.note-2 {
top: 25%;
right: 15%;
transform: rotate(8deg);
z-index: 14;
}
.note-2 .note-inner {
background: linear-gradient(145deg, #fff8f0 0%, #ffecd9 100%);
}
.note-3 {
top: 45%;
left: 10%;
transform: rotate(3deg);
z-index: 13;
}
.note-3 .note-inner {
background: linear-gradient(145deg, #f5fff5 0%, #e4f5e4 100%);
}
.note-4 {
top: 50%;
right: 20%;
transform: rotate(-7deg);
z-index: 12;
}
.note-4 .note-inner {
background: linear-gradient(145deg, #f5f5ff 0%, #e4e4f5 100%);
}
.note-5 {
top: 35%;
left: 35%;
transform: rotate(2deg);
z-index: 16;
}
.note-5 .note-inner {
background: linear-gradient(145deg, var(--color-blush-light) 0%, var(--color-blush) 100%);
}
.hint-text {
position: absolute;
bottom: 10%;
left: 50%;
transform: translateX(-50%);
font-family: var(--font-body);
font-size: 0.9rem;
color: var(--text-secondary);
opacity: 0.8;
animation: fadeInUp 0.6s var(--ease-premium) forwards;
text-align: center;
width: 100%;
padding: 0 var(--space-md);
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateX(-50%) translateY(20px);
}
to {
opacity: 0.8;
transform: translateX(-50%) translateY(0);
}
}
/* ===========================================
STAGE 3: Question Section
=========================================== */
.question-section {
z-index: var(--z-question);
}
.question-container {
padding: var(--space-xl) var(--space-lg);
max-width: 420px;
width: 100%;
}
.question-title {
font-family: var(--font-heading);
font-size: clamp(1.8rem, 6vw, 2.5rem);
font-weight: 600;
color: var(--color-crimson);
margin-bottom: var(--space-sm);
line-height: 1.2;
}
.question-subtitle {
font-family: var(--font-body);
font-size: 1rem;
color: var(--text-secondary);
margin-bottom: var(--space-xl);
}
.buttons-wrapper {
display: flex;
flex-wrap: wrap;
gap: var(--space-md);
justify-content: center;
align-items: center;
position: relative;
min-height: 80px;
}
/* Button Base */
.btn {
position: relative;
padding: 16px 40px;
font-family: var(--font-body);
font-size: 1.1rem;
font-weight: 600;
border: none;
border-radius: 50px;
cursor: pointer;
transition: all 0.3s var(--ease-bounce);
min-height: 48px;
min-width: 120px;
will-change: transform;
/* Hardware acceleration */
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
/* Yes Button */
.btn-yes {
color: var(--text-light);
background: linear-gradient(135deg, var(--color-crimson) 0%, var(--color-rose) 100%);
box-shadow: 0 4px 20px rgba(139, 0, 0, 0.3);
transform-origin: center;
}
.btn-yes:hover {
transform: scale(1.05);
box-shadow: 0 6px 30px rgba(139, 0, 0, 0.4);
}
.btn-yes:active {
transform: scale(0.98);
}
/* No Button */
.btn-no {
color: var(--text-secondary);
background: var(--color-champagne);
border: 2px solid #ddd;
box-shadow: var(--shadow-soft);
transition: background 0.2s var(--ease-premium);
position: relative;
}
.btn-no:hover {
background: #f0f0f0;
}
.btn-no.evading {
position: fixed !important;
transition: left var(--duration-normal) var(--ease-smooth),
top var(--duration-normal) var(--ease-smooth),
transform var(--duration-normal) var(--ease-smooth);
z-index: var(--z-button-evading);
}
/* ===========================================
STAGE 4: Success Section
=========================================== */
.success-section {
z-index: var(--z-success);
}
.success-container {
padding: var(--space-xl) var(--space-lg);
max-width: 420px;
width: 100%;
animation: successPop 0.6s var(--ease-bounce) forwards;
}
@keyframes successPop {
0% {
opacity: 0;
transform: scale(0.8);
}
50% {
transform: scale(1.05);
}
100% {
opacity: 1;
transform: scale(1);
}
}
.success-hearts {
font-size: 4rem;
margin-bottom: var(--space-md);
animation: heartBeat 1s ease-in-out infinite;
}
@keyframes heartBeat {
0%,
100% {
transform: scale(1);
}
25% {
transform: scale(1.1);
}
50% {
transform: scale(1);
}
75% {
transform: scale(1.15);
}
}
.success-title {
font-family: var(--font-heading);
font-size: clamp(2.5rem, 8vw, 4rem);
font-weight: 700;
color: var(--color-crimson);
margin-bottom: var(--space-sm);
}
.success-subtitle {
font-family: var(--font-body);
font-size: 1.2rem;
color: var(--text-primary);
margin-bottom: var(--space-sm);
}
.success-message {
font-family: var(--font-heading);
font-size: 1rem;
color: var(--text-secondary);
font-style: italic;
}
/* ===========================================
Custom Scrollbar
=========================================== */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: var(--color-champagne);
}
::-webkit-scrollbar-thumb {
background: var(--color-blush);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--color-crimson);
}
/* Firefox */
* {
scrollbar-width: thin;
scrollbar-color: var(--color-blush) var(--color-champagne);
}
/* ===========================================
Mobile Responsive Styles
=========================================== */
@media screen and (max-width: 768px) {
:root {
--space-lg: 1.5rem;
--space-xl: 2rem;
}
.envelope {
width: 240px;
height: 170px;
}
.draggable-note {
width: 130px;
height: 130px;
}
.note-emoji {
font-size: 2rem;
}
.note-inner p {
font-size: 0.85rem;
}
/* Reposition notes for mobile */
.note-1 {
top: 5%;
left: 5%;
}
.note-2 {
top: 10%;
right: 5%;
}
.note-3 {
top: 40%;
left: 5%;
}
.note-4 {
top: 45%;
right: 5%;
}
.note-5 {
top: 25%;
left: 25%;
}
.question-container,
.success-container {
padding: var(--space-lg);
margin: 0 var(--space-sm);
}
.buttons-wrapper {
flex-direction: column;
gap: var(--space-sm);
}
.btn {
width: 100%;
max-width: 200px;
}
}
@media screen and (max-width: 380px) {
.envelope {
width: 200px;
height: 140px;
}
.btn-open {
padding: 14px 36px;
font-size: 0.9rem;
}
.draggable-note {
width: 110px;
height: 110px;
}
.note-inner {
padding: var(--space-sm);
}
.note-emoji {
font-size: 1.5rem;
margin-bottom: var(--space-xs);
}
.note-inner p {
font-size: 0.75rem;
}
}
/* ===========================================
Accessibility: Reduced Motion Preferences
WCAG 2.1 Level AA Compliance
=========================================== */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
/* Maintain functionality while respecting motion preferences */
.envelope.open .envelope-flap {
transform: rotateX(180deg);
transition: none;
}
.envelope.open .letter {
transform: translate3d(0, -60%, 0);
transition: none;
}
}
/* ===========================================
Accessibility: High Contrast Mode
=========================================== */
@media (prefers-contrast: high) {
:root {
--color-crimson: #990000;
--text-primary: #000000;
--text-secondary: #333333;
}
.btn {
border: 2px solid currentColor;
}
.glass-container {
background: rgba(255, 255, 255, 0.98);
border: 2px solid var(--color-crimson);
}
}
/* ===========================================
Dark Mode Support (Future Enhancement)
=========================================== */
@media (prefers-color-scheme: dark) {
:root {
--color-champagne: #1a1a1a;
--text-primary: #e0e0e0;
--text-secondary: #a0a0a0;
--glass-bg: rgba(30, 30, 30, 0.7);
--glass-bg-fallback: rgba(30, 30, 30, 0.95);
}
body {
background: linear-gradient(135deg, #1a1a1a 0%, #2d1a1a 50%, #3d1a1a 100%);
}
}
/* ===========================================
Print Styles
=========================================== */
@media print {
.noise-overlay,
#confetti-canvas,
.btn {
display: none;
}
body {
background: white;
}
}