espace-paie-odentas/app/signin/signin.module.css

454 lines
13 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Subtle animated mesh gradient background for the Sign In page */
.meshRoot {
position: relative;
min-height: 100vh;
isolation: isolate; /* ensure backdrop filters work predictably */
}
.meshBg {
position: fixed;
inset: 0;
z-index: 0; /* keep behind content but above the page background */
overflow: hidden;
background: transparent; /* legacy; not used when simpleBg is present */
--tile: 26px; /* base tile size for the tiny pattern */
}
/* Simple, fixed, light multi-color gradient background */
.simpleBg {
position: fixed;
inset: 0;
z-index: 0;
background:
radial-gradient(60% 55% at 50% 35%, rgba(255,255,255,0.7), rgba(255,255,255,0)),
linear-gradient(135deg, #fff7ed 0%, #fde68a 28%, #bfdbfe 65%, #e9d5ff 100%);
}
/* floating blobs (screen blend + blur) to create an organic mesh */
.blob {
position: absolute;
border-radius: 50%;
filter: blur(64px);
opacity: 0.85;
mix-blend-mode: screen;
will-change: transform;
}
/* Prefer plus-lighter when available for a cleaner blend */
@supports (mix-blend-mode: plus-lighter) {
.blob, .shape, .dots, .grid, .aurora, .sunset, .ridges { mix-blend-mode: plus-lighter; }
}
.b1 {
width: 640px;
height: 640px;
left: -10%;
top: -12%;
background: radial-gradient(circle at 50% 50%, rgba(99, 102, 241, 0.9) 0%, rgba(99, 102, 241, 0) 65%);
animation: drift1 28s ease-in-out infinite alternate;
}
.b2 {
width: 520px;
height: 520px;
right: -8%;
top: 40%;
background: radial-gradient(circle at 50% 50%, rgba(56, 189, 248, 0.75) 0%, rgba(56, 189, 248, 0) 65%);
animation: drift2 32s ease-in-out infinite alternate;
}
.b3 {
width: 560px;
height: 560px;
left: 35%;
bottom: -16%;
background: radial-gradient(circle at 50% 50%, rgba(45, 212, 191, 0.7) 0%, rgba(45, 212, 191, 0) 65%);
animation: drift3 34s ease-in-out infinite alternate;
}
/* Extra blobs for a richer mesh */
.b4 {
width: 460px;
height: 460px;
left: 60%;
top: -8%;
background: radial-gradient(circle at 50% 50%, rgba(147, 51, 234, 0.5) 0%, rgba(147, 51, 234, 0) 60%);
animation: drift4 36s ease-in-out infinite alternate;
}
.b5 {
width: 480px;
height: 480px;
left: -12%;
bottom: 10%;
background: radial-gradient(circle at 50% 50%, rgba(59, 130, 246, 0.55) 0%, rgba(59, 130, 246, 0) 60%);
animation: drift5 38s ease-in-out infinite alternate;
}
@keyframes drift1 {
0% { transform: translate3d(0, 0, 0) scale(1); }
50% { transform: translate3d(8%, 6%, 0) scale(1.08); }
100% { transform: translate3d(16%, -4%, 0) scale(1.12); }
}
@keyframes drift2 {
0% { transform: translate3d(0, 0, 0) scale(1); }
50% { transform: translate3d(-6%, 8%, 0) scale(1.08); }
100% { transform: translate3d(-14%, -6%, 0) scale(1.12); }
}
@keyframes drift3 {
0% { transform: translate3d(0, 0, 0) scale(1); }
50% { transform: translate3d(6%, -8%, 0) scale(1.08); }
100% { transform: translate3d(-8%, -12%, 0) scale(1.12); }
}
@keyframes drift4 {
0% { transform: translate3d(0, 0, 0) scale(1); }
100% { transform: translate3d(-10%, 14%, 0) scale(1.1); }
}
@keyframes drift5 {
0% { transform: translate3d(0, 0, 0) scale(1); }
100% { transform: translate3d(14%, -10%, 0) scale(1.1); }
}
/* Prefer reduced motion: keep the static gradient */
@media (prefers-reduced-motion: reduce) {
/* Keep shapes visible but stop motion */
.blob, .shape, .dots, .grid, .wash, .aurora, .sunset, .ridges { animation-play-state: paused; }
}
/* Allow forcing animation even if user prefers reduced motion (for visual QA) */
.meshBg[data-animate="always"] .blob, .meshBg[data-animate="always"] .shape, .meshBg[data-animate="always"] .dots, .meshBg[data-animate="always"] .grid, .meshBg[data-animate="always"] .wash, .meshBg[data-animate="always"] .aurora, .meshBg[data-animate="always"] .sunset, .meshBg[data-animate="always"] .ridges { animation-play-state: running !important; }
/* ---------------- Minimal aurora background ---------------- */
/* Sunset gradient movement */
.sunset {
position: absolute;
inset: -10%;
pointer-events: none;
opacity: 1;
background: radial-gradient(120% 80% at 20% 10%, rgba(253, 160, 133, 0.85), transparent 60%),
radial-gradient(120% 90% at 90% 90%, rgba(251, 194, 235, 0.78), transparent 65%),
linear-gradient(160deg, #f6d365 0%, #fda085 30%, #fbc2eb 70%, #a18cd1 100%);
background-size: 110% 110%, 110% 110%, 100% 100%;
background-position: 0% 0%, 100% 100%, 50% 50%;
filter: saturate(1.18) brightness(1.02);
animation: sunsetMove 30s ease-in-out infinite alternate;
}
.vignette {
position: absolute;
inset: 0;
pointer-events: none;
background:
radial-gradient(120% 100% at 50% 10%, rgba(255,255,255,0.08), transparent 55%),
radial-gradient(100% 120% at 50% 110%, rgba(0,0,0,0.18), rgba(0,0,0,0.4));
}
.grain {
position: absolute;
inset: 0;
pointer-events: none;
opacity: 0.03;
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='300'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
background-size: 300px 300px;
mix-blend-mode: overlay;
}
@keyframes sunsetMove {
0% { background-position: 0% 0%, 100% 100%, 50% 50%; }
100% { background-position: 10% -6%, 92% 106%, 50% 52%; }
}
/* Subtle diagonal beams for extra depth */
.beams {
position: absolute;
inset: -10% -30% -10% -30%;
pointer-events: none;
mix-blend-mode: screen;
opacity: 0.08;
background:
linear-gradient(115deg, rgba(255,255,255,0.22) 0%, rgba(255,255,255,0.1) 35%, transparent 60%),
linear-gradient(295deg, rgba(255,255,255,0.18) 0%, transparent 55%);
transform: translateZ(0);
animation: beamsShift 28s ease-in-out infinite alternate;
}
@keyframes beamsShift {
0% { transform: translate3d(0,0,0) rotate(0deg); }
100% { transform: translate3d(2%, -2%, 0) rotate(1.5deg); }
}
/* Wavy ridges like the mockup */
.ridges {
position: absolute;
inset: -5% -5% -5% -5%;
pointer-events: none;
opacity: 0.35;
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 1200' preserveAspectRatio='none'><defs><linearGradient id='g' x1='0' y1='0' x2='1' y2='0'><stop offset='0' stop-color='rgba(245,158,11,0.65)'/><stop offset='1' stop-color='rgba(239,68,68,0.4)'/></linearGradient></defs><g fill='none' stroke='url(%23g)' stroke-width='80' stroke-linecap='round' opacity='0.55'><path d='M-100 180 C 250 120, 500 260, 900 180 C 1200 120, 1350 260, 1700 180'/><path d='M-100 420 C 250 360, 500 500, 900 420 C 1200 360, 1350 500, 1700 420'/><path d='M-100 660 C 250 600, 500 740, 900 660 C 1200 600, 1350 740, 1700 660'/><path d='M-100 900 C 250 840, 500 980, 900 900 C 1200 840, 1350 980, 1700 900'/></g></svg>");
background-size: 120% 120%;
background-position: 0% 0%;
animation: ridgesMove 24s linear infinite alternate;
}
@keyframes ridgesMove {
0% { background-position: 0% 0%; filter: saturate(1); }
100% { background-position: 8% 4%; filter: saturate(1.05); }
}
/* Frosted glass panel like the mockup's screen */
.panel {
position: absolute;
inset: 8% 6%;
border-radius: 28px;
background: rgba(255,255,255,0.06);
border: 1px solid rgba(255,255,255,0.22);
box-shadow: 0 10px 30px rgba(0,0,0,0.06), inset 0 1px 0 rgba(255,255,255,0.22);
backdrop-filter: blur(6px) saturate(1.2);
-webkit-backdrop-filter: blur(6px) saturate(1.2);
}
/* ---------------- Geometric shapes (replace mesh) ---------------- */
.shape {
position: absolute;
will-change: transform;
opacity: 0.45;
filter: saturate(1.1);
mix-blend-mode: screen;
pointer-events: none;
transform: translateZ(0);
transform-origin: 50% 50%;
}
.circle { border-radius: 9999px; }
.rect { border-radius: 28px; }
.triangle { clip-path: polygon(50% 0%, 0% 100%, 100% 100%); }
.diamond { clip-path: polygon(50% 0, 0 50%, 50% 100%, 100% 50%); }
/* Instances with sizes, positions, gradients and animations */
.s1 {
width: 360px; height: 360px;
left: 6%; top: 12%;
background: linear-gradient(135deg, rgba(99,102,241,0.9) 0%, rgba(56,189,248,0.7) 100%);
animation: floatA 42s ease-in-out infinite alternate;
}
.s2 {
width: 300px; height: 300px;
right: 8%; top: 28%;
background: linear-gradient(135deg, rgba(147,51,234,0.85) 0%, rgba(59,130,246,0.7) 100%);
animation: floatB 48s ease-in-out infinite alternate;
}
.s3 {
width: 340px; height: 340px;
left: 52%; bottom: 8%;
background: linear-gradient(135deg, rgba(45,212,191,0.8) 0%, rgba(99,102,241,0.65) 100%);
animation: floatC 50s ease-in-out infinite alternate;
}
.s4 {
width: 420px; height: 220px;
left: 18%; bottom: 10%;
background: linear-gradient(135deg, rgba(56,189,248,0.75) 0%, rgba(45,212,191,0.65) 100%);
animation: floatD 46s ease-in-out infinite alternate;
}
@keyframes floatA {
0% { transform: translate3d(0,0,0) rotate(0deg) scale(1); }
50% { transform: translate3d(20px,-18px,0) rotate(6deg) scale(1.03); }
100% { transform: translate3d(46px,12px,0) rotate(12deg) scale(1.06); }
}
@keyframes floatB {
0% { transform: translate3d(0,0,0) rotate(0deg) scale(1); }
50% { transform: translate3d(-24px,22px,0) rotate(-5deg) scale(1.04); }
100% { transform: translate3d(-52px,-16px,0) rotate(-10deg) scale(1.07); }
}
@keyframes floatC {
0% { transform: translate3d(0,0,0) rotate(0deg) scale(1); }
50% { transform: translate3d(14px,-26px,0) rotate(4deg) scale(1.03); }
100% { transform: translate3d(-24px,-42px,0) rotate(9deg) scale(1.06); }
}
@keyframes floatD {
0% { transform: translate3d(0,0,0) rotate(0deg) scale(1); }
50% { transform: translate3d(24px,12px,0) rotate(3deg) scale(1.02); }
100% { transform: translate3d(52px,-10px,0) rotate(6deg) scale(1.04); }
}
/* Glass card look & feel helpers (used alongside Tailwind classes) */
.glass {
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.18);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
box-shadow: 0 20px 60px rgba(2, 6, 23, 0.35);
}
.layer {
position: absolute;
inset: 0;
}
/* Dots: two interleaved grids to get a richer pattern */
.dots {
opacity: 0.55;
mix-blend-mode: screen;
background-image:
radial-gradient(circle at center, rgba(56, 189, 248, 0.55) 0 1.2px, transparent 1.2px),
radial-gradient(circle at center, rgba(147, 51, 234, 0.45) 0 1.2px, transparent 1.2px);
background-size: var(--tile) var(--tile), var(--tile) var(--tile);
background-position: 0 0, calc(var(--tile) / 2) calc(var(--tile) / 2);
animation: dotsShift 12s linear infinite;
}
/* Thin grid lines to emphasize the lattice */
.grid {
opacity: 0.28;
mix-blend-mode: screen;
background-image:
linear-gradient(to right, rgba(99, 102, 241, 0.22) 1px, transparent 1px),
linear-gradient(to bottom, rgba(99, 102, 241, 0.18) 1px, transparent 1px);
background-size: var(--tile) var(--tile), var(--tile) var(--tile);
background-position: 0 0, 0 0;
animation: gridShift 18s linear infinite;
}
/* Slight color wash for depth (very subtle) */
.wash {
opacity: 0.18;
background: radial-gradient(600px 600px at 15% 20%, rgba(99, 102, 241, 0.25), transparent 60%),
radial-gradient(700px 700px at 85% 80%, rgba(56, 189, 248, 0.2), transparent 60%);
animation: washDrift 22s linear infinite alternate;
}
@keyframes dotsShift {
to {
/* shift by one tile to loop seamlessly */
background-position: var(--tile) var(--tile), calc(var(--tile) * 1.5) calc(var(--tile) * 1.5);
}
}
@keyframes gridShift {
to {
background-position: var(--tile) var(--tile), var(--tile) var(--tile);
}
}
@keyframes washDrift {
0% { transform: translate3d(0,0,0); }
100% { transform: translate3d(6px,-10px,0); }
}
/* Remember Me Checkbox Styles */
.rememberMeSection {
display: flex;
flex-direction: column;
gap: 8px;
margin: 12px 0;
}
.rememberMeLabel {
display: flex;
align-items: center;
gap: 10px;
cursor: pointer;
user-select: none;
}
.rememberMeCheckbox {
width: 18px;
height: 18px;
cursor: pointer;
accent-color: #6366f1;
flex-shrink: 0;
}
.rememberMeText {
font-size: 0.95rem;
color: #171424;
font-weight: 500;
}
.rememberMeWarning {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 12px;
background: linear-gradient(135deg, rgba(251, 191, 36, 0.12), rgba(245, 158, 11, 0.08));
border: 1px solid rgba(245, 158, 11, 0.3);
border-radius: 10px;
animation: slideIn 0.3s ease-out;
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(-5px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.warningIcon {
color: #f59e0b;
flex-shrink: 0;
margin-top: 1px;
}
.warningText {
font-size: 0.8rem;
color: #92400e;
font-weight: 500;
flex: 1;
line-height: 1.4;
}
.whyButton {
background: none;
border: none;
color: #f59e0b;
font-size: 0.8rem;
font-weight: 600;
cursor: pointer;
text-decoration: underline;
text-underline-offset: 2px;
padding: 0;
transition: all 0.2s;
white-space: nowrap;
}
.whyButton:hover {
color: #d97706;
text-decoration-thickness: 2px;
}
.whyButton:active {
transform: scale(0.98);
}
/* Responsive adjustments */
@media (max-width: 640px) {
.rememberMeText {
font-size: 0.9rem;
}
.rememberMeWarning {
flex-wrap: wrap;
gap: 6px;
}
.warningText {
font-size: 0.75rem;
}
.whyButton {
font-size: 0.75rem;
margin-left: auto;
}
}