diff --git a/components/buttons.css b/components/buttons.css index e8f3b55d..fd867240 100644 --- a/components/buttons.css +++ b/components/buttons.css @@ -209,20 +209,63 @@ display: inline-flex; } +/* Base button overrides within groups */ .ease-btn-group .ease-btn { border-radius: 0; } -.ease-btn-group .ease-btn:first-child { - border-radius: var(--ease-radius-md) 0 0 var(--ease-radius-md); +/* Use negative margin equal to border width to overlay borders symmetrically */ +.ease-btn-group .ease-btn:not(:last-child) { + margin-right: -2px; /* standard overlaying */ } -.ease-btn-group .ease-btn:last-child { - border-radius: 0 var(--ease-radius-md) var(--ease-radius-md) 0; +/* Ensure border edges display correctly on interactions */ +.ease-btn-group .ease-btn:hover, +.ease-btn-group .ease-btn:focus-visible, +.ease-btn-group .ease-btn:active { + z-index: 1; } -.ease-btn-group .ease-btn:not(:last-child) { - border-right-width: 1px; +/* ── Boundary Corners — Respect modifier classes! ── */ + +/* Pill-shaped */ +.ease-btn-group .ease-btn-pill:first-child { + border-radius: var(--ease-radius-full) 0 0 var(--ease-radius-full); +} +.ease-btn-group .ease-btn-pill:last-child { + border-radius: 0 var(--ease-radius-full) var(--ease-radius-full) 0; +} + +/* Large size */ +.ease-btn-group .ease-btn-lg:first-child { + border-radius: var(--ease-radius-lg) 0 0 var(--ease-radius-lg); +} +.ease-btn-group .ease-btn-lg:last-child { + border-radius: 0 var(--ease-radius-lg) var(--ease-radius-lg) 0; +} + +/* Extra-Large size */ +.ease-btn-group .ease-btn-xl:first-child { + border-radius: var(--ease-radius-lg) 0 0 var(--ease-radius-lg); +} +.ease-btn-group .ease-btn-xl:last-child { + border-radius: 0 var(--ease-radius-lg) var(--ease-radius-lg) 0; +} + +/* Small size */ +.ease-btn-group .ease-btn-sm:first-child { + border-radius: var(--ease-radius-sm) 0 0 var(--ease-radius-sm); +} +.ease-btn-group .ease-btn-sm:last-child { + border-radius: 0 var(--ease-radius-sm) var(--ease-radius-sm) 0; +} + +/* Default / Medium fallback boundary corners */ +.ease-btn-group .ease-btn:first-child:not(.ease-btn-pill):not(.ease-btn-lg):not(.ease-btn-xl):not(.ease-btn-sm) { + border-radius: var(--ease-radius-md) 0 0 var(--ease-radius-md); +} +.ease-btn-group .ease-btn:last-child:not(.ease-btn-pill):not(.ease-btn-lg):not(.ease-btn-xl):not(.ease-btn-sm) { + border-radius: 0 var(--ease-radius-md) var(--ease-radius-md) 0; } /* ── Accessibility: Reduced Motion ───────────────────────── */ diff --git a/easemotion.min.css b/easemotion.min.css index cd2cea4c..9337c957 100644 --- a/easemotion.min.css +++ b/easemotion.min.css @@ -1 +1 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');:root{--ease-speed-fast:150ms;--ease-speed-medium:300ms;--ease-speed-slow:600ms;--ease-ease:cubic-bezier(0.4,0,0.2,1);--ease-ease-out:cubic-bezier(0,0,0.2,1);--ease-ease-bounce:cubic-bezier(0.34,1.56,0.64,1);--ease-color-primary:#6c63ff;--ease-color-primary-light:#a09af8;--ease-color-primary-dark:#4b44cc;--ease-color-success:#22c55e;--ease-color-success-light:#86efac;--ease-color-success-dark:#15803d;--ease-color-danger:#ef4444;--ease-color-danger-light:#fca5a5;--ease-color-danger-dark:#b91c1c;--ease-color-warning:#f59e0b;--ease-color-warning-light:#fcd34d;--ease-color-warning-dark:#b45309;--ease-color-neutral-50:#f8fafc;--ease-color-neutral-100:#f1f5f9;--ease-color-neutral-200:#e2e8f0;--ease-color-neutral-300:#cbd5e1;--ease-color-neutral-400:#94a3b8;--ease-color-neutral-500:#64748b;--ease-color-neutral-600:#475569;--ease-color-neutral-700:#334155;--ease-color-neutral-800:#1e293b;--ease-color-neutral-900:#0f172a;--ease-color-bg:var(--ease-color-neutral-50);--ease-color-surface:#ffffff;--ease-color-text:var(--ease-color-neutral-800);--ease-color-muted:var(--ease-color-neutral-500);--ease-space-1:0.25rem;--ease-space-2:0.5rem;--ease-space-3:0.75rem;--ease-space-4:1rem;--ease-space-5:1.25rem;--ease-space-6:1.5rem;--ease-space-8:2rem;--ease-space-10:2.5rem;--ease-space-12:3rem;--ease-space-16:4rem;--ease-radius-sm:0.25rem;--ease-radius-md:0.5rem;--ease-radius-lg:1rem;--ease-radius-xl:1.5rem;--ease-radius-full:9999px;--ease-shadow-sm:0 1px 3px rgba(0,0,0,0.08),0 1px 2px rgba(0,0,0,0.05);--ease-shadow-md:0 4px 6px -1px rgba(0,0,0,0.10),0 2px 4px -1px rgba(0,0,0,0.06);--ease-shadow-lg:0 10px 15px -3px rgba(0,0,0,0.10),0 4px 6px -2px rgba(0,0,0,0.05);--ease-shadow-xl:0 20px 25px -5px rgba(0,0,0,0.10),0 10px 10px -5px rgba(0,0,0,0.04);--ease-glow-primary:0 0 16px rgba(108,99,255,0.45);--ease-glow-success:0 0 16px rgba(34,197,94,0.45);--ease-glow-danger:0 0 16px rgba(239,68,68,0.45);--ease-font-sans:'Inter',system-ui,-apple-system,sans-serif;--ease-font-mono:'JetBrains Mono','Fira Code',monospace;--ease-text-xs:0.75rem;--ease-text-sm:0.875rem;--ease-text-base:1rem;--ease-text-lg:1.125rem;--ease-text-xl:1.25rem;--ease-text-2xl:1.5rem;--ease-text-3xl:1.875rem;--ease-text-4xl:2.25rem;--ease-leading-tight:1.25;--ease-leading-normal:1.6;--ease-leading-loose:1.9;--ease-z-base:0;--ease-z-raised:10;--ease-z-overlay:100;--ease-z-modal:1000;--ease-z-toast:9999}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{font-size:16px;scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{font-family:var(--ease-font-sans);font-size:var(--ease-text-base);line-height:var(--ease-leading-normal);color:var(--ease-color-text);background-color:var(--ease-color-bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-weight:700;line-height:var(--ease-leading-tight);color:var(--ease-color-neutral-900)}h1{font-size:var(--ease-text-4xl)}h2{font-size:var(--ease-text-3xl)}h3{font-size:var(--ease-text-2xl)}h4{font-size:var(--ease-text-xl)}h5{font-size:var(--ease-text-lg)}h6{font-size:var(--ease-text-base)}p{margin-bottom:var(--ease-space-4);color:var(--ease-color-neutral-700)}a{color:var(--ease-color-primary);text-decoration:none;transition:color var(--ease-speed-fast) var(--ease-ease)}a:hover{color:var(--ease-color-primary-dark);text-decoration:underline}ul,ol{padding-left:var(--ease-space-6)}li{margin-bottom:var(--ease-space-1)}img,video,svg{display:block;max-width:100%}code,kbd,samp,pre{font-family:var(--ease-font-mono);font-size:var(--ease-text-sm)}code{background-color:var(--ease-color-neutral-100);color:var(--ease-color-primary-dark);padding:0.1em 0.4em;border-radius:var(--ease-radius-sm)}pre{background-color:var(--ease-color-neutral-900);color:var(--ease-color-neutral-50);padding:var(--ease-space-6);border-radius:var(--ease-radius-md);overflow-x:auto;line-height:var(--ease-leading-loose)}input,textarea,select,button{font-family:inherit;font-size:inherit}button{cursor:pointer;border:none;background:none}hr{border:none;border-top:1px solid var(--ease-color-neutral-200);margin:var(--ease-space-8) 0}:focus-visible,button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible,a:focus-visible{outline:2px solid var(--ease-color-primary);outline-offset:3px;border-radius:var(--ease-radius-sm)}::selection{background-color:var(--ease-color-primary);color:#ffffff}@keyframes ease-kf-fade-in{from{opacity:0}to{opacity:1}}@keyframes ease-kf-fade-out{from{opacity:1}to{opacity:0}}@keyframes ease-kf-slide-up{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}@keyframes ease-kf-slide-down{from{opacity:0;transform:translateY(-24px)}to{opacity:1;transform:translateY(0)}}@keyframes ease-kf-slide-in-left{from{opacity:0;transform:translateX(-32px)}to{opacity:1;transform:translateX(0)}}@keyframes ease-kf-slide-in-right{from{opacity:0;transform:translateX(32px)}to{opacity:1;transform:translateX(0)}}@keyframes ease-kf-slide-in-from-top{from{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@keyframes ease-kf-slide-in-from-bottom{from{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes ease-kf-slide-in-from-left{from{opacity:0;transform:translateX(-100%)}to{opacity:1;transform:translateX(0)}}@keyframes ease-kf-slide-in-from-right{from{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes ease-kf-slide-in-from-top-left{from{opacity:0;transform:translate(-100%,-100%)}to{opacity:1;transform:translate(0,0)}}@keyframes ease-kf-slide-in-from-top-right{from{opacity:0;transform:translate(100%,-100%)}to{opacity:1;transform:translate(0,0)}}@keyframes ease-kf-slide-in-from-bottom-left{from{opacity:0;transform:translate(-100%,100%)}to{opacity:1;transform:translate(0,0)}}@keyframes ease-kf-slide-in-from-bottom-right{from{opacity:0;transform:translate(100%,100%)}to{opacity:1;transform:translate(0,0)}}@keyframes ease-kf-bounce{0%,100%{transform:translateY(0);animation-timing-function:cubic-bezier(0.8,0,1,1)}50%{transform:translateY(-20px);animation-timing-function:cubic-bezier(0,0,0.2,1)}}@keyframes ease-kf-squish-border{0%{border-radius:12px;transform:scaleX(1)}50%{border-radius:24px;transform:scaleX(0.88)}100%{border-radius:6px;transform:scaleX(1)}}@keyframes ease-kf-pulse{0%,100%{opacity:1}50%{opacity:0.45}}@keyframes ease-kf-rotate{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes ease-kf-ping{75%,100%{transform:scale(2);opacity:0}}@keyframes ease-kf-shake{0%,100%{transform:translateX(0)}10%,50%,90%{transform:translateX(-6px)}30%,70%{transform:translateX(6px)}}@keyframes ease-kf-zoom-in{from{opacity:0;transform:scale(0.85)}to{opacity:1;transform:scale(1)}}@keyframes ease-kf-flip{from{transform:perspective(400px) rotateY(90deg);opacity:0}to{transform:perspective(400px) rotateY(0deg);opacity:1}}@keyframes ease-kf-shimmer{0%{background-position:-1000px 0}100%{background-position:1000px 0}}@keyframes ease-kf-pulse-fade{0%,100%{opacity:1}50%{opacity:0.45}}@keyframes ease-kf-typewriter-loop{0%{width:0}40%{width:var(--ease-typewriter-length,12ch)}60%{width:var(--ease-typewriter-length,12ch)}100%{width:0}}@keyframes ease-kf-cursor-blink{0%,49%{border-right-color:currentColor}50%,100%{border-right-color:transparent}}@keyframes ease-kf-blur-to-focus{from{filter:blur(12px);opacity:0}to{filter:blur(0px);opacity:1}}@keyframes ease-kf-contract-bg-exit{from{transform:scale(1);opacity:1}to{transform:scale(0.85);opacity:0}}@keyframes ease-kf-contract-image-entrance{from{opacity:0;transform:scale(1.25)}to{opacity:1;transform:scale(1)}}@keyframes ease-kf-bounce-text{0%,100%{transform:translateY(0) scale(1)}30%{transform:translateY(-6px) scale(1.08)}60%{transform:translateY(2px) scale(0.98)}}@keyframes ease-kf-shake-card-exit{0%{transform:translateX(0) rotate(0deg);opacity:1}20%{transform:translateX(-8px) rotate(-2deg)}40%{transform:translateX(8px) rotate(2deg)}60%{transform:translateX(-6px) rotate(-1deg)}80%{transform:translateX(6px) rotate(1deg)}100%{transform:translateX(0) rotate(0deg);opacity:0}}@keyframes ease-kf-bounce-button-exit{0%{transform:scale(1);opacity:1}20%{transform:scale(1.15)}40%{transform:scale(0.90)}60%{transform:scale(1.05)}80%{transform:scale(0.95)}100%{transform:scale(0);opacity:0}}@keyframes ease-kf-expand-border-exit{0%{opacity:1;transform:scale(1);border-width:2px}100%{opacity:0;transform:scale(1.15);border-width:6px}}@keyframes ease-kf-fade-icon-exit{from{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(0.75)}}@keyframes ease-kf-scale-text-exit{from{transform:scale(1);opacity:1}to{transform:scale(0.6);opacity:0}}@keyframes ease-kf-glow-shadow-exit{from{box-shadow:0 0 12px 4px rgba(99,102,241,0.6);opacity:1}to{box-shadow:0 0 0px 0px rgba(99,102,241,0);opacity:0}}@keyframes ease-kf-pulse-border-emphasis{0%,100%{box-shadow:0 0 0 0px rgba(99,102,241,0.6);border-color:rgba(99,102,241,1)}50%{box-shadow:0 0 0 6px rgba(99,102,241,0);border-color:rgba(99,102,241,0.4)}}@keyframes ease-kf-squish-button{0%{transform:scale(1)}35%{transform:scaleX(1.12) scaleY(0.88)}70%{transform:scaleX(0.96) scaleY(1.06)}100%{transform:scale(1)}}@keyframes ease-kf-shimmer-sweep{0%{background-position:-200% center}100%{background-position:200% center}}@keyframes ease-kf-gradient-rotation{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}@keyframes ease-kf-contract-shadow-emphasis{0%{box-shadow:0 8px 24px rgba(0,0,0,0.3);transform:scale(1)}50%{box-shadow:0 2px 6px rgba(0,0,0,0.15);transform:scale(0.96)}100%{box-shadow:0 8px 24px rgba(0,0,0,0.3);transform:scale(1)}}@keyframes ease-kf-rotate-image-exit{from{transform:rotate(0deg) scale(1);opacity:1}to{transform:rotate(90deg) scale(0.75)}}@keyframes ease-kf-slide-image-exit{from{transform:translateX(0);opacity:1}to{transform:translateX(100%);opacity:0}}@keyframes ease-kf-morph-card{from{border-radius:8px}to{border-radius:50%}}@keyframes ease-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}@keyframes ease-zoom-in{from{transform:scale(0)}to{transform:scale(1)}}@keyframes ease-zoom-out{from{transform:scale(1.5)}to{transform:scale(1)}}@keyframes ease-bounce-in{0%{opacity:0;transform:scale(0.3)}50%{opacity:1;transform:scale(1.1)}70%{transform:scale(0.95)}100%{transform:scale(1)}}.ease-zoom-in{animation:ease-kf-zoom-in var(--ease-speed-medium) var(--ease-ease-bounce) both}.ease-zoom-out{animation:ease-zoom-out 0.6s ease-out forwards}.ease-float{animation:ease-float 3s ease-in-out infinite}.ease-bounce-in{animation:ease-bounce-in 0.8s ease-out forwards}.ease-shake-card-exit{animation:ease-kf-shake-card-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-bounce-button-exit{animation:ease-kf-bounce-button-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-fade-icon-exit{animation:ease-kf-fade-icon-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-scale-text-exit{animation:ease-kf-scale-text-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-glow-shadow-exit{animation:ease-kf-glow-shadow-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-pulse-border-emphasis{animation:ease-kf-pulse-border-emphasis 1.5s var(--ease-ease) infinite}.ease-slide-image-exit{animation:ease-kf-slide-image-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-hover-bounce-text{display:inline-block}.ease-hover-bounce-text:hover{animation:ease-kf-bounce-text var(--ease-speed-medium) var(--ease-ease-bounce)}.ease-squish-button:hover,.ease-squish-button:focus-visible,.ease-squish-button:active{animation:ease-kf-squish-button var(--ease-speed-medium) var(--ease-ease) both}.ease-shimmer-sweep{background:linear-gradient( 120deg,transparent 30%,rgba(255,255,255,0.15) 50%,transparent 70% );background-size:200% auto;animation:ease-kf-shimmer-sweep var(--ease-speed-slow) var(--ease-ease) infinite}.ease-gradient-rotation{background:linear-gradient(270deg,var(--ease-color-primary),var(--ease-color-secondary,#8b5cf6),var(--ease-color-primary) );background-size:200% 200%;animation:ease-kf-gradient-rotation 3s var(--ease-ease) infinite}.ease-contract-shadow-emphasis{animation:ease-kf-contract-shadow-emphasis var(--ease-speed-medium) var(--ease-ease) both}.ease-rotate-image-exit{animation:ease-kf-rotate-image-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-expand-border-exit{animation:ease-kf-expand-border-exit var(--ease-speed-medium) var(--ease-ease) forwards}.ease-skeleton-shimmer{background:var(--ease-color-neutral-100);background-image:linear-gradient( 90deg,var(--ease-color-neutral-100) 0px,var(--ease-color-neutral-200) 40px,var(--ease-color-neutral-100) 80px );background-size:1000px 100%;animation:ease-kf-shimmer 2s infinite linear forwards}.ease-skeleton-pulse{background-color:var(--ease-color-neutral-200);animation:ease-kf-pulse-fade 1.5s var(--ease-ease) infinite}.ease-skeleton-block{border-radius:var(--ease-radius-md);display:block}.ease-fade-in{animation:ease-kf-fade-in var(--ease-speed-medium) var(--ease-ease) both}.ease-fade-out{animation:ease-kf-fade-out var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-up:not(.ease-slide-down){animation:ease-kf-slide-up var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-down:not(.ease-slide-up){animation:ease-kf-slide-down var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-left{animation:ease-kf-slide-in-left var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-right{animation:ease-kf-slide-in-right var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-top{animation:ease-kf-slide-in-from-top var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-bottom{animation:ease-kf-slide-in-from-bottom var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-left{animation:ease-kf-slide-in-from-left var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-right{animation:ease-kf-slide-in-from-right var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-top-left{animation:ease-kf-slide-in-from-top-left var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-top-right{animation:ease-kf-slide-in-from-top-right var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-bottom-left{animation:ease-kf-slide-in-from-bottom-left var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-bottom-right{animation:ease-kf-slide-in-from-bottom-right var(--ease-speed-medium) var(--ease-ease) both}.ease-flip{animation:ease-kf-flip var(--ease-speed-medium) var(--ease-ease) both}.ease-blur-to-focus{animation:ease-kf-blur-to-focus var(--ease-speed-medium) var(--ease-ease) both}.ease-contract-bg-exit{animation:ease-kf-contract-bg-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-contract-image-entrance{animation:ease-kf-contract-image-entrance var(--ease-speed-medium) var(--ease-ease) both}.ease-bounce{animation:ease-kf-bounce 1s infinite}.ease-rotate{animation:ease-kf-rotate 1.2s linear infinite}.ease-pulse{animation:ease-kf-pulse 2s var(--ease-ease) infinite}.ease-ping{animation:ease-kf-ping 1s cubic-bezier(0,0,0.2,1) infinite}.ease-shake{animation:ease-kf-shake 0.5s var(--ease-ease) both}.ease-typewriter-loop{--ease-typewriter-length:12ch;--ease-typewriter-duration:6s;display:inline-block;overflow:hidden;white-space:nowrap;width:0;max-width:fit-content;border-right:2px solid currentColor;--ease-typewriter-steps:12;animation:ease-kf-typewriter-loop var(--ease-typewriter-duration) steps(var(--ease-typewriter-steps),end) infinite,ease-kf-cursor-blink 0.8s step-end infinite;will-change:width}.ease-hover-grow{transition:transform var(--ease-speed-medium) var(--ease-ease-bounce);will-change:transform}.ease-hover-grow:hover{transform:scale(1.06)}.ease-hover-lift-shadow{transition:transform var(--ease-speed-medium) var(--ease-ease),box-shadow var(--ease-speed-medium) var(--ease-ease);will-change:transform,box-shadow}.ease-hover-lift-shadow:hover{transform:translateY(-4px);box-shadow:0 12px 32px rgba(0,0,0,0.15),0 4px 12px rgba(0,0,0,0.1)}.ease-hover-shrink{transition:transform var(--ease-speed-fast) var(--ease-ease);will-change:transform}.ease-hover-shrink:hover{transform:scale(0.95)}.ease-hover-glow{transition:box-shadow var(--ease-speed-medium) var(--ease-ease)}.ease-hover-glow:hover{box-shadow:var(--ease-glow-primary)}.ease-hover-lift{transition:transform var(--ease-speed-medium) var(--ease-ease),box-shadow var(--ease-speed-medium) var(--ease-ease)}.ease-hover-lift:hover{transform:translateY(-4px);box-shadow:var(--ease-shadow-xl)}.ease-hover-underline{position:relative}.ease-hover-underline::after{content:'';position:absolute;left:0;bottom:-2px;width:0;height:2px;background-color:var(--ease-color-primary);transition:width var(--ease-speed-medium) var(--ease-ease)}.ease-hover-underline:hover::after{width:100%}.ease-card-lift{transition:transform var(--ease-speed-medium) var(--ease-ease-out),box-shadow var(--ease-speed-medium) var(--ease-ease-out);will-change:transform,box-shadow}.ease-card-lift:hover{transform:translateY(-8px);box-shadow:var(--ease-shadow-xl)}.ease-hover-shimmer{position:relative;overflow:hidden}.ease-hover-shimmer::before{content:'';position:absolute;top:0;left:-100%;width:60%;height:100%;background:linear-gradient( 120deg,transparent 0%,rgba(255,255,255,0.08) 50%,transparent 100% );transition:left var(--ease-speed-slow) var(--ease-ease);pointer-events:none}.ease-hover-shimmer:hover::before{left:150%}.ease-hover-squish-border{display:inline-block;transition:border-radius var(--ease-speed-medium) var(--ease-ease),transform var(--ease-speed-medium) var(--ease-ease)}.ease-hover-squish-border:hover{animation:ease-kf-squish-border var(--ease-speed-medium) var(--ease-ease-bounce)}.ease-hover-morph-card{border-radius:0;transition:border-radius var(--ease-speed-medium) var(--ease-ease),transform var(--ease-speed-medium) var(--ease-ease);will-change:border-radius,transform}.ease-hover-morph-card:hover{border-radius:50%;transform:scale(1.08)}.ease-delay-75{animation-delay:75ms}.ease-delay-100{animation-delay:100ms}.ease-delay-150{animation-delay:150ms}.ease-delay-200{animation-delay:200ms}.ease-delay-300{animation-delay:300ms}.ease-delay-500{animation-delay:500ms}.ease-delay-700{animation-delay:700ms}.ease-duration-fast{animation-duration:var(--ease-speed-fast)}.ease-duration-medium{animation-duration:var(--ease-speed-medium)}.ease-duration-slow{animation-duration:var(--ease-speed-slow)}@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:0.01ms !important;animation-iteration-count:1 !important;transition-duration:0.01ms !important}}.ease-block{display:block}.ease-inline{display:inline}.ease-inline-block{display:inline-block}.ease-hidden{display:none}.ease-flex{display:flex}.ease-inline-flex{display:inline-flex}.ease-center{display:flex;align-items:center;justify-content:center}.ease-flex-col{flex-direction:column}.ease-flex-row{flex-direction:row}.ease-flex-wrap{flex-wrap:wrap}.ease-flex-nowrap{flex-wrap:nowrap}.ease-items-start{align-items:flex-start}.ease-items-center{align-items:center}.ease-items-end{align-items:flex-end}.ease-items-stretch{align-items:stretch}.ease-justify-start{justify-content:flex-start}.ease-justify-center{justify-content:center}.ease-justify-end{justify-content:flex-end}.ease-justify-between{justify-content:space-between}.ease-justify-around{justify-content:space-around}.ease-justify-evenly{justify-content:space-evenly}.ease-flex-1{flex:1 1 0%}.ease-flex-auto{flex:1 1 auto}.ease-flex-none{flex:none}.ease-grow{flex-grow:1}.ease-shrink{flex-shrink:1}.ease-grid{display:grid}.ease-inline-grid{display:inline-grid}.ease-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.ease-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.ease-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.ease-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.ease-grid-auto{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}.ease-col-span-2{grid-column:span 2 / span 2}.ease-col-span-3{grid-column:span 3 / span 3}.ease-col-full{grid-column:1 / -1}.ease-gap-1{gap:var(--ease-space-1)}.ease-gap-2{gap:var(--ease-space-2)}.ease-gap-3{gap:var(--ease-space-3)}.ease-gap{gap:var(--ease-space-4)}.ease-gap-4{gap:var(--ease-space-4)}.ease-gap-6{gap:var(--ease-space-6)}.ease-gap-8{gap:var(--ease-space-8)}.ease-gap-10{gap:var(--ease-space-10)}.ease-padding{padding:var(--ease-space-4)}.ease-padding-1{padding:var(--ease-space-1)}.ease-padding-2{padding:var(--ease-space-2)}.ease-padding-3{padding:var(--ease-space-3)}.ease-padding-4{padding:var(--ease-space-4)}.ease-padding-6{padding:var(--ease-space-6)}.ease-padding-8{padding:var(--ease-space-8)}.ease-padding-10{padding:var(--ease-space-10)}.ease-padding-12{padding:var(--ease-space-12)}.ease-pt-4{padding-top:var(--ease-space-4)}.ease-pr-4{padding-right:var(--ease-space-4)}.ease-pb-4{padding-bottom:var(--ease-space-4)}.ease-pl-4{padding-left:var(--ease-space-4)}.ease-px-4{padding-left:var(--ease-space-4);padding-right:var(--ease-space-4)}.ease-py-4{padding-top:var(--ease-space-4);padding-bottom:var(--ease-space-4)}.ease-px-8{padding-left:var(--ease-space-8);padding-right:var(--ease-space-8)}.ease-py-8{padding-top:var(--ease-space-8);padding-bottom:var(--ease-space-8)}.ease-margin{margin:var(--ease-space-4)}.ease-margin-1{margin:var(--ease-space-1)}.ease-margin-2{margin:var(--ease-space-2)}.ease-margin-3{margin:var(--ease-space-3)}.ease-margin-4{margin:var(--ease-space-4)}.ease-margin-6{margin:var(--ease-space-6)}.ease-margin-8{margin:var(--ease-space-8)}.ease-margin-auto{margin:auto}.ease-mx-auto{margin-left:auto;margin-right:auto}.ease-my-4{margin-top:var(--ease-space-4);margin-bottom:var(--ease-space-4)}.ease-my-8{margin-top:var(--ease-space-8);margin-bottom:var(--ease-space-8)}.ease-mt-4{margin-top:var(--ease-space-4)}.ease-mr-4{margin-right:var(--ease-space-4)}.ease-mb-4{margin-bottom:var(--ease-space-4)}.ease-ml-4{margin-left:var(--ease-space-4)}.ease-w-full{width:100%}.ease-w-screen{width:100vw}.ease-w-auto{width:auto}.ease-h-full{height:100%}.ease-h-screen{height:100vh}.ease-h-auto{height:auto}.ease-container{width:100%;max-width:1200px;margin-left:auto;margin-right:auto;padding-left:var(--ease-space-6);padding-right:var(--ease-space-6)}.ease-relative{position:relative}.ease-absolute{position:absolute}.ease-fixed{position:fixed}.ease-sticky{position:sticky;top:0}.ease-overflow-hidden{overflow:hidden}.ease-overflow-auto{overflow:auto}.ease-overflow-scroll{overflow:scroll}.ease-overflow-x-auto{overflow-x:auto}.ease-overflow-y-auto{overflow-y:auto}.ease-text-xs{font-size:var(--ease-text-xs)}.ease-text-sm{font-size:var(--ease-text-sm)}.ease-text-base{font-size:var(--ease-text-base)}.ease-text-lg{font-size:var(--ease-text-lg)}.ease-text-xl{font-size:var(--ease-text-xl)}.ease-text-2xl{font-size:var(--ease-text-2xl)}.ease-text-3xl{font-size:var(--ease-text-3xl)}.ease-text-4xl{font-size:var(--ease-text-4xl)}.ease-text-left{text-align:left}.ease-text-center{text-align:center}.ease-text-right{text-align:right}.ease-font-light{font-weight:300}.ease-font-regular{font-weight:400}.ease-font-medium{font-weight:500}.ease-font-semibold{font-weight:600}.ease-font-bold{font-weight:700}.ease-uppercase{text-transform:uppercase}.ease-lowercase{text-transform:lowercase}.ease-capitalize{text-transform:capitalize}.ease-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ease-text-primary{color:var(--ease-color-primary)}.ease-text-success{color:var(--ease-color-success)}.ease-text-danger{color:var(--ease-color-danger)}.ease-text-warning{color:var(--ease-color-warning)}.ease-text-muted{color:var(--ease-color-muted)}.ease-text-white{color:#ffffff}.ease-bg-primary{background-color:var(--ease-color-primary)}.ease-bg-success{background-color:var(--ease-color-success)}.ease-bg-danger{background-color:var(--ease-color-danger)}.ease-bg-warning{background-color:var(--ease-color-warning)}.ease-bg-white{background-color:#ffffff}.ease-bg-surface{background-color:var(--ease-color-surface)}.ease-bg-neutral{background-color:var(--ease-color-neutral-100)}.ease-bg-center{background-position:center}.ease-bg-top{background-position:top}.ease-bg-bottom{background-position:bottom}.ease-bg-left{background-position:left}.ease-bg-right{background-position:right}.ease-border{border:1px solid var(--ease-color-neutral-200)}.ease-border-2{border:2px solid var(--ease-color-neutral-200)}.ease-border-primary{border-color:var(--ease-color-primary)}.ease-rounded-sm{border-radius:var(--ease-radius-sm)}.ease-rounded{border-radius:var(--ease-radius-md)}.ease-rounded-lg{border-radius:var(--ease-radius-lg)}.ease-rounded-xl{border-radius:var(--ease-radius-xl)}.ease-rounded-full{border-radius:var(--ease-radius-full)}.ease-shadow-sm{box-shadow:var(--ease-shadow-sm)}.ease-shadow{box-shadow:var(--ease-shadow-md)}.ease-shadow-lg{box-shadow:var(--ease-shadow-lg)}.ease-shadow-xl{box-shadow:var(--ease-shadow-xl)}.ease-shadow-none{box-shadow:none}.ease-opacity-0{opacity:0}.ease-opacity-25{opacity:0.25}.ease-opacity-50{opacity:0.50}.ease-opacity-75{opacity:0.75}.ease-opacity-100{opacity:1}.ease-cursor-pointer{cursor:pointer}.ease-cursor-default{cursor:default}.ease-cursor-not-allowed{cursor:not-allowed}@media (max-width:768px){.ease-sm-hidden{display:none}.ease-sm-full{width:100%}.ease-sm-flex-col{flex-direction:column}.ease-sm-grid-cols-1{grid-template-columns:1fr}.ease-sm-text-center{text-align:center}}@media (min-width:769px) and (max-width:1024px){.ease-md-hidden{display:none}.ease-md-block{display:block}.ease-md-flex{display:flex}.ease-md-full{width:100%}.ease-md-w-auto{width:auto}.ease-md-flex-col{flex-direction:column}.ease-md-flex-row{flex-direction:row}.ease-md-grid-cols-1{grid-template-columns:1fr}.ease-md-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.ease-md-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.ease-md-text-left{text-align:left}.ease-md-text-center{text-align:center}.ease-md-text-right{text-align:right}.ease-md-gap-4{gap:var(--ease-space-4)}.ease-md-gap-6{gap:var(--ease-space-6)}.ease-md-gap-8{gap:var(--ease-space-8)}.ease-md-padding-4{padding:var(--ease-space-4)}.ease-md-padding-6{padding:var(--ease-space-6)}.ease-md-padding-8{padding:var(--ease-space-8)}.ease-md-px-4{padding-left:var(--ease-space-4);padding-right:var(--ease-space-4)}.ease-md-py-4{padding-top:var(--ease-space-4);padding-bottom:var(--ease-space-4)}.ease-md-px-8{padding-left:var(--ease-space-8);padding-right:var(--ease-space-8)}.ease-md-py-8{padding-top:var(--ease-space-8);padding-bottom:var(--ease-space-8)}.ease-md-text-sm{font-size:var(--ease-text-sm)}.ease-md-text-base{font-size:var(--ease-text-base)}.ease-md-text-lg{font-size:var(--ease-text-lg)}.ease-md-text-xl{font-size:var(--ease-text-xl)}.ease-md-text-2xl{font-size:var(--ease-text-2xl)}}.ease-btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--ease-space-2);padding:var(--ease-space-3) var(--ease-space-6);font-family:var(--ease-font-sans);font-size:var(--ease-text-sm);font-weight:600;letter-spacing:0.02em;line-height:1;white-space:nowrap;border:2px solid transparent;border-radius:var(--ease-radius-md);cursor:pointer;user-select:none;text-decoration:none;transition:background-color var(--ease-speed-fast) var(--ease-ease),color var(--ease-speed-fast) var(--ease-ease),border-color var(--ease-speed-fast) var(--ease-ease),box-shadow var(--ease-speed-medium) var(--ease-ease),transform var(--ease-speed-fast) var(--ease-ease-bounce)}.ease-btn:active{transform:scale(0.97)}.ease-btn:focus-visible{outline:2px solid var(--ease-color-primary);outline-offset:3px}.ease-btn-primary{background-color:var(--ease-color-primary);color:#ffffff;border-color:var(--ease-color-primary)}.ease-btn-primary:hover{background-color:var(--ease-color-primary-dark);border-color:var(--ease-color-primary-dark);box-shadow:var(--ease-glow-primary)}.ease-btn-success{background-color:var(--ease-color-success);color:#ffffff;border-color:var(--ease-color-success)}.ease-btn-success:hover{background-color:var(--ease-color-success-dark);border-color:var(--ease-color-success-dark);box-shadow:var(--ease-glow-success)}.ease-btn-danger{background-color:var(--ease-color-danger);color:#ffffff;border-color:var(--ease-color-danger)}.ease-btn-danger:hover{background-color:var(--ease-color-danger-dark);border-color:var(--ease-color-danger-dark);box-shadow:var(--ease-glow-danger)}.ease-btn-outline{background-color:transparent;color:var(--ease-color-primary);border-color:var(--ease-color-primary)}.ease-btn-outline:hover{background-color:var(--ease-color-primary);color:#ffffff}.ease-btn-ghost{background-color:transparent;color:var(--ease-color-neutral-700);border-color:transparent}.ease-btn-ghost:hover{background-color:var(--ease-color-neutral-100);color:var(--ease-color-neutral-900)}.ease-btn-link{background:none;border:none;color:var(--ease-color-primary);padding-left:0;padding-right:0;text-decoration:underline;text-underline-offset:3px}.ease-btn-link:hover{color:var(--ease-color-primary-dark);text-decoration:none}.ease-btn-sm{padding:var(--ease-space-2) var(--ease-space-4);font-size:var(--ease-text-xs);border-radius:var(--ease-radius-sm)}.ease-btn-lg{padding:var(--ease-space-4) var(--ease-space-8);font-size:var(--ease-text-base);border-radius:var(--ease-radius-lg)}.ease-btn-xl{padding:var(--ease-space-5) var(--ease-space-10);font-size:var(--ease-text-lg);border-radius:var(--ease-radius-lg)}.ease-btn-block{width:100%}.ease-btn-pill{border-radius:var(--ease-radius-full)}.ease-btn-icon{padding:var(--ease-space-3);border-radius:var(--ease-radius-md)}.ease-btn:disabled,.ease-btn[disabled],.ease-btn-disabled{opacity:0.5;cursor:not-allowed;pointer-events:none}.ease-btn-loading{pointer-events:none;position:relative}.ease-btn-loading::after{content:'';display:inline-block;width:0.85em;height:0.85em;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;animation:ease-kf-rotate 0.7s linear infinite;margin-left:var(--ease-space-2)}.ease-btn-hover{transition:transform var(--ease-speed-medium) var(--ease-ease-bounce),box-shadow var(--ease-speed-medium) var(--ease-ease),background-color var(--ease-speed-fast) var(--ease-ease),border-color var(--ease-speed-fast) var(--ease-ease)}.ease-btn-hover:hover{transform:translateY(-3px);box-shadow:var(--ease-shadow-lg),var(--ease-glow-primary)}.ease-btn-group{display:inline-flex}.ease-btn-group .ease-btn{border-radius:0}.ease-btn-group .ease-btn:first-child{border-radius:var(--ease-radius-md) 0 0 var(--ease-radius-md)}.ease-btn-group .ease-btn:last-child{border-radius:0 var(--ease-radius-md) var(--ease-radius-md) 0}.ease-btn-group .ease-btn:not(:last-child){border-right-width:1px}@media (prefers-reduced-motion:reduce){.ease-btn,.ease-btn-hover,.ease-btn-loading::after{transition:none !important;animation:none !important}.ease-btn:active,.ease-btn-hover:hover{transform:none !important}}.ease-card{background-color:var(--ease-color-surface);border:1px solid var(--ease-color-neutral-200);border-radius:var(--ease-radius-lg);padding:var(--ease-space-6);overflow:hidden;position:relative}.ease-card-header{padding-bottom:var(--ease-space-4);margin-bottom:var(--ease-space-4);border-bottom:1px solid var(--ease-color-neutral-100)}.ease-card-body{flex:1}.ease-card-footer{padding-top:var(--ease-space-4);margin-top:var(--ease-space-4);border-top:1px solid var(--ease-color-neutral-100);display:flex;align-items:center;gap:var(--ease-space-3)}.ease-card-title{font-size:var(--ease-text-2xl);font-weight:700;color:var(--ease-color-neutral-900);margin-bottom:var(--ease-space-1);line-height:var(--ease-leading-tight)}.ease-card-subtitle{font-size:var(--ease-text-sm);color:var(--ease-color-muted);font-weight:400}.ease-card-body p:last-child{margin-bottom:0}.ease-card-shadow{box-shadow:var(--ease-shadow-lg);border-color:transparent}.ease-card-hover{cursor:pointer;transition:transform var(--ease-speed-medium) var(--ease-ease),box-shadow var(--ease-speed-medium) var(--ease-ease),border-color var(--ease-speed-medium) var(--ease-ease);will-change:transform,box-shadow}.ease-card-hover:hover{transform:translateY(-6px);box-shadow:var(--ease-shadow-xl);border-color:var(--ease-color-primary-light)}.ease-card-glow{transition:box-shadow var(--ease-speed-medium) var(--ease-ease),border-color var(--ease-speed-medium) var(--ease-ease)}.ease-card-glow:hover{box-shadow:var(--ease-glow-primary),var(--ease-shadow-lg);border-color:var(--ease-color-primary-light)}.ease-card-flat{border-color:transparent;background-color:var(--ease-color-neutral-100)}.ease-card-outlined{background-color:transparent;border:2px solid var(--ease-color-neutral-200)}.ease-card-glass{background:rgba(255,255,255,0.12);border:1px solid rgba(255,255,255,0.2);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);color:#ffffff}.ease-card-accent{border-left:4px solid var(--ease-color-primary)}.ease-card-accent-success{border-left:4px solid var(--ease-color-success)}.ease-card-accent-danger{border-left:4px solid var(--ease-color-danger)}.ease-card-accent-warning{border-left:4px solid var(--ease-color-warning)}.ease-card-image{padding:0}.ease-card-image .ease-card-img{width:100%;height:200px;object-fit:cover;display:block;border-radius:var(--ease-radius-lg) var(--ease-radius-lg) 0 0}.ease-card-image .ease-card-body{padding:var(--ease-space-6)}.ease-card-compact{padding:var(--ease-space-4)}.ease-card-horizontal{display:flex;flex-direction:row;gap:var(--ease-space-4);align-items:flex-start;padding:var(--ease-space-4)}.ease-card-info{background-color:rgba(108,99,255,0.06);border-color:var(--ease-color-primary-light);color:var(--ease-color-primary-dark)}.ease-card-success-bg{background-color:rgba(34,197,94,0.06);border-color:var(--ease-color-success-light)}.ease-card-danger-bg{background-color:rgba(239,68,68,0.06);border-color:var(--ease-color-danger-light)}.ease-card-stat{text-align:center;padding:var(--ease-space-8)}.ease-card-stat .ease-stat-value{font-size:var(--ease-text-4xl);font-weight:700;color:var(--ease-color-primary);line-height:1;margin-bottom:var(--ease-space-2)}.ease-card-stat .ease-stat-label{font-size:var(--ease-text-sm);color:var(--ease-color-muted);font-weight:500;text-transform:uppercase;letter-spacing:0.08em} +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');:root{--ease-speed-fast:150ms;--ease-speed-medium:300ms;--ease-speed-slow:600ms;--ease-ease:cubic-bezier(0.4,0,0.2,1);--ease-ease-out:cubic-bezier(0,0,0.2,1);--ease-ease-bounce:cubic-bezier(0.34,1.56,0.64,1);--ease-animation-iterations:infinite;--ease-color-primary:#6c63ff;--ease-color-primary-light:#a09af8;--ease-color-primary-dark:#4b44cc;--ease-color-success:#22c55e;--ease-color-success-light:#86efac;--ease-color-success-dark:#15803d;--ease-color-danger:#ef4444;--ease-color-danger-light:#fca5a5;--ease-color-danger-dark:#b91c1c;--ease-color-warning:#f59e0b;--ease-color-warning-light:#fcd34d;--ease-color-warning-dark:#b45309;--ease-color-info:#3b82f6;--ease-color-info-light:#93c5fd;--ease-color-info-dark:#1d4ed8;--ease-color-neutral-50:#f8fafc;--ease-color-neutral-100:#f1f5f9;--ease-color-neutral-200:#e2e8f0;--ease-color-neutral-300:#cbd5e1;--ease-color-neutral-400:#94a3b8;--ease-color-neutral-500:#64748b;--ease-color-neutral-600:#475569;--ease-color-neutral-700:#334155;--ease-color-neutral-800:#1e293b;--ease-color-neutral-900:#0f172a;--ease-color-bg:var(--ease-color-neutral-50);--ease-color-surface:#ffffff;--ease-color-text:var(--ease-color-neutral-800);--ease-color-muted:var(--ease-color-neutral-500);--ease-space-1:0.25rem;--ease-space-2:0.5rem;--ease-space-3:0.75rem;--ease-space-4:1rem;--ease-space-5:1.25rem;--ease-space-6:1.5rem;--ease-space-8:2rem;--ease-space-10:2.5rem;--ease-space-12:3rem;--ease-space-16:4rem;--ease-radius-xl:2rem;--ease-glow-primary:0 0 16px rgba(108,99,255,0.45);--ease-glow-success:0 0 16px rgba(34,197,94,0.45);--ease-glow-danger:0 0 16px rgba(239,68,68,0.45);--ease-radius-sm:0.25rem;--ease-radius-md:0.5rem;--ease-radius-lg:1rem;--ease-radius-xl:1.5rem;--ease-radius-full:9999px;--ease-shadow-sm:0 1px 3px rgba(0,0,0,0.08),0 1px 2px rgba(0,0,0,0.05);--ease-shadow-md:0 4px 6px -1px rgba(0,0,0,0.10),0 2px 4px -1px rgba(0,0,0,0.06);--ease-shadow-lg:0 10px 15px -3px rgba(0,0,0,0.10),0 4px 6px -2px rgba(0,0,0,0.05);--ease-shadow-xl:0 20px 25px -5px rgba(0,0,0,0.10),0 10px 10px -5px rgba(0,0,0,0.04);--ease-glow-primary:0 0 16px rgba(108,99,255,0.45);--ease-glow-success:0 0 16px rgba(34,197,94,0.45);--ease-glow-danger:0 0 16px rgba(239,68,68,0.45);--ease-glow-info:0 0 16px rgba(59,130,246,0.45);--ease-font-sans:'Inter',system-ui,-apple-system,sans-serif;--ease-font-mono:'JetBrains Mono','Fira Code',monospace;--ease-text-xs:0.75rem;--ease-text-sm:0.875rem;--ease-text-base:1rem;--ease-text-lg:1.125rem;--ease-text-xl:1.25rem;--ease-text-2xl:1.5rem;--ease-text-3xl:1.875rem;--ease-text-4xl:2.25rem;--ease-leading-tight:1.25;--ease-leading-normal:1.6;--ease-leading-loose:1.9;--ease-z-base:0;--ease-z-raised:10;--ease-z-overlay:100;--ease-z-modal:1000;--ease-z-toast:9999}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{font-size:16px;scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{font-family:var(--ease-font-sans);font-size:var(--ease-text-base);line-height:var(--ease-leading-normal);color:var(--ease-color-text);background-color:var(--ease-color-bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-weight:700;line-height:var(--ease-leading-tight);color:var(--ease-color-neutral-900)}h1{font-size:var(--ease-text-4xl)}h2{font-size:var(--ease-text-3xl)}h3{font-size:var(--ease-text-2xl)}h4{font-size:var(--ease-text-xl)}h5{font-size:var(--ease-text-lg)}h6{font-size:var(--ease-text-base)}p{margin-bottom:var(--ease-space-4);color:var(--ease-color-neutral-700)}a{color:var(--ease-color-primary);text-decoration:none;transition:color var(--ease-speed-fast) var(--ease-ease)}a:hover{color:var(--ease-color-primary-dark);text-decoration:underline}ul,ol{padding-left:var(--ease-space-6)}li{margin-bottom:var(--ease-space-1)}img,video,svg{display:block;max-width:100%}code,kbd,samp,pre{font-family:var(--ease-font-mono);font-size:var(--ease-text-sm)}code{background-color:var(--ease-color-neutral-100);color:var(--ease-color-primary-dark);padding:0.1em 0.4em;border-radius:var(--ease-radius-sm)}pre{background-color:var(--ease-color-neutral-900);color:var(--ease-color-neutral-50);padding:var(--ease-space-6);border-radius:var(--ease-radius-md);overflow-x:auto;line-height:var(--ease-leading-loose)}input,textarea,select,button{font-family:inherit;font-size:inherit}button{cursor:pointer;border:none;background:none}hr{border:none;border-top:1px solid var(--ease-color-neutral-200);margin:var(--ease-space-8) 0}:focus-visible,button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible,a:focus-visible{outline:2px solid var(--ease-color-primary);outline-offset:3px;border-radius:var(--ease-radius-sm)}::selection{background-color:var(--ease-color-primary);color:#ffffff}@keyframes ease-kf-fade-in{from{opacity:0}to{opacity:1}}@keyframes ease-kf-fade-out{from{opacity:1}to{opacity:0}}@keyframes ease-kf-slide-up{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}@keyframes ease-kf-slide-down{from{opacity:0;transform:translateY(-24px)}to{opacity:1;transform:translateY(0)}}@keyframes ease-kf-slide-left{from{opacity:0;transform:translateX(24px)}to{opacity:1;transform:translateX(0)}}@keyframes ease-kf-slide-right{from{opacity:0;transform:translateX(-24px)}to{opacity:1;transform:translateX(0)}}@keyframes ease-kf-slide-in-left{from{opacity:0;transform:translateX(-32px)}to{opacity:1;transform:translateX(0)}}@keyframes ease-kf-slide-in-right{from{opacity:0;transform:translateX(32px)}to{opacity:1;transform:translateX(0)}}@keyframes ease-kf-slide-in-from-top{from{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@keyframes ease-kf-slide-in-from-bottom{from{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes ease-kf-slide-in-from-left{from{opacity:0;transform:translateX(-100%)}to{opacity:1;transform:translateX(0)}}@keyframes ease-kf-slide-in-from-right{from{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes ease-kf-slide-in-from-top-left{from{opacity:0;transform:translate(-100%,-100%)}to{opacity:1;transform:translate(0,0)}}@keyframes ease-kf-slide-in-from-top-right{from{opacity:0;transform:translate(100%,-100%)}to{opacity:1;transform:translate(0,0)}}@keyframes ease-kf-slide-in-from-bottom-left{from{opacity:0;transform:translate(-100%,100%)}to{opacity:1;transform:translate(0,0)}}@keyframes ease-kf-slide-in-from-bottom-right{from{opacity:0;transform:translate(100%,100%)}to{opacity:1;transform:translate(0,0)}}@keyframes ease-kf-bounce{0%,100%{transform:translateY(0);animation-timing-function:cubic-bezier(0.8,0,1,1)}50%{transform:translateY(-20px);animation-timing-function:cubic-bezier(0,0,0.2,1)}}@keyframes ease-kf-squish-border{0%{border-radius:12px;transform:scaleX(1)}50%{border-radius:24px;transform:scaleX(0.88)}100%{border-radius:6px;transform:scaleX(1)}}@keyframes ease-kf-pulse{0%,100%{opacity:1}50%{opacity:0.45}}@keyframes ease-kf-rotate{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes ease-kf-ping{75%,100%{transform:scale(2);opacity:0}}@keyframes ease-kf-shake{0%,100%{transform:translateX(0)}10%,50%,90%{transform:translateX(-6px)}30%,70%{transform:translateX(6px)}}@keyframes ease-kf-zoom-in{from{opacity:0;transform:scale(0.85)}to{opacity:1;transform:scale(1)}}@keyframes ease-kf-flip{from{transform:perspective(400px) rotateY(90deg);opacity:0}to{transform:perspective(400px) rotateY(0deg);opacity:1}}@keyframes ease-kf-shimmer{0%{background-position:-1000px 0}100%{background-position:1000px 0}}@keyframes ease-kf-pulse-fade{0%,100%{opacity:1}50%{opacity:0.45}}@keyframes ease-kf-typewriter-loop{0%{width:0}40%{width:var(--ease-typewriter-length,12ch)}60%{width:var(--ease-typewriter-length,12ch)}100%{width:0}}@keyframes ease-kf-cursor-blink{0%,49%{border-right-color:currentColor}50%,100%{border-right-color:transparent}}@keyframes ease-kf-blur-to-focus{from{filter:blur(12px);opacity:0}to{filter:blur(0px);opacity:1}}@keyframes ease-kf-contract-bg-exit{from{transform:scale(1);opacity:1}to{transform:scale(0.85);opacity:0}}@keyframes ease-kf-contract-image-entrance{from{opacity:0;transform:scale(1.25)}to{opacity:1;transform:scale(1)}}@keyframes ease-kf-bounce-text{0%,100%{transform:translateY(0) scale(1)}30%{transform:translateY(-6px) scale(1.08)}60%{transform:translateY(2px) scale(0.98)}}@keyframes ease-kf-shake-card-exit{0%{transform:translateX(0) rotate(0deg);opacity:1}20%{transform:translateX(-8px) rotate(-2deg)}40%{transform:translateX(8px) rotate(2deg)}60%{transform:translateX(-6px) rotate(-1deg)}80%{transform:translateX(6px) rotate(1deg)}100%{transform:translateX(0) rotate(0deg);opacity:0}}@keyframes ease-kf-bounce-button-exit{0%{transform:scale(1);opacity:1}20%{transform:scale(1.15)}40%{transform:scale(0.90)}60%{transform:scale(1.05)}80%{transform:scale(0.95)}100%{transform:scale(0);opacity:0}}@keyframes ease-kf-expand-border-exit{0%{opacity:1;transform:scale(1);border-width:2px}100%{opacity:0;transform:scale(1.15);border-width:6px}}@keyframes ease-kf-fade-icon-exit{from{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(0.75)}}@keyframes ease-kf-scale-text-exit{from{transform:scale(1);opacity:1}to{transform:scale(0.6);opacity:0}}@keyframes ease-kf-glow-shadow-exit{from{box-shadow:0 0 12px 4px rgba(99,102,241,0.6);opacity:1}to{box-shadow:0 0 0px 0px rgba(99,102,241,0);opacity:0}}@keyframes ease-kf-pulse-border-emphasis{0%,100%{box-shadow:0 0 0 0px rgba(99,102,241,0.6);border-color:rgba(99,102,241,1)}50%{box-shadow:0 0 0 6px rgba(99,102,241,0);border-color:rgba(99,102,241,0.4)}}@keyframes ease-kf-squish-button{0%{transform:scale(1)}35%{transform:scaleX(1.12) scaleY(0.88)}70%{transform:scaleX(0.96) scaleY(1.06)}100%{transform:scale(1)}}@keyframes ease-kf-shimmer-sweep{0%{background-position:-200% center}100%{background-position:200% center}}@keyframes ease-kf-gradient-rotation{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}@keyframes ease-kf-contract-shadow-emphasis{0%{box-shadow:0 8px 24px rgba(0,0,0,0.3);transform:scale(1)}50%{box-shadow:0 2px 6px rgba(0,0,0,0.15);transform:scale(0.96)}100%{box-shadow:0 8px 24px rgba(0,0,0,0.3);transform:scale(1)}}@keyframes ease-kf-rotate-image-exit{from{transform:rotate(0deg) scale(1);opacity:1}to{transform:rotate(90deg) scale(0.75);opacity:0}}@keyframes ease-kf-slide-image-exit{from{transform:translateX(0);opacity:1}to{transform:translateX(100%);opacity:0}}@keyframes ease-kf-morph-card{from{border-radius:8px}to{border-radius:50%}}@keyframes ease-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}@keyframes ease-zoom-in{from{transform:scale(0)}to{transform:scale(1)}}@keyframes ease-zoom-out{from{transform:scale(1.5)}to{transform:scale(1)}}@keyframes ease-bounce-in{@keyframes ease-kf-shimmer-sweep{0%{opacity:0;transform:scale(0.3)}50%{opacity:1;transform:scale(1.1)}70%{transform:scale(0.95)}100%{background-position:200% center}}.ease-zoom-in{animation:ease-kf-zoom-in var(--ease-speed-medium) var(--ease-ease-bounce) both}.ease-zoom-out{animation:ease-zoom-out 0.6s ease-out forwards}.ease-float{animation:ease-float 3s ease-in-out infinite}.ease-bounce-in{animation:ease-bounce-in 0.8s ease-out forwards}.ease-shake-card-exit{animation:ease-kf-shake-card-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-bounce-button-exit{animation:ease-kf-bounce-button-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-fade-icon-exit{animation:ease-kf-fade-icon-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-scale-text-exit{animation:ease-kf-scale-text-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-glow-shadow-exit{animation:ease-kf-glow-shadow-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-pulse-border-emphasis{animation:ease-kf-pulse-border-emphasis 1.5s var(--ease-ease);animation-iteration-count:var(--ease-animation-iterations)}.ease-slide-image-exit{animation:ease-kf-slide-image-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-hover-bounce-text{display:inline-block}.ease-hover-bounce-text:hover{animation:ease-kf-bounce-text var(--ease-speed-medium) var(--ease-ease-bounce)}.ease-squish-button:hover,.ease-squish-button:focus-visible,.ease-squish-button:active{animation:ease-kf-squish-button var(--ease-speed-medium) var(--ease-ease) both}.ease-shimmer-sweep{background:linear-gradient( 120deg,transparent 30%,rgba(255,255,255,0.15) 50%,transparent 70% );background-size:200% auto;animation:ease-kf-shimmer-sweep var(--ease-speed-slow) var(--ease-ease);animation-iteration-count:var(--ease-animation-iterations)}.ease-squish-button:hover,.ease-squish-button:focus-visible,.ease-squish-button:active{animation:ease-kf-squish-button var(--ease-speed-medium) var(--ease-ease) both}.ease-gradient-rotation{background:linear-gradient(270deg,var(--ease-color-primary),var(--ease-color-secondary,#8b5cf6),var(--ease-color-primary) );background-size:200% 200%;animation:ease-kf-gradient-rotation 3s var(--ease-ease);animation-iteration-count:var(--ease-animation-iterations)}.ease-contract-shadow-emphasis{animation:ease-kf-contract-shadow-emphasis var(--ease-speed-medium) var(--ease-ease) both}.ease-rotate-image-exit{animation:ease-kf-rotate-image-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-skeleton-shimmer{background:var(--ease-color-neutral-100);background-image:linear-gradient( 90deg,var(--ease-color-neutral-100) 0px,var(--ease-color-neutral-200) 40px,var(--ease-color-neutral-100) 80px );background-size:1000px 100%;animation:ease-kf-shimmer 2s linear forwards;animation-iteration-count:var(--ease-animation-iterations)}.ease-skeleton-pulse{background-color:var(--ease-color-neutral-200);animation:ease-kf-pulse-fade 1.5s var(--ease-ease);animation-iteration-count:var(--ease-animation-iterations)}.ease-skeleton-block{border-radius:var(--ease-radius-md);display:block}.ease-fade-in{animation:ease-kf-fade-in var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-up:not(.ease-slide-down){animation:ease-kf-slide-up var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-down:not(.ease-slide-up){animation:ease-kf-slide-down var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-left:not(.ease-slide-right){animation:ease-kf-slide-left var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-right:not(.ease-slide-left){animation:ease-kf-slide-right var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-left{animation:ease-kf-slide-in-left var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-right{animation:ease-kf-slide-in-right var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-top{animation:ease-kf-slide-in-from-top var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-bottom{animation:ease-kf-slide-in-from-bottom var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-left{animation:ease-kf-slide-in-from-left var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-right{animation:ease-kf-slide-in-from-right var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-top-left{animation:ease-kf-slide-in-from-top-left var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-top-right{animation:ease-kf-slide-in-from-top-right var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-bottom-left{animation:ease-kf-slide-in-from-bottom-left var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-in-from-bottom-right{animation:ease-kf-slide-in-from-bottom-right var(--ease-speed-medium) var(--ease-ease) both}.ease-flip{animation:ease-kf-flip var(--ease-speed-medium) var(--ease-ease) both}.ease-blur-to-focus{animation:ease-kf-blur-to-focus var(--ease-speed-medium) var(--ease-ease) both}.ease-contract-image-entrance{animation:ease-kf-contract-image-entrance var(--ease-speed-medium) var(--ease-ease) both}.ease-bounce-in{animation:ease-bounce-in 0.8s ease-out forwards}.ease-fade-out{animation:ease-kf-fade-out var(--ease-speed-medium) var(--ease-ease) both}.ease-shake-card-exit{animation:ease-kf-shake-card-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-bounce-button-exit{animation:ease-kf-bounce-button-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-fade-icon-exit{animation:ease-kf-fade-icon-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-scale-text-exit{animation:ease-kf-scale-text-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-glow-shadow-exit{animation:ease-kf-glow-shadow-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-slide-image-exit{animation:ease-kf-slide-image-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-rotate-image-exit{animation:ease-kf-rotate-image-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-expand-border-exit{animation:ease-kf-expand-border-exit var(--ease-speed-medium) var(--ease-ease) forwards}.ease-contract-bg-exit{animation:ease-kf-contract-bg-exit var(--ease-speed-medium) var(--ease-ease) both}.ease-zoom-out{animation:ease-zoom-out 0.6s ease-out forwards}.ease-skeleton-pulse{background-color:var(--ease-color-neutral-200);animation:ease-kf-pulse-fade 1.5s var(--ease-ease) infinite}.ease-bounce{animation:ease-kf-bounce 1s;animation-iteration-count:var(--ease-animation-iterations)}.ease-rotate{animation:ease-kf-rotate 1.2s linear;animation-iteration-count:var(--ease-animation-iterations)}.ease-pulse{animation:ease-kf-pulse 2s var(--ease-ease);animation-iteration-count:var(--ease-animation-iterations)}.ease-ping{animation:ease-kf-ping 1s cubic-bezier(0,0,0.2,1);animation-iteration-count:var(--ease-animation-iterations)}.ease-shake{animation:ease-kf-shake 0.5s var(--ease-ease) both}.ease-typewriter-loop{--ease-typewriter-length:12ch;--ease-typewriter-duration:6s;display:inline-block;overflow:hidden;white-space:nowrap;width:0;max-width:fit-content;border-right:2px solid currentColor;--ease-typewriter-steps:12;animation:ease-kf-typewriter-loop var(--ease-typewriter-duration) steps(var(--ease-typewriter-steps),end),ease-kf-cursor-blink 0.8s step-end;animation-iteration-count:var(--ease-animation-iterations);will-change:width}.ease-pulse-border-emphasis{animation:ease-kf-pulse-border-emphasis 1.5s var(--ease-ease) infinite}.ease-shimmer-sweep{background:linear-gradient( 120deg,transparent 30%,rgba(255,255,255,0.15) 50%,transparent 70% );background-size:200% auto;animation:ease-kf-shimmer-sweep var(--ease-speed-slow) var(--ease-ease) infinite}.ease-gradient-rotation{background:linear-gradient(270deg,var(--ease-color-primary),var(--ease-color-secondary,#8b5cf6),var(--ease-color-primary) );background-size:200% 200%;animation:ease-kf-gradient-rotation 3s var(--ease-ease) infinite}.ease-float{animation:ease-float 3s ease-in-out infinite}.ease-hover-grow{transition:transform var(--ease-speed-medium) var(--ease-ease-bounce);will-change:transform}.ease-hover-grow:hover{transform:scale(1.06)}.ease-hover-lift-shadow{transition:transform var(--ease-speed-medium) var(--ease-ease),box-shadow var(--ease-speed-medium) var(--ease-ease);will-change:transform,box-shadow}.ease-hover-lift-shadow:hover{transform:translateY(-4px);box-shadow:0 12px 32px rgba(0,0,0,0.15),0 4px 12px rgba(0,0,0,0.1)}.ease-hover-shrink{transition:transform var(--ease-speed-fast) var(--ease-ease);will-change:transform}.ease-hover-shrink:hover{transform:scale(0.95)}.ease-hover-glow{transition:box-shadow var(--ease-speed-medium) var(--ease-ease)}.ease-hover-glow:hover{box-shadow:var(--ease-glow-primary)}.ease-hover-lift{transition:transform var(--ease-speed-medium) var(--ease-ease),box-shadow var(--ease-speed-medium) var(--ease-ease)}.ease-hover-lift:hover{transform:translateY(-4px);box-shadow:var(--ease-shadow-xl)}.ease-hover-underline{position:relative}.ease-hover-underline::after{content:'';position:absolute;left:0;bottom:-2px;width:0;height:2px;background-color:var(--ease-color-primary);transition:width var(--ease-speed-medium) var(--ease-ease)}.ease-hover-underline:hover::after{width:100%}.ease-card-lift{transition:transform var(--ease-speed-medium) var(--ease-ease-out),box-shadow var(--ease-speed-medium) var(--ease-ease-out);will-change:transform,box-shadow}.ease-card-lift:hover{transform:translateY(-8px);box-shadow:var(--ease-shadow-xl)}.ease-hover-shimmer{position:relative;overflow:hidden}.ease-hover-shimmer::before{content:'';position:absolute;top:0;left:-100%;width:60%;height:100%;background:linear-gradient( 120deg,transparent 0%,rgba(255,255,255,0.08) 50%,transparent 100% );transition:left var(--ease-speed-slow) var(--ease-ease);pointer-events:none}.ease-hover-shimmer:hover::before{left:150%}.ease-hover-squish-border{display:inline-block;transition:border-radius var(--ease-speed-medium) var(--ease-ease),transform var(--ease-speed-medium) var(--ease-ease)}.ease-hover-squish-border:hover{animation:ease-kf-squish-border var(--ease-speed-medium) var(--ease-ease-bounce)}.ease-hover-morph-card{border-radius:0;transition:border-radius var(--ease-speed-medium) var(--ease-ease),transform var(--ease-speed-medium) var(--ease-ease);will-change:border-radius,transform}.ease-hover-morph-card:hover{border-radius:50%;transform:scale(1.08)}.ease-hover-bounce-text{display:inline-block}.ease-hover-bounce-text:hover{animation:ease-kf-bounce-text var(--ease-speed-medium) var(--ease-ease-bounce)}.ease-squish-button:hover,.ease-squish-button:focus-visible,.ease-squish-button:active{animation:ease-kf-squish-button var(--ease-speed-medium) var(--ease-ease) both}.ease-contract-shadow-emphasis{animation:ease-kf-contract-shadow-emphasis var(--ease-speed-medium) var(--ease-ease) both}.ease-delay-75{animation-delay:75ms}.ease-delay-100{animation-delay:100ms}.ease-delay-150{animation-delay:150ms}.ease-delay-200{animation-delay:200ms}.ease-delay-300{animation-delay:300ms}.ease-delay-400{animation-delay:400ms}.ease-delay-500{animation-delay:500ms}.ease-delay-600{animation-delay:600ms}.ease-delay-700{animation-delay:700ms}.ease-delay-800{animation-delay:800ms}.ease-delay-1000{animation-delay:1000ms}.ease-duration-fast{animation-duration:var(--ease-speed-fast)}.ease-duration-medium{animation-duration:var(--ease-speed-medium)}.ease-duration-slow{animation-duration:var(--ease-speed-slow)}@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:0.01ms !important;animation-iteration-count:1 !important;transition-duration:0.01ms !important}}.ease-block{display:block}.ease-inline{display:inline}.ease-inline-block{display:inline-block}.ease-hidden{display:none}.ease-flex{display:flex}.ease-inline-flex{display:inline-flex}.ease-center{display:flex;align-items:center;justify-content:center}.ease-flex-col{flex-direction:column}.ease-flex-row{flex-direction:row}.ease-flex-wrap{flex-wrap:wrap}.ease-flex-nowrap{flex-wrap:nowrap}.ease-items-start{align-items:flex-start}.ease-items-center{align-items:center}.ease-items-end{align-items:flex-end}.ease-items-stretch{align-items:stretch}.ease-justify-start{justify-content:flex-start}.ease-justify-center{justify-content:center}.ease-justify-end{justify-content:flex-end}.ease-justify-between{justify-content:space-between}.ease-justify-around{justify-content:space-around}.ease-justify-evenly{justify-content:space-evenly}.ease-flex-1{flex:1 1 0%}.ease-flex-auto{flex:1 1 auto}.ease-flex-none{flex:none}.ease-grow{flex-grow:1}.ease-shrink{flex-shrink:1}.ease-grid{display:grid}.ease-inline-grid{display:inline-grid}.ease-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.ease-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.ease-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.ease-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.ease-grid-auto{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}.ease-col-span-2{grid-column:span 2 / span 2}.ease-col-span-3{grid-column:span 3 / span 3}.ease-col-full{grid-column:1 / -1}.ease-gap-1{gap:var(--ease-space-1)}.ease-gap-2{gap:var(--ease-space-2)}.ease-gap-3{gap:var(--ease-space-3)}.ease-gap{gap:var(--ease-space-4)}.ease-gap-4{gap:var(--ease-space-4)}.ease-gap-6{gap:var(--ease-space-6)}.ease-gap-8{gap:var(--ease-space-8)}.ease-gap-10{gap:var(--ease-space-10)}.ease-padding{padding:var(--ease-space-4)}.ease-padding-1{padding:var(--ease-space-1)}.ease-padding-2{padding:var(--ease-space-2)}.ease-padding-3{padding:var(--ease-space-3)}.ease-padding-4{padding:var(--ease-space-4)}.ease-padding-6{padding:var(--ease-space-6)}.ease-padding-8{padding:var(--ease-space-8)}.ease-padding-10{padding:var(--ease-space-10)}.ease-padding-12{padding:var(--ease-space-12)}.ease-pt-4{padding-top:var(--ease-space-4)}.ease-pr-4{padding-right:var(--ease-space-4)}.ease-pb-4{padding-bottom:var(--ease-space-4)}.ease-pl-4{padding-left:var(--ease-space-4)}.ease-px-4{padding-left:var(--ease-space-4);padding-right:var(--ease-space-4)}.ease-py-4{padding-top:var(--ease-space-4);padding-bottom:var(--ease-space-4)}.ease-px-8{padding-left:var(--ease-space-8);padding-right:var(--ease-space-8)}.ease-py-8{padding-top:var(--ease-space-8);padding-bottom:var(--ease-space-8)}.ease-margin{margin:var(--ease-space-4)}.ease-margin-1{margin:var(--ease-space-1)}.ease-margin-2{margin:var(--ease-space-2)}.ease-margin-3{margin:var(--ease-space-3)}.ease-margin-4{margin:var(--ease-space-4)}.ease-margin-6{margin:var(--ease-space-6)}.ease-margin-8{margin:var(--ease-space-8)}.ease-margin-auto{margin:auto}.ease-mx-auto{margin-left:auto;margin-right:auto}.ease-my-4{margin-top:var(--ease-space-4);margin-bottom:var(--ease-space-4)}.ease-my-8{margin-top:var(--ease-space-8);margin-bottom:var(--ease-space-8)}.ease-mt-4{margin-top:var(--ease-space-4)}.ease-mr-4{margin-right:var(--ease-space-4)}.ease-mb-4{margin-bottom:var(--ease-space-4)}.ease-ml-4{margin-left:var(--ease-space-4)}.ease-w-full{width:100%}.ease-w-screen{width:100vw}.ease-w-auto{width:auto}.ease-h-full{height:100%}.ease-h-screen{height:100vh}.ease-h-auto{height:auto}.ease-container{width:100%;max-width:1200px;margin-left:auto;margin-right:auto;padding-left:var(--ease-space-6);padding-right:var(--ease-space-6)}.ease-relative{position:relative}.ease-absolute{position:absolute}.ease-fixed{position:fixed}.ease-sticky{position:sticky;top:0}.ease-overflow-hidden{overflow:hidden}.ease-overflow-auto{overflow:auto}.ease-overflow-scroll{overflow:scroll}.ease-overflow-x-auto{overflow-x:auto}.ease-overflow-y-auto{overflow-y:auto}.ease-text-xs{font-size:var(--ease-text-xs)}.ease-text-sm{font-size:var(--ease-text-sm)}.ease-text-base{font-size:var(--ease-text-base)}.ease-text-lg{font-size:var(--ease-text-lg)}.ease-text-xl{font-size:var(--ease-text-xl)}.ease-text-2xl{font-size:var(--ease-text-2xl)}.ease-text-3xl{font-size:var(--ease-text-3xl)}.ease-text-4xl{font-size:var(--ease-text-4xl)}.ease-text-left{text-align:left}.ease-text-center{text-align:center}.ease-text-right{text-align:right}.ease-font-light{font-weight:300}.ease-font-regular{font-weight:400}.ease-font-medium{font-weight:500}.ease-font-semibold{font-weight:600}.ease-font-bold{font-weight:700}.ease-uppercase{text-transform:uppercase}.ease-lowercase{text-transform:lowercase}.ease-capitalize{text-transform:capitalize}.ease-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ease-text-primary{color:var(--ease-color-primary)}.ease-text-success{color:var(--ease-color-success)}.ease-text-danger{color:var(--ease-color-danger)}.ease-text-warning{color:var(--ease-color-warning)}.ease-text-muted{color:var(--ease-color-muted)}.ease-text-white{color:#ffffff}.ease-bg-primary{background-color:var(--ease-color-primary)}.ease-bg-success{background-color:var(--ease-color-success)}.ease-bg-danger{background-color:var(--ease-color-danger)}.ease-bg-warning{background-color:var(--ease-color-warning)}.ease-bg-white{background-color:#ffffff}.ease-bg-surface{background-color:var(--ease-color-surface)}.ease-bg-neutral{background-color:var(--ease-color-neutral-100)}.ease-bg-center{background-position:center}.ease-bg-top{background-position:top}.ease-bg-bottom{background-position:bottom}.ease-bg-left{background-position:left}.ease-bg-right{background-position:right}.ease-border{border:1px solid var(--ease-color-neutral-200)}.ease-border-2{border:2px solid var(--ease-color-neutral-200)}.ease-border-primary{border-color:var(--ease-color-primary)}.ease-rounded-sm{border-radius:var(--ease-radius-sm)}.ease-rounded{border-radius:var(--ease-radius-md)}.ease-rounded-lg{border-radius:var(--ease-radius-lg)}.ease-rounded-xl{border-radius:var(--ease-radius-xl)}.ease-rounded-full{border-radius:var(--ease-radius-full)}.ease-shadow-sm{box-shadow:var(--ease-shadow-sm)}.ease-shadow{box-shadow:var(--ease-shadow-md)}.ease-shadow-lg{box-shadow:var(--ease-shadow-lg)}.ease-shadow-xl{box-shadow:var(--ease-shadow-xl)}.ease-shadow-none{box-shadow:none}.ease-opacity-0{opacity:0}.ease-opacity-25{opacity:0.25}.ease-opacity-50{opacity:0.50}.ease-opacity-75{opacity:0.75}.ease-opacity-100{opacity:1}.ease-cursor-pointer{cursor:pointer}.ease-cursor-default{cursor:default}.ease-cursor-not-allowed{cursor:not-allowed}@media (max-width:768px){.ease-sm-hidden{display:none}.ease-sm-full{width:100%}.ease-sm-flex-col{flex-direction:column}.ease-sm-grid-cols-1{grid-template-columns:1fr}.ease-sm-text-center{text-align:center}}@media (min-width:769px) and (max-width:1024px){.ease-md-hidden{display:none}.ease-md-block{display:block}.ease-md-flex{display:flex}.ease-md-full{width:100%}.ease-md-w-auto{width:auto}.ease-md-flex-col{flex-direction:column}.ease-md-flex-row{flex-direction:row}.ease-md-grid-cols-1{grid-template-columns:1fr}.ease-md-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.ease-md-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.ease-md-text-left{text-align:left}.ease-md-text-center{text-align:center}.ease-md-text-right{text-align:right}.ease-md-gap-4{gap:var(--ease-space-4)}.ease-md-gap-6{gap:var(--ease-space-6)}.ease-md-gap-8{gap:var(--ease-space-8)}.ease-md-padding-4{padding:var(--ease-space-4)}.ease-md-padding-6{padding:var(--ease-space-6)}.ease-md-padding-8{padding:var(--ease-space-8)}.ease-md-px-4{padding-left:var(--ease-space-4);padding-right:var(--ease-space-4)}.ease-md-py-4{padding-top:var(--ease-space-4);padding-bottom:var(--ease-space-4)}.ease-md-px-8{padding-left:var(--ease-space-8);padding-right:var(--ease-space-8)}.ease-md-py-8{padding-top:var(--ease-space-8);padding-bottom:var(--ease-space-8)}.ease-md-text-sm{font-size:var(--ease-text-sm)}.ease-md-text-base{font-size:var(--ease-text-base)}.ease-md-text-lg{font-size:var(--ease-text-lg)}.ease-md-text-xl{font-size:var(--ease-text-xl)}.ease-md-text-2xl{font-size:var(--ease-text-2xl)}}.ease-btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--ease-space-2);padding:var(--ease-space-3) var(--ease-space-6);font-family:var(--ease-font-sans);font-size:var(--ease-text-sm);font-weight:600;letter-spacing:0.02em;line-height:1;white-space:nowrap;border:2px solid transparent;border-radius:var(--ease-radius-md);cursor:pointer;user-select:none;text-decoration:none;transition:background-color var(--ease-speed-fast) var(--ease-ease),color var(--ease-speed-fast) var(--ease-ease),border-color var(--ease-speed-fast) var(--ease-ease),box-shadow var(--ease-speed-medium) var(--ease-ease),transform var(--ease-speed-fast) var(--ease-ease-bounce)}.ease-btn:active{transform:scale(0.97)}.ease-btn:focus-visible{outline:2px solid var(--ease-color-primary);outline-offset:3px}.ease-btn-primary{background-color:var(--ease-color-primary);color:#ffffff;border-color:var(--ease-color-primary)}.ease-btn-primary:hover{background-color:var(--ease-color-primary-dark);border-color:var(--ease-color-primary-dark);box-shadow:var(--ease-glow-primary)}.ease-btn-success{background-color:var(--ease-color-success);color:#ffffff;border-color:var(--ease-color-success)}.ease-btn-success:hover{background-color:var(--ease-color-success-dark);border-color:var(--ease-color-success-dark);box-shadow:var(--ease-glow-success)}.ease-btn-danger{background-color:var(--ease-color-danger);color:#ffffff;border-color:var(--ease-color-danger)}.ease-btn-danger:hover{background-color:var(--ease-color-danger-dark);border-color:var(--ease-color-danger-dark);box-shadow:var(--ease-glow-danger)}.ease-btn-outline{background-color:transparent;color:var(--ease-color-primary);border-color:var(--ease-color-primary)}.ease-btn-outline:hover{background-color:var(--ease-color-primary);color:#ffffff}.ease-btn-ghost{background-color:transparent;color:var(--ease-color-neutral-700);border-color:transparent}.ease-btn-ghost:hover{background-color:var(--ease-color-neutral-100);color:var(--ease-color-neutral-900)}.ease-btn-link{background:none;border:none;color:var(--ease-color-primary);padding-left:0;padding-right:0;text-decoration:underline;text-underline-offset:3px}.ease-btn-link:hover{color:var(--ease-color-primary-dark);text-decoration:none}.ease-btn-sm{padding:var(--ease-space-2) var(--ease-space-4);font-size:var(--ease-text-xs);border-radius:var(--ease-radius-sm)}.ease-btn-lg{padding:var(--ease-space-4) var(--ease-space-8);font-size:var(--ease-text-base);border-radius:var(--ease-radius-lg)}.ease-btn-xl{padding:var(--ease-space-5) var(--ease-space-10);font-size:var(--ease-text-lg);border-radius:var(--ease-radius-lg)}.ease-btn-block{width:100%}.ease-btn-pill{border-radius:var(--ease-radius-full)}.ease-btn-icon{padding:var(--ease-space-3);border-radius:var(--ease-radius-md)}.ease-btn:disabled,.ease-btn[disabled],.ease-btn-disabled{opacity:0.5;cursor:not-allowed;pointer-events:none}.ease-btn-loading{pointer-events:none;position:relative}.ease-btn-loading::after{content:'';display:inline-block;width:0.85em;height:0.85em;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;animation:ease-kf-rotate 0.7s linear infinite;margin-left:var(--ease-space-2)}.ease-btn-hover{transition:transform var(--ease-speed-medium) var(--ease-ease-bounce),box-shadow var(--ease-speed-medium) var(--ease-ease),background-color var(--ease-speed-fast) var(--ease-ease),border-color var(--ease-speed-fast) var(--ease-ease)}.ease-btn-hover:hover{transform:translateY(-3px);box-shadow:var(--ease-shadow-lg),var(--ease-glow-primary)}.ease-btn-group{display:inline-flex}.ease-btn-group .ease-btn{border-radius:0}.ease-btn-group .ease-btn:not(:last-child){margin-right:-2px}.ease-btn-group .ease-btn:hover,.ease-btn-group .ease-btn:focus-visible,.ease-btn-group .ease-btn:active{z-index:1}.ease-btn-group .ease-btn-pill:first-child{border-radius:var(--ease-radius-full) 0 0 var(--ease-radius-full)}.ease-btn-group .ease-btn-pill:last-child{border-radius:0 var(--ease-radius-full) var(--ease-radius-full) 0}.ease-btn-group .ease-btn-lg:first-child{border-radius:var(--ease-radius-lg) 0 0 var(--ease-radius-lg)}.ease-btn-group .ease-btn-lg:last-child{border-radius:0 var(--ease-radius-lg) var(--ease-radius-lg) 0}.ease-btn-group .ease-btn-xl:first-child{border-radius:var(--ease-radius-lg) 0 0 var(--ease-radius-lg)}.ease-btn-group .ease-btn-xl:last-child{border-radius:0 var(--ease-radius-lg) var(--ease-radius-lg) 0}.ease-btn-group .ease-btn-sm:first-child{border-radius:var(--ease-radius-sm) 0 0 var(--ease-radius-sm)}.ease-btn-group .ease-btn-sm:last-child{border-radius:0 var(--ease-radius-sm) var(--ease-radius-sm) 0}.ease-btn-group .ease-btn:first-child:not(.ease-btn-pill):not(.ease-btn-lg):not(.ease-btn-xl):not(.ease-btn-sm){border-radius:var(--ease-radius-md) 0 0 var(--ease-radius-md)}.ease-btn-group .ease-btn:last-child:not(.ease-btn-pill):not(.ease-btn-lg):not(.ease-btn-xl):not(.ease-btn-sm){border-radius:0 var(--ease-radius-md) var(--ease-radius-md) 0}@media (prefers-reduced-motion:reduce){.ease-btn,.ease-btn-hover,.ease-btn-loading::after{transition:none !important;animation:none !important}.ease-btn:active,.ease-btn-hover:hover{transform:none !important}}.ease-card{background-color:var(--ease-color-surface);border:1px solid var(--ease-color-neutral-200);border-radius:var(--ease-radius-lg);padding:var(--ease-space-6);overflow:hidden;position:relative}.ease-card-header{padding-bottom:var(--ease-space-4);margin-bottom:var(--ease-space-4);border-bottom:1px solid var(--ease-color-neutral-100)}.ease-card-body{flex:1}.ease-card-footer{padding-top:var(--ease-space-4);margin-top:var(--ease-space-4);border-top:1px solid var(--ease-color-neutral-100);display:flex;align-items:center;gap:var(--ease-space-3)}.ease-card-title{font-size:var(--ease-text-2xl);font-weight:700;color:var(--ease-color-neutral-900);margin-bottom:var(--ease-space-1);line-height:var(--ease-leading-tight)}.ease-card-subtitle{font-size:var(--ease-text-sm);color:var(--ease-color-muted);font-weight:400}.ease-card-body p:last-child{margin-bottom:0}.ease-card-shadow{box-shadow:var(--ease-shadow-lg);border-color:transparent}.ease-card-hover{cursor:pointer;transition:transform var(--ease-speed-medium) var(--ease-ease),box-shadow var(--ease-speed-medium) var(--ease-ease),border-color var(--ease-speed-medium) var(--ease-ease);will-change:transform,box-shadow}.ease-card-hover:hover{transform:translateY(-6px);box-shadow:var(--ease-shadow-xl);border-color:var(--ease-color-primary-light)}.ease-card-glow{transition:box-shadow var(--ease-speed-medium) var(--ease-ease),border-color var(--ease-speed-medium) var(--ease-ease)}.ease-card-glow:hover{box-shadow:var(--ease-glow-primary),var(--ease-shadow-lg);border-color:var(--ease-color-primary-light)}.ease-card-flat{border-color:transparent;background-color:var(--ease-color-neutral-100)}.ease-card-outlined{background-color:transparent;border:2px solid var(--ease-color-neutral-200)}.ease-card-glass{background:rgba(255,255,255,0.12);border:1px solid rgba(255,255,255,0.2);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);color:#ffffff}.ease-card-accent{border-left:4px solid var(--ease-color-primary)}.ease-card-accent-success{border-left:4px solid var(--ease-color-success)}.ease-card-accent-danger{border-left:4px solid var(--ease-color-danger)}.ease-card-accent-warning{border-left:4px solid var(--ease-color-warning)}.ease-card-image{padding:0}.ease-card-image .ease-card-img{width:100%;height:200px;object-fit:cover;display:block;border-radius:var(--ease-radius-lg) var(--ease-radius-lg) 0 0}.ease-card-image .ease-card-body{padding:var(--ease-space-6)}.ease-card-compact{padding:var(--ease-space-4)}.ease-card-horizontal{display:flex;flex-direction:row;gap:var(--ease-space-4);align-items:flex-start;padding:var(--ease-space-4)}.ease-card-info{background-color:rgba(108,99,255,0.06);border-color:var(--ease-color-primary-light);color:var(--ease-color-primary-dark)}.ease-card-success-bg{background-color:rgba(34,197,94,0.06);border-color:var(--ease-color-success-light)}.ease-card-danger-bg{background-color:rgba(239,68,68,0.06);border-color:var(--ease-color-danger-light)}.ease-card-stat{text-align:center;padding:var(--ease-space-8)}.ease-card-stat .ease-stat-value{font-size:var(--ease-text-4xl);font-weight:700;color:var(--ease-color-primary);line-height:1;margin-bottom:var(--ease-space-2)}.ease-card-stat .ease-stat-label{font-size:var(--ease-text-sm);color:var(--ease-color-muted);font-weight:500;text-transform:uppercase;letter-spacing:0.08em} diff --git a/examples/demo.html b/examples/demo.html index 3df4b4ed..2848903e 100644 --- a/examples/demo.html +++ b/examples/demo.html @@ -323,11 +323,36 @@

Buttons

// Pill · Disabled · Loading
-
+
+ + +
// Button Groups (Pill, Small, Default, Large)
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
diff --git a/submissions/examples/parallax-tilt-effect/demo.html b/submissions/examples/parallax-tilt-effect/demo.html deleted file mode 100644 index 49a00038..00000000 --- a/submissions/examples/parallax-tilt-effect/demo.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Parallax Tilt Effect — EaseMotion CSS - - - - - - - - - - - -
- - -
- EaseMotion CSS — Animation -

- Parallax
Tilt Effect -

-

- A pure CSS 3D depth interaction. Hover over any corner of a card - to see perspective, rotation, and layered translateZ in action — - no JavaScript, no libraries. -

-
- - -
- - -
-
- - - - - - - - -
- - - - -
- - -
-
-
- Design System -
- - -
- -
- PRJ — 001 - Live -
- -

Forma UI Kit

-

- A component system built for scale — tokens, patterns, - and documentation in one place. -

- -
- -
- Figma - Tokens - A11y -
- -
-
- 340+ - Components -
-
- 12 - Themes -
-
- 98 - Audit Score -
-
- - - -
-
-
-
-
- - - -
-
- - - - - - -
- - -
- -
-
-
- Open Source -
- -
- -
- PRJ — 002 - Active -
- -

Lattice DB

-

- A zero-dependency graph database written in Rust, - optimised for edge environments. -

- -
- -
- Rust - Graph - Edge -
- -
-
- 4.2k - Stars -
-
- 89 - Forks -
-
- v0.9 - Release -
-
- - - -
-
-
-
-
- -
- - -

Hover over a card corner to tilt

- -
- - - Parallax Tilt Effect - EaseMotion - - - - -
- -
-
-
-
-
-
-
-
-
- -
- Tilt Me -
- -
- - - \ No newline at end of file diff --git a/submissions/examples/parallax-tilt-effect/style.css b/submissions/examples/parallax-tilt-effect/style.css deleted file mode 100644 index 0098fc36..00000000 --- a/submissions/examples/parallax-tilt-effect/style.css +++ /dev/null @@ -1,780 +0,0 @@ -/* - * EaseMotion CSS — Parallax Tilt Effect - * Submission by: open-source contributor - * - * A pure CSS 3D tilt interaction for portfolio and project cards. - * Uses CSS perspective, transform-style, and :hover to simulate - * depth without a single line of JavaScript. - * - * Organization: - * 1. Custom Properties (design tokens) - * 2. Reset & Base - * 3. Demo Layout - * 4. Card Shell & Perspective Rig - * 5. Card Face Layers - * 6. Inner Content Zones - * 7. Tilt Animation (the magic) - * 8. Shimmer Overlay - * 9. Responsive Adjustments - */ - -/* ───────────────────────────────────────── - 1. Custom Properties - ───────────────────────────────────────── */ -:root { - /* Palette */ - --color-bg: #0d0f14; - --color-surface: #13161e; - --color-surface-mid: #1a1e2a; - --color-border: rgba(255, 255, 255, 0.07); - --color-border-glow: rgba(194, 154, 84, 0.35); - --color-accent: #c29a54; - --color-accent-light: #e0bc7a; - --color-text-primary: #eceae4; - --color-text-muted: #7d7e88; - --color-text-dim: #4a4b55; - --color-tag-bg: rgba(194, 154, 84, 0.12); - - /* Typography */ - --font-display: 'Cormorant Garamond', 'Palatino Linotype', Georgia, serif; - --font-body: 'DM Sans', 'Helvetica Neue', Helvetica, sans-serif; - --font-mono: 'JetBrains Mono', 'Fira Code', monospace; - - /* Elevation / Shadows */ - --shadow-card: 0 8px 32px rgba(0, 0, 0, 0.55), 0 2px 8px rgba(0, 0, 0, 0.4); - --shadow-hover: 0 28px 64px rgba(0, 0, 0, 0.7), 0 8px 24px rgba(0, 0, 0, 0.5); - --shadow-glow: 0 0 40px rgba(194, 154, 84, 0.15); - - /* Spacing */ - --space-xs: 0.375rem; - --space-sm: 0.75rem; - --space-md: 1.25rem; - --space-lg: 2rem; - --space-xl: 3rem; - - /* Radii */ - --radius-card: 16px; - --radius-tag: 4px; - - /* Transition timing */ - --ease-tilt: cubic-bezier(0.22, 1, 0.36, 1); - --ease-surface: cubic-bezier(0.4, 0, 0.2, 1); - --duration-tilt: 0.5s; -} - - -/* ───────────────────────────────────────── - 2. Reset & Base - ───────────────────────────────────────── */ -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -html { - font-size: 16px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; -} - -body { - background-color: var(--color-bg); - color: var(--color-text-primary); - font-family: var(--font-body); - line-height: 1.6; - min-height: 100vh; -} - -img { - display: block; - max-width: 100%; -} - - -/* ───────────────────────────────────────── - 3. Demo Layout - ───────────────────────────────────────── */ -.em-demo-section { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - min-height: 100vh; - padding: var(--space-xl) var(--space-lg); - /* Subtle grid texture for depth */ - background-image: - linear-gradient(rgba(255,255,255,0.018) 1px, transparent 1px), - linear-gradient(90deg, rgba(255,255,255,0.018) 1px, transparent 1px); - background-size: 48px 48px; -} - -.em-demo-header { - text-align: center; - margin-bottom: var(--space-xl); - max-width: 520px; -} - -/* Small eyebrow label */ -.em-demo-label { - display: inline-block; - font-family: var(--font-mono); - font-size: 0.7rem; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--color-accent); - background: var(--color-tag-bg); - border: 1px solid var(--color-border-glow); - border-radius: var(--radius-tag); - padding: var(--space-xs) var(--space-sm); - margin-bottom: var(--space-md); -} - -.em-demo-title { - font-family: var(--font-display); - font-size: clamp(2rem, 5vw, 3.25rem); - font-weight: 400; - font-style: italic; - letter-spacing: -0.01em; - line-height: 1.15; - color: var(--color-text-primary); - margin-bottom: var(--space-sm); -} - -.em-demo-title span { - color: var(--color-accent); - font-style: normal; -} - -.em-demo-description { - font-size: 0.9rem; - color: var(--color-text-muted); - line-height: 1.75; - max-width: 400px; - margin: 0 auto; -} - -/* Card row — allows multiple cards side by side */ -.em-demo-stage { - display: flex; - flex-wrap: wrap; - gap: var(--space-lg); - justify-content: center; - align-items: center; -} - -/* Instruction hint below */ -.em-demo-hint { - margin-top: var(--space-lg); - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--color-text-dim); -} - -.em-demo-hint::before { - content: '↑ '; -} - - -/* ───────────────────────────────────────── - 4. Card Shell & Perspective Rig - ───────────────────────────────────────── */ - -/* - * .em-tilt-wrapper establishes the 3D perspective context. - * Keeping perspective on the parent (not the card itself) means - * the vanishing point stays anchored as the card rotates — - * which is what creates the convincing depth illusion. - */ -.em-tilt-wrapper { - perspective: 900px; - perspective-origin: center center; - /* Constrain card size */ - width: 320px; -} - -/* - * .em-tilt-card is the element that actually transforms. - * transform-style: preserve-3d lets child layers float at - * different Z depths for the layered parallax feel. - */ -.em-tilt-card { - position: relative; - width: 100%; - background: var(--color-surface); - border-radius: var(--radius-card); - border: 1px solid var(--color-border); - box-shadow: var(--shadow-card); - overflow: hidden; - cursor: default; - - transform-style: preserve-3d; - transform: rotateX(0deg) rotateY(0deg); - - /* Smooth return to resting state */ - transition: - transform var(--duration-tilt) var(--ease-tilt), - box-shadow var(--duration-tilt) var(--ease-tilt), - border-color 0.3s var(--ease-surface); - - will-change: transform; -} - -/* Four directional tilt quadrants — pure CSS hover regions */ - -/* - * Strategy: we overlap four invisible quadrant triggers inside - * .em-tilt-card. Each quadrant covers a corner region and - * applies the corresponding rotateX / rotateY combination - * on the card when hovered. - * - * This gives 4 distinct tilt positions — top-left, top-right, - * bottom-left, bottom-right — which covers the most common - * parallax tilt reading for a single-card layout. - */ -.em-tilt-quadrant { - position: absolute; - width: 50%; - height: 50%; - z-index: 10; - /* debug: uncomment border to see quadrants */ - /* border: 1px dashed red; */ -} - -.em-tilt-quadrant--tl { top: 0; left: 0; } -.em-tilt-quadrant--tr { top: 0; right: 0; } -.em-tilt-quadrant--bl { bottom: 0; left: 0; } -.em-tilt-quadrant--br { bottom: 0; right: 0; } - -/* Top-left hover → tilt up and to the left */ -.em-tilt-quadrant--tl:hover ~ .em-tilt-transform { - transform: rotateX(10deg) rotateY(-10deg) translateZ(8px); -} - -/* Top-right hover → tilt up and to the right */ -.em-tilt-quadrant--tr:hover ~ .em-tilt-transform { - transform: rotateX(10deg) rotateY(10deg) translateZ(8px); -} - -/* Bottom-left hover → tilt down and to the left */ -.em-tilt-quadrant--bl:hover ~ .em-tilt-transform { - transform: rotateX(-10deg) rotateY(-10deg) translateZ(8px); -} - -/* Bottom-right hover → tilt down and to the right */ -.em-tilt-quadrant--br:hover ~ .em-tilt-transform { - transform: rotateX(-10deg) rotateY(10deg) translateZ(8px); -} - -/* - * .em-tilt-transform wraps all visible content. - * It's a sibling of the quadrant triggers so the - * adjacent-sibling CSS trick works above. - */ -.em-tilt-transform { - position: relative; - width: 100%; - transform-style: preserve-3d; - transform: rotateX(0deg) rotateY(0deg) translateZ(0px); - transition: - transform var(--duration-tilt) var(--ease-tilt), - box-shadow var(--duration-tilt) var(--ease-tilt); -} - -/* Elevate shadow on any quadrant hover */ -.em-tilt-quadrant--tl:hover ~ .em-tilt-transform, -.em-tilt-quadrant--tr:hover ~ .em-tilt-transform, -.em-tilt-quadrant--bl:hover ~ .em-tilt-transform, -.em-tilt-quadrant--br:hover ~ .em-tilt-transform { - box-shadow: var(--shadow-hover), var(--shadow-glow); -} - - -/* ───────────────────────────────────────── - 5. Card Image Band - ───────────────────────────────────────── */ -.em-card-image { - position: relative; - width: 100%; - height: 180px; - overflow: hidden; - background: var(--color-surface-mid); - /* Pushes the image band slightly forward in Z */ - transform: translateZ(6px); -} - -/* Decorative gradient fill — simulates a project screenshot */ -.em-card-image-fill { - width: 100%; - height: 100%; - background: - linear-gradient(135deg, - #1c2030 0%, - #222840 30%, - #1a2035 60%, - #111520 100%); -} - -/* Abstract geometric shapes as placeholder artwork */ -.em-card-image-fill::before, -.em-card-image-fill::after { - content: ''; - position: absolute; - border-radius: 50%; -} - -.em-card-image-fill::before { - width: 180px; - height: 180px; - background: radial-gradient(circle, rgba(194,154,84,0.18) 0%, transparent 70%); - top: -40px; - right: -20px; -} - -.em-card-image-fill::after { - width: 120px; - height: 120px; - background: radial-gradient(circle, rgba(100,120,200,0.12) 0%, transparent 70%); - bottom: 10px; - left: 20px; -} - -/* The thin accent line at bottom of image */ -.em-card-image-rule { - position: absolute; - bottom: 0; - left: 0; - right: 0; - height: 2px; - background: linear-gradient( - 90deg, - transparent, - var(--color-accent) 30%, - var(--color-accent-light) 50%, - var(--color-accent) 70%, - transparent - ); - opacity: 0.6; -} - -/* Badge / category chip floating on image */ -.em-card-badge { - position: absolute; - top: var(--space-md); - left: var(--space-md); - font-family: var(--font-mono); - font-size: 0.65rem; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--color-accent-light); - background: rgba(0, 0, 0, 0.55); - border: 1px solid rgba(194, 154, 84, 0.3); - border-radius: var(--radius-tag); - padding: 3px 8px; - backdrop-filter: blur(6px); - /* Badge floats slightly above the image surface */ - transform: translateZ(12px); -} - - -/* ───────────────────────────────────────── - 6. Card Body & Content Zones - ───────────────────────────────────────── */ -.em-card-body { - padding: var(--space-md) var(--space-md) var(--space-lg); - /* Elevate text content in Z so it reads as "in front" of card surface */ - transform: translateZ(10px); -} - -/* Meta row: number + status */ -.em-card-meta { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: var(--space-sm); -} - -.em-card-number { - font-family: var(--font-mono); - font-size: 0.65rem; - color: var(--color-text-dim); - letter-spacing: 0.1em; -} - -.em-card-status { - display: flex; - align-items: center; - gap: 5px; - font-family: var(--font-mono); - font-size: 0.62rem; - letter-spacing: 0.1em; - text-transform: uppercase; - color: #5bc87a; -} - -.em-card-status::before { - content: ''; - display: block; - width: 6px; - height: 6px; - border-radius: 50%; - background: #5bc87a; - box-shadow: 0 0 6px #5bc87a; -} - -/* Project title */ -.em-card-title { - font-family: var(--font-display); - font-size: 1.45rem; - font-weight: 600; - line-height: 1.25; - color: var(--color-text-primary); - margin-bottom: var(--space-xs); - letter-spacing: -0.01em; -} - -/* One-liner subtitle */ -.em-card-subtitle { - font-size: 0.8rem; - color: var(--color-text-muted); - margin-bottom: var(--space-md); - line-height: 1.6; -} - -/* Divider */ -.em-card-divider { - height: 1px; - background: var(--color-border); - margin-bottom: var(--space-md); -} - -/* Tech stack tags */ -.em-card-tags { - display: flex; - flex-wrap: wrap; - gap: var(--space-xs); - margin-bottom: var(--space-md); -} - -.em-card-tag { - font-family: var(--font-mono); - font-size: 0.65rem; - letter-spacing: 0.08em; - text-transform: uppercase; - color: var(--color-accent); - background: var(--color-tag-bg); - border: 1px solid rgba(194, 154, 84, 0.2); - border-radius: var(--radius-tag); - padding: 3px 8px; -} - -/* Stat row */ -.em-card-stats { - display: flex; - gap: var(--space-md); -} - -.em-card-stat { - display: flex; - flex-direction: column; - gap: 2px; -} - -.em-card-stat-value { - font-family: var(--font-display); - font-size: 1.1rem; - font-weight: 600; - color: var(--color-text-primary); - line-height: 1; -} - -.em-card-stat-label { - font-family: var(--font-mono); - font-size: 0.6rem; - letter-spacing: 0.1em; - text-transform: uppercase; - color: var(--color-text-dim); -} - -/* Footer / CTA row */ -.em-card-footer { - display: flex; - justify-content: space-between; - align-items: center; - margin-top: var(--space-md); - padding-top: var(--space-md); - border-top: 1px solid var(--color-border); -} - -/* Avatar cluster */ -.em-card-avatars { - display: flex; -} - -.em-card-avatar { - width: 26px; - height: 26px; - border-radius: 50%; - border: 2px solid var(--color-surface); - background: var(--color-surface-mid); - margin-right: -8px; - display: flex; - align-items: center; - justify-content: center; - font-size: 0.55rem; - font-family: var(--font-mono); - color: var(--color-text-muted); - letter-spacing: 0; - text-transform: uppercase; -} - -.em-card-avatar:nth-child(1) { background: #2a2040; color: #a090d0; } -.em-card-avatar:nth-child(2) { background: #1e2a20; color: #70a880; } -.em-card-avatar:nth-child(3) { background: #2a1e1a; color: #c08878; } - -/* "View →" link style */ -.em-card-link { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--color-accent); - text-decoration: none; - display: flex; - align-items: center; - gap: 6px; - transition: gap 0.2s var(--ease-surface), color 0.2s; -} - -.em-card-link::after { - content: '→'; -} - -.em-card-link:hover { - color: var(--color-accent-light); - gap: 10px; -} - - -/* ───────────────────────────────────────── - 7. Border Glow on Hover - ───────────────────────────────────────── */ - -/* - * When any quadrant is hovered, the card border picks up - * a warm amber glow to reinforce the "active" state. - */ -.em-tilt-quadrant--tl:hover ~ .em-tilt-transform .em-tilt-card-inner, -.em-tilt-quadrant--tr:hover ~ .em-tilt-transform .em-tilt-card-inner, -.em-tilt-quadrant--bl:hover ~ .em-tilt-transform .em-tilt-card-inner, -.em-tilt-quadrant--br:hover ~ .em-tilt-transform .em-tilt-card-inner { - border-color: var(--color-border-glow); -} - -.em-tilt-card-inner { - border: 1px solid var(--color-border); - border-radius: var(--radius-card); - overflow: hidden; - transition: border-color 0.35s var(--ease-surface); -} - - -/* ───────────────────────────────────────── - 8. Shimmer Overlay - ───────────────────────────────────────── */ - -/* - * A subtle moving highlight that simulates a light source - * catching the surface — adds the "sheen" that makes - * physical tilt feel real. - * - * Uses a pseudo-element with a radial gradient that - * transitions opacity on hover per quadrant. - */ -.em-tilt-shimmer { - position: absolute; - inset: 0; - border-radius: var(--radius-card); - pointer-events: none; - z-index: 5; - opacity: 0; - transition: opacity 0.4s var(--ease-surface); -} - -/* Shimmer for top-left → light source top-left */ -.em-tilt-quadrant--tl:hover ~ .em-tilt-transform .em-tilt-shimmer { - background: radial-gradient( - ellipse at 20% 20%, - rgba(255,255,255,0.07) 0%, - transparent 65% - ); - opacity: 1; -} - -/* Shimmer for top-right → light source top-right */ -.em-tilt-quadrant--tr:hover ~ .em-tilt-transform .em-tilt-shimmer { - background: radial-gradient( - ellipse at 80% 20%, - rgba(255,255,255,0.07) 0%, - transparent 65% - ); - opacity: 1; -} - -/* Shimmer for bottom-left → light source bottom-left */ -.em-tilt-quadrant--bl:hover ~ .em-tilt-transform .em-tilt-shimmer { - background: radial-gradient( - ellipse at 20% 80%, - rgba(255,255,255,0.06) 0%, - transparent 65% - ); - opacity: 1; -} - -/* Shimmer for bottom-right → light source bottom-right */ -.em-tilt-quadrant--br:hover ~ .em-tilt-transform .em-tilt-shimmer { - background: radial-gradient( - ellipse at 80% 80%, - rgba(255,255,255,0.06) 0%, - transparent 65% - ); - opacity: 1; -} - - -/* ───────────────────────────────────────── - 9. Responsive Adjustments - ───────────────────────────────────────── */ - -/* Tablet: reduce tilt intensity slightly */ -@media (max-width: 768px) { - .em-tilt-wrapper { - width: 290px; - } - - .em-demo-section { - padding: var(--space-xl) var(--space-md); - } - - /* Slightly reduce rotation on smaller screens */ - .em-tilt-quadrant--tl:hover ~ .em-tilt-transform, - .em-tilt-quadrant--tr:hover ~ .em-tilt-transform, - .em-tilt-quadrant--bl:hover ~ .em-tilt-transform, - .em-tilt-quadrant--br:hover ~ .em-tilt-transform { - transform: rotateX(6deg) rotateY(6deg) translateZ(6px); - } - - /* Correct individual directions at reduced magnitude */ - .em-tilt-quadrant--tl:hover ~ .em-tilt-transform { - transform: rotateX(6deg) rotateY(-6deg) translateZ(6px); - } - .em-tilt-quadrant--br:hover ~ .em-tilt-transform { - transform: rotateX(-6deg) rotateY(6deg) translateZ(6px); - } - .em-tilt-quadrant--bl:hover ~ .em-tilt-transform { - transform: rotateX(-6deg) rotateY(-6deg) translateZ(6px); - } -} - -/* Mobile: disable tilt, keep clean layout */ -@media (max-width: 480px) { - .em-tilt-wrapper { - width: 100%; - max-width: 340px; - } - - /* On touch devices, hover doesn't behave well — keep card flat */ - .em-tilt-card { - perspective: none; - transform: none !important; - } - - .em-tilt-quadrant { - display: none; - } - - .em-tilt-transform { - transform: none !important; - } - - .em-demo-hint { - display: none; - } -/* Basic page setup for the demo */ -body { - margin: 0; - min-height: 100vh; - display: flex; - align-items: center; - justify-content: center; - background-color: #1e1e2f; - font-family: system-ui, -apple-system, sans-serif; -} - -/* 1. The Container sets the 3D perspective */ -.em-tilt-container { - position: relative; - width: 300px; - height: 400px; - perspective: 1000px; /* Gives the tilt a realistic 3D depth */ -} - -/* 2. The Invisible Tracking Zones */ -.tilt-zone { - position: absolute; - width: 33.33%; - height: 33.33%; - z-index: 10; /* Forces zones to sit on top of the card */ -} - -/* Positioning the 9 zones */ -.top-left { top: 0; left: 0; } -.top-mid { top: 0; left: 33.33%; } -.top-right { top: 0; right: 0; } -.mid-left { top: 33.33%; left: 0; } -.center { top: 33.33%; left: 33.33%; } -.mid-right { top: 33.33%; right: 0; } -.bot-left { bottom: 0; left: 0; } -.bot-mid { bottom: 0; left: 33.33%; } -.bot-right { bottom: 0; right: 0; } - -/* 3. The Visual Card */ -.em-tilt-card { - position: absolute; - inset: 0; /* Fills the container perfectly */ - background: linear-gradient(135deg, #f43f5e, #f97316); - border-radius: 16px; - display: flex; - align-items: center; - justify-content: center; - color: white; - font-size: 1.5rem; - font-weight: bold; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); - /* Smooth transition for the tilt */ - transition: transform 0.4s cubic-bezier(0.25, 1, 0.5, 1), box-shadow 0.4s ease; - transform-style: preserve-3d; -} - -/* 4. The Magic: Sibling Selectors mapping hover to 3D rotation */ -.top-left:hover ~ .em-tilt-card { transform: rotateX(15deg) rotateY(-15deg) scale3d(1.02, 1.02, 1.02); } -.top-mid:hover ~ .em-tilt-card { transform: rotateX(15deg) rotateY(0) scale3d(1.02, 1.02, 1.02); } -.top-right:hover ~ .em-tilt-card { transform: rotateX(15deg) rotateY(15deg) scale3d(1.02, 1.02, 1.02); } - -.mid-left:hover ~ .em-tilt-card { transform: rotateX(0) rotateY(-15deg) scale3d(1.02, 1.02, 1.02); } -.center:hover ~ .em-tilt-card { transform: rotateX(0) rotateY(0) scale3d(1.05, 1.05, 1.05); } -.mid-right:hover ~ .em-tilt-card { transform: rotateX(0) rotateY(15deg) scale3d(1.02, 1.02, 1.02); } - -.bot-left:hover ~ .em-tilt-card { transform: rotateX(-15deg) rotateY(-15deg) scale3d(1.02, 1.02, 1.02); } -.bot-mid:hover ~ .em-tilt-card { transform: rotateX(-15deg) rotateY(0) scale3d(1.02, 1.02, 1.02); } -.bot-right:hover ~ .em-tilt-card { transform: rotateX(-15deg) rotateY(15deg) scale3d(1.02, 1.02, 1.02); } - -/* Enhance shadow on general container hover */ -.em-tilt-container:hover .em-tilt-card { - box-shadow: 0 20px 40px rgba(249, 115, 22, 0.4); -} \ No newline at end of file diff --git a/submissions/examples/toast-notification/README.md b/submissions/examples/toast-notification/README.md deleted file mode 100644 index a32a3362..00000000 --- a/submissions/examples/toast-notification/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Toast Notification Component - -### What does this do? -This submission adds a stackable, auto-dismissing toast notification component (`.ease-toast`) that slides in from the screen edge and collapses vertically upon exit. - ---- - -### How is it used? - -Place `.ease-toast` elements inside a fixed `.ease-toast-container` wrapper (usually positioned top-right or bottom-right): - -```html -
- -
- Database sync complete! -
-
-``` - -#### Theme Modifiers -- **Success Accent**: `.ease-toast-success` -- **Danger Accent**: `.ease-toast-danger` -- **Warning Accent**: `.ease-toast-warning` -- **Info Accent**: `.ease-toast-info` - -#### Custom CSS Variables Configuration -You can customize the toast appearance dynamically: - -```css -.my-custom-toast { - --toast-bg: #090c14; - --toast-color: #f8fafc; - --toast-accent: #a855f7; /* Custom purple accent border */ -} -``` - ---- - -### Why does it fit EaseMotion CSS? - -A dynamic toast notification is a key UI pattern missing from the components library. - -This implementation provides both the entry slide-in transition and the auto-dismiss exit collapse sequence in **pure CSS** (using a delayed exit animation with `animation-fill-mode: forwards`). It requires zero JavaScript runtime for animation logic, supporting EaseMotion's philosophy of highly performant, lightweight, and human-readable styling. diff --git a/submissions/examples/toast-notification/demo.html b/submissions/examples/toast-notification/demo.html deleted file mode 100644 index 239b3b14..00000000 --- a/submissions/examples/toast-notification/demo.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - Toast Notification Component Demo — EaseMotion CSS - - - - - - - - - - - - - - - - - - - - -
- -
- - -
-
-

Toast Notification

-

- A premium, slide-in toast component supporting themed color accents, stacking spacing, and pure CSS auto-dismiss animations. -

-
-
- - -
- - -
-

1. Standard Variants

-

- Click the buttons below to spawn styled alerts. They will slide in from the top-right corner and auto-dismiss after 3 seconds. -

- -
- - - - - - - -
-
- - -
-

2. Customizer & Stacking Simulator

-

- Trigger multiple toasts to verify vertical stacking. When a toast is dismissed, the lower items slide up automatically. -

- - - -
-
- - -
-
- -
- - -
-
-
-
- -
- - -
-

3. Javascript Integration Guide

-

- To manage mounting and cleanup of toasts in standard web applications, developers can use a simple helper like the one below: -

- -
-function showToast(message, type = 'info') {
-  // Find or create container
-  let container = document.querySelector('.ease-toast-container');
-  if (!container) {
-    container = document.createElement('div');
-    container.className = 'ease-toast-container';
-    document.body.appendChild(container);
-  }
-
-  // Create toast element
-  const toast = document.createElement('div');
-  toast.className = `ease-toast ease-toast-${type}`;
-  toast.innerHTML = `<span>\${message}</span>`;
-
-  // Mount
-  container.appendChild(toast);
-
-  // Auto-remove element from DOM after the exit animation completes (3.7s)
-  setTimeout(() => {
-    toast.remove();
-  }, 3700);
-}
-
- -
- - - - - - diff --git a/submissions/examples/toast-notification/style.css b/submissions/examples/toast-notification/style.css deleted file mode 100644 index 6dfb39cd..00000000 --- a/submissions/examples/toast-notification/style.css +++ /dev/null @@ -1,222 +0,0 @@ -/* ============================================================ - EaseMotion CSS — Toast Notification Component - Sliding, auto-dismissing, stackable notifications - ============================================================ */ - -/* ── 1. Core Toast Styles ──────────────────────────────────── */ - -/* Stacking Container */ -.ease-toast-container { - position: fixed; - top: var(--ease-space-6, 24px); - right: var(--ease-space-6, 24px); - display: flex; - flex-direction: column; - gap: var(--ease-space-3, 12px); - z-index: 9999; - pointer-events: none; /* Let clicks pass through empty spaces */ - box-sizing: border-box; -} - -/* Individual Toast Box */ -.ease-toast { - pointer-events: auto; /* Re-enable pointer events for interactions */ - background-color: var(--toast-bg, #1e293b); - color: var(--toast-color, #f8fafc); - border-left: 4px solid var(--toast-accent, var(--ease-color-primary, #6366f1)); - border-radius: var(--ease-radius-md, 6px); - padding: var(--ease-space-4, 16px) var(--ease-space-5, 20px); - box-shadow: var(--ease-shadow-lg); - - display: flex; - align-items: center; - gap: var(--ease-space-3, 12px); - - min-width: 300px; - max-width: 400px; - box-sizing: border-box; - - /* Make sure max-height accommodates the content during slide in */ - max-height: 120px; - overflow: hidden; - - /* Run slide-in, delay, then dismiss */ - animation: - ease-toast-slide-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards, - ease-toast-dismiss 0.4s cubic-bezier(0.16, 1, 0.3, 1) 3.3s forwards; -} - -/* ── 2. Keyframes ───────────────────────────────────────────── */ - -/* Slide-in from right margin */ -@keyframes ease-toast-slide-in { - from { - transform: translateX(120%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } -} - -/* Slide-out with vertical height collapse to allow smooth stacking shifts */ -@keyframes ease-toast-dismiss { - 0% { - transform: translateX(0); - opacity: 1; - max-height: 120px; - padding-top: var(--ease-space-4, 16px); - padding-bottom: var(--ease-space-4, 16px); - margin-bottom: 0; - } - 90% { - transform: translateX(120%); - opacity: 0; - max-height: 120px; - padding-top: var(--ease-space-4, 16px); - padding-bottom: var(--ease-space-4, 16px); - margin-bottom: 0; - } - 100% { - transform: translateX(120%); - opacity: 0; - max-height: 0; - padding-top: 0; - padding-bottom: 0; - margin-top: 0; - margin-bottom: -12px; /* Pulls up adjacent elements to offset container gap */ - border: 0; - } -} - -/* ── 3. Theme Variants ──────────────────────────────────────── */ - -.ease-toast-success { - --toast-accent: var(--ease-color-success, #22c55e); -} - -.ease-toast-danger { - --toast-accent: var(--ease-color-danger, #ef4444); -} - -.ease-toast-warning { - --toast-accent: var(--ease-color-warning, #f59e0b); -} - -.ease-toast-info { - --toast-accent: var(--ease-color-primary, #6366f1); -} - -/* ── 4. Accessibility (Reduced Motion) ─────────────────────── */ - -@media (prefers-reduced-motion: reduce) { - .ease-toast { - transform: none !important; - animation: - ease-toast-fade-in 0.3s ease forwards, - ease-toast-fade-out 0.4s ease 3.3s forwards; - } -} - -@keyframes ease-toast-fade-in { - from { opacity: 0; } - to { opacity: 1; } -} - -@keyframes ease-toast-fade-out { - 0% { - opacity: 1; - max-height: 120px; - padding-top: var(--ease-space-4, 16px); - padding-bottom: var(--ease-space-4, 16px); - margin-bottom: 0; - } - 90% { - opacity: 0; - max-height: 120px; - padding-top: var(--ease-space-4, 16px); - padding-bottom: var(--ease-space-4, 16px); - margin-bottom: 0; - } - 100% { - opacity: 0; - max-height: 0; - padding-top: 0; - padding-bottom: 0; - margin-top: 0; - margin-bottom: -12px; - border: 0; - } -} - -/* ── 5. Demo Page Styles (Self-contained) ──────────────────── */ - -:root { - --color-bg: #0b0f19; - --color-card: #151d30; - --color-border: #273552; - --text-primary: #f8fafc; - --text-secondary: #94a3b8; -} - -body { - background-color: var(--color-bg); - color: var(--text-primary); - font-family: 'Inter', sans-serif; - margin: 0; - min-height: 100vh; -} - -.showcase-card { - background: var(--color-card); - border: 1px solid var(--color-border); - border-radius: var(--ease-radius-lg); - padding: var(--ease-space-6); - box-sizing: border-box; -} - -.code-preview-box { - background: #07090f; - border: 1px solid var(--color-border); - padding: var(--ease-space-4); - border-radius: var(--ease-radius-md); - font-family: 'JetBrains Mono', monospace; - font-size: var(--ease-text-xs); - color: #a78bfa; - margin: 0; - overflow-x: auto; -} - -.customizer-form { - display: flex; - flex-direction: column; - gap: var(--ease-space-4); -} - -.form-group { - display: flex; - flex-direction: column; - gap: var(--ease-space-1); -} - -.form-label { - font-size: var(--ease-text-xs); - font-weight: 600; - color: var(--text-secondary); -} - -.text-input { - background: #090c14; - border: 1px solid var(--color-border); - border-radius: var(--ease-radius-md); - padding: var(--ease-space-3); - color: var(--text-primary); - font-family: inherit; - font-size: var(--ease-text-sm); -} - -.text-input:focus { - outline: 2px solid var(--ease-color-primary); - border-color: transparent; -}