diff --git a/public/oasis-source/index.html b/public/oasis-source/index.html new file mode 100644 index 0000000..1467b3b --- /dev/null +++ b/public/oasis-source/index.html @@ -0,0 +1,2565 @@ + + + + + + Verdana — Digital Oasis + + + + + + +
+ + + + + + +
+ +
+
+ Rooted in Tomorrow +

The
Digital Oasis

+

Where technology meets the earth. A sanctuary for sustainable minds building a regenerative future.

+ +
+ Explore +
+
+
+ +
+ Our Philosophy +

We believe the next era of technology won't be built in sterile offices — it will be grown, like a forest, from living systems that breathe and adapt.

+
+ +
+
+ Three Pillars +
+
+
+
01
+

Regenerate

+

Every product we design gives back more than it takes. Carbon-negative infrastructure, powered by wind and light.

+
+
+
02
+

Reconnect

+

Bridging the gap between screen time and green time. Digital tools that encourage you to step outside.

+
+
+
03
+

Rewild

+

Open-source algorithms modeled on ecosystems. Software that evolves, adapts, and finds its own balance.

+
+
+
+ +
+ Our Impact So Far +
+
+
2.4M
+
Trees Planted
+
+
+
98%
+
Carbon Offset
+
+
+
140+
+
Communities
+
+
+
Zero
+
Waste to Landfill
+
+
+
+ +
+
"The earth does not belong to us. We belong to the earth — and our code should reflect that truth."
+ — Lena Ashford, Founder +
+ +
+

Step into
the Oasis

+

Join a growing collective of builders, dreamers, and stewards crafting a world worth inheriting.

+ Begin Your Journey → +
+ + +
+ + + + + + diff --git a/src/app/globals.css b/src/app/globals.css index 02bfa89..96cbceb 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -139,218 +139,1072 @@ input, textarea { @apply inline-block text-[10px] font-semibold uppercase tracking-[0.18em] text-violet-300/80; } -/* ===== Login ===== */ +/* ===== Login (cloned from SKG source) ===== */ .login-page { - position: relative; - min-height: 100vh; - overflow: hidden; background: - linear-gradient(135deg, rgba(10, 10, 15, 0.96), rgba(18, 18, 28, 0.98)), - linear-gradient(90deg, rgba(139, 92, 246, 0.12), rgba(59, 130, 246, 0.08)); - color: #fff; + linear-gradient(112deg, #f7f7f4 0 50%, #111214 50% 100%); + font-family: Roboto, "Geist", "Geist Fallback", sans-serif; } -.login-backdrop { +.login-page::before { + content: ""; position: absolute; inset: 0; - background-image: - linear-gradient(rgba(255,255,255,0.045) 1px, transparent 1px), - linear-gradient(90deg, rgba(255,255,255,0.045) 1px, transparent 1px), - linear-gradient(135deg, rgba(139,92,246,0.18), transparent 48%, rgba(59,130,246,0.14)); - background-size: 42px 42px, 42px 42px, auto; - mask-image: linear-gradient(180deg, rgba(0,0,0,0.92), rgba(0,0,0,0.5)); -} -.login-shell { - position: relative; - z-index: 1; - min-height: 100vh; - display: grid; - grid-template-columns: minmax(0, 1.1fr) minmax(360px, 430px); - align-items: center; - gap: 56px; - width: min(1120px, calc(100vw - 48px)); - margin: 0 auto; - padding: 42px 0; -} -.login-showcase { - min-width: 0; -} -.login-brand-mark { - display: inline-flex; - align-items: center; - height: 30px; - padding: 0 11px; - border: 1px solid rgba(255,255,255,0.14); - border-radius: 8px; - background: rgba(255,255,255,0.06); - color: rgba(255,255,255,0.76); - font-size: 12px; - font-weight: 700; -} -.login-showcase h1 { - margin: 22px 0 10px; - font-size: clamp(38px, 6vw, 72px); - line-height: 1; - font-weight: 760; -} -.login-showcase p { - max-width: 520px; - margin: 0; - color: rgba(255,255,255,0.52); - font-size: 15px; - line-height: 1.7; -} -.login-character-strip { - margin-top: 34px; - width: min(620px, 100%); - height: 300px; - border: 1px solid rgba(255,255,255,0.08); - border-radius: 8px; + pointer-events: none; background: - linear-gradient(180deg, rgba(255,255,255,0.08), rgba(255,255,255,0.035)), - rgba(5, 5, 10, 0.45); - box-shadow: inset 0 1px 0 rgba(255,255,255,0.08), 0 24px 70px rgba(0,0,0,0.32); - overflow: hidden; + linear-gradient(90deg, rgba(40, 40, 40, 0.035) 1px, transparent 1px), + linear-gradient(180deg, rgba(40, 40, 40, 0.035) 1px, transparent 1px), + linear-gradient(180deg, rgba(255, 255, 255, 0.42), transparent 40%, rgba(0, 0, 0, 0.42)); + background-size: 56px 56px, 56px 56px, auto; } -.login-panel { +.login-page::after { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + background-image: + linear-gradient(114deg, transparent 0 23%, rgba(255, 255, 255, 0.26) 23% 33%, transparent 33% 54%, rgba(214, 179, 106, 0.12) 54% 62%, transparent 62%), + linear-gradient(rgba(255, 255, 255, 0.035) 1px, transparent 1px); + background-size: auto, 100% 6px; + opacity: 0.78; + mix-blend-mode: screen; +} +.login-page--oasis { + background: #030303; + color: #fff; +} +.login-page--oasis::before { + z-index: 1; + background: + linear-gradient(90deg, rgba(255, 255, 255, 0.028) 1px, transparent 1px), + linear-gradient(180deg, rgba(255, 255, 255, 0.024) 1px, transparent 1px); + background-size: 64px 64px; + opacity: 0.38; +} +.login-page--oasis::after { + z-index: 1; + background: + radial-gradient(circle at 50% 26%, rgba(214, 179, 106, 0.16), transparent 32%), + linear-gradient(90deg, rgba(0, 0, 0, 0.86), rgba(0, 0, 0, 0.34) 48%, rgba(0, 0, 0, 0.76)); + background-size: auto; + opacity: 1; + mix-blend-mode: normal; +} +.login-oasis-canvas { + position: fixed; + inset: 0; + z-index: 0; + width: 100vw; + height: 100vh; + border: 0; + background: #030303; +} +.login-oasis-shade { + position: fixed; + inset: 0; + z-index: 2; + pointer-events: none; + background: + linear-gradient(180deg, rgba(0, 0, 0, 0.62), rgba(0, 0, 0, 0.12) 42%, rgba(0, 0, 0, 0.74)), + radial-gradient(circle at 78% 50%, rgba(214, 179, 106, 0.12), transparent 32%); +} +.login-page--oasis .login-oasis-hero { + color: #fff; + border: 1px solid rgba(140, 180, 120, 0.12); + border-radius: 16px; + background: rgba(10, 18, 10, 0.55); + box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4); + padding: 36px 28px; + backdrop-filter: blur(16px); + transition: border-color 0.4s, background 0.4s; +} +.login-page--oasis .login-oasis-hero:hover { + border-color: rgba(140, 180, 120, 0.3); + background: rgba(20, 35, 20, 0.45); +} +.login-page--oasis .login-hero::before, +.login-page--oasis .login-hero::after { + display: none; +} +.login-page--oasis .login-wordmark, +.login-page--oasis .login-brand-mark { + color: rgba(255, 255, 255, 0.94); +} +.login-page--oasis .login-wordmark__sub, +.login-page--oasis .login-brand-mark__sub { + color: rgba(255, 255, 255, 0.58); +} +.login-page--oasis .login-secure-pill, +.login-page--oasis .login-store-pill { + border: 1px solid rgba(140, 180, 120, 0.18); + background: rgba(10, 18, 10, 0.42); + color: rgba(255, 255, 255, 0.82); + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.32); + backdrop-filter: blur(16px); +} +.login-page--oasis .login-kicker { + color: rgba(224, 210, 128, 0.92); + text-shadow: 0 0 24px rgba(214, 179, 106, 0.2); +} +.login-page--oasis .login-premium-title { + max-width: 720px; + color: #f8f7ef; + font-size: clamp(54px, 7vw, 104px); + font-weight: 600; + letter-spacing: 0; + text-shadow: 0 3px 30px rgba(0, 0, 0, 0.78), 0 0 70px rgba(214, 179, 106, 0.12); +} +.login-page--oasis .login-premium-copy { + max-width: 560px; + color: rgba(247, 246, 236, 0.68); + text-shadow: 0 2px 18px rgba(0, 0, 0, 0.68); +} +.login-page--oasis .login-creative-stage { + min-height: 400px; + margin-top: auto; +} +.login-page--oasis .login-creative-caption { + left: min(470px, 58%); + bottom: 54px; + width: min(300px, 34%); + border-top-color: rgba(255, 255, 255, 0.18); + color: #fff; + text-shadow: 0 2px 22px rgba(0, 0, 0, 0.66); +} +.login-page--oasis .login-creative-caption span { + color: rgba(255, 255, 255, 0.55); +} +.login-page--oasis .login-creative-caption b { + color: rgba(255, 255, 255, 0.94); +} +.login-page--oasis .login-dynamic-dock { + left: 0; + bottom: 104px; + width: min(430px, 54%); + border-color: rgba(140, 180, 120, 0.12); + background: rgba(10, 18, 10, 0.55); + padding: 18px; + box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4); + backdrop-filter: blur(16px); +} +.login-page--oasis .login-dynamic-dock__label { + margin-bottom: 12px; + color: rgba(224, 210, 128, 0.78); +} +.login-page--oasis .login-dynamic-dock .login-character-stage { + min-height: 250px; + border-color: rgba(255, 255, 255, 0.1); + background: + linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px), + linear-gradient(180deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px), + rgba(255, 255, 255, 0.045); + background-size: 22px 22px, 22px 22px, auto; +} +.login-page--oasis .login-dynamic-dock .login-character-stage::after { + background: linear-gradient(180deg, transparent, rgba(0, 0, 0, 0.26)); +} +.login-page--oasis .login-dynamic-dock .login-stage-grid { + border-color: rgba(255, 255, 255, 0.1); +} +.login-page--oasis .login-dynamic-dock .login-characters-container { + transform: translateX(-50%) scale(0.58); +} +.login-page--oasis .login-studio-chip { + border-color: rgba(140, 180, 120, 0.14); + background: rgba(10, 18, 10, 0.55); + color: rgba(255, 255, 255, 0.82); + box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4); + backdrop-filter: blur(16px); +} +.login-page--oasis .login-studio-chip--visual { + right: auto; + left: min(470px, 58%); + top: 176px; +} +.login-page--oasis .login-premium-metrics { + border-color: rgba(140, 180, 120, 0.12); + background: rgba(140, 180, 120, 0.12); + box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4); + backdrop-filter: blur(16px); +} +.login-page--oasis .login-premium-metric { + background: rgba(10, 18, 10, 0.55); +} +.login-page--oasis .login-premium-metric span { + color: rgba(255, 255, 255, 0.5); +} +.login-page--oasis .login-premium-metric b { + color: rgba(255, 255, 255, 0.94); +} +.login-page--oasis .login-auth-panel { + border: 1px solid rgba(140, 180, 120, 0.12); + border-radius: 16px; + background: rgba(10, 18, 10, 0.55); + box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4); + padding: 24px 22px; + backdrop-filter: blur(16px); + transition: border-color 0.4s, background 0.4s; +} +.login-page--oasis .login-auth-panel:hover { + border-color: rgba(140, 180, 120, 0.3); + background: rgba(20, 35, 20, 0.45); +} +.login-page--oasis .login-auth-icon { + border-color: rgba(140, 180, 120, 0.2); + background: rgba(10, 18, 10, 0.55); + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.36); +} +.login-page--oasis .login-auth-panel label > span.flex { + border-color: rgba(140, 180, 120, 0.12); + background: rgba(10, 18, 10, 0.36); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); + backdrop-filter: blur(16px); +} +.login-page--oasis .login-auth-panel label > span.flex:focus-within { + border-color: rgba(140, 180, 120, 0.36); + background: rgba(20, 35, 20, 0.42); + box-shadow: 0 0 0 2px rgba(230, 245, 120, 0.12); +} +.login-page--oasis .login-auth-panel button[type="submit"] { + background: rgba(245, 250, 235, 0.94); + color: #090c07; + box-shadow: 0 8px 40px rgba(0, 0, 0, 0.38); +} +.login-page--oasis .login-auth-panel button[type="submit"]:hover { + background: rgba(230, 245, 120, 0.92); +} +.login-page--oasis .login-auth-panel input:-webkit-autofill, +.login-page--oasis .login-auth-panel input:-webkit-autofill:hover, +.login-page--oasis .login-auth-panel input:-webkit-autofill:focus { + -webkit-text-fill-color: #fff; + transition: background-color 9999s ease-in-out 0s; +} +.login-page--source::before, +.login-page--source::after { + display: none; +} +.login-page--source .login-oasis-shade { + background: + radial-gradient(circle at 34% 52%, rgba(230, 245, 120, 0.08), transparent 28%), + linear-gradient(90deg, rgba(0, 0, 0, 0.22), rgba(0, 0, 0, 0.04) 44%, rgba(0, 0, 0, 0.38)); +} +.login-source-overlay { + position: fixed; + inset: 0; + z-index: 10; + display: block; + min-height: 100vh; + min-height: 100dvh; + padding: clamp(20px, 4vw, 56px); + pointer-events: none; +} +.login-page--oasis .login-source-auth-panel { + position: fixed; + left: 50%; + top: 50%; display: grid; + width: min(820px, calc(100vw - 40px)); + grid-template-columns: minmax(320px, 360px) minmax(300px, 360px); + align-items: center; + gap: 20px; + padding: 18px; + transform: translate(-50%, -50%); + pointer-events: auto; + background: rgba(10, 18, 10, 0.2); + backdrop-filter: none; + overflow: visible; +} +.login-top-brand { + position: absolute; + left: 24px; + top: 22px; + z-index: 5; + display: flex; + align-items: center; gap: 14px; - padding: 24px; - border: 1px solid rgba(255,255,255,0.12); - border-radius: 8px; - background: rgba(9, 9, 14, 0.76); - backdrop-filter: blur(18px); - box-shadow: 0 24px 90px rgba(0,0,0,0.44), inset 0 1px 0 rgba(255,255,255,0.08); + pointer-events: none; } -.login-panel__eyebrow { - color: rgba(167,139,250,0.86); - font-size: 11px; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.14em; +.login-top-brand__logo { + width: 150px; + height: auto; + opacity: 0.86; + filter: invert(1) brightness(1.25) drop-shadow(0 10px 20px rgba(0, 0, 0, 0.45)); } -.login-panel h2 { - margin: 6px 0 4px; - font-size: 22px; - font-weight: 720; -} -.login-field { - display: flex; - align-items: center; - gap: 11px; - height: 46px; - padding: 0 12px; - border: 1px solid rgba(255,255,255,0.1); - border-radius: 8px; - background: rgba(255,255,255,0.055); - color: rgba(255,255,255,0.48); - transition: border-color .18s ease, background .18s ease, box-shadow .18s ease; -} -.login-field:focus-within { - border-color: rgba(167,139,250,0.62); - background: rgba(255,255,255,0.08); - box-shadow: 0 0 0 4px rgba(139,92,246,0.16); -} -.login-field input { - min-width: 0; - flex: 1; - height: 100%; - border: 0; - outline: 0; - background: transparent; - color: #fff; - font-size: 15px; -} -.login-field input::placeholder { - color: rgba(255,255,255,0.3); -} -.login-icon-button { - display: grid; - place-items: center; - width: 34px; - height: 34px; - border: 0; - border-radius: 8px; - background: transparent; - color: rgba(255,255,255,0.55); - cursor: pointer; -} -.login-icon-button:hover { - background: rgba(255,255,255,0.08); - color: #fff; -} -.login-options { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - min-height: 24px; - color: rgba(255,255,255,0.58); - font-size: 13px; -} -.login-options label, -.login-success { +.login-top-brand__system { display: inline-flex; - align-items: center; - gap: 7px; -} -.login-options input { - width: 15px; - height: 15px; - accent-color: #8b5cf6; -} -.login-success { - color: #86efac; -} -.login-message { min-height: 20px; - color: #fca5a5; + align-items: center; + transform: translateY(4px); + border-left: 1px solid rgba(255, 255, 255, 0.18); + padding-left: 14px; + color: rgba(255, 255, 255, 0.66); font-size: 13px; + font-weight: 500; + letter-spacing: 0.08em; + line-height: 1; + text-shadow: 0 10px 22px rgba(0, 0, 0, 0.38); } -.login-submit { +.login-page--source .login-auth-icon { + margin-bottom: 0; +} +.login-source-character-strip { + height: 340px; + margin-bottom: 0; + overflow: hidden; + pointer-events: none; +} +.login-source-character-strip .login-character-stage { + min-height: 340px; + border: 0; + background: transparent; + box-shadow: none; + perspective: 900px; +} +.login-source-character-strip .login-character-stage::after, +.login-source-character-strip .login-stage-grid, +.login-source-character-strip .login-character-base { + display: none; +} +.login-source-character-strip .login-characters-container { + transform: translateX(-50%) scale(0.66); + transform-style: preserve-3d; +} +.login-source-form-pane { + min-width: 0; + transform: translateY(44px); +} + +/* ============================================================ + 信息流工作台 · 登录页同源质感 + ============================================================ */ +.skg-board-theme { + --skg-gold-1: #d6b36a; + --skg-gold-2: #c89b3c; + --skg-cream: #f5efe3; + --skg-bg-1: #0a0a0a; + --skg-bg-2: #111111; + --skg-bg-3: rgba(255, 255, 255, 0.035); + --skg-border: rgba(255, 255, 255, 0.1); + --skg-text-1: #ffffff; + --skg-text-2: rgba(255, 255, 255, 0.62); + --skg-text-3: rgba(255, 255, 255, 0.34); + --skg-success: #34d399; + --skg-warn: #fcd34d; + --skg-danger: #fb7185; + --skg-info: #67e8f9; + --skg-radius-sm: 6px; + --skg-radius-md: 8px; + --skg-radius-lg: 12px; + --skg-shadow-button: 0 6px 24px -8px rgba(0, 0, 0, 0.45); + color: var(--skg-text-1); + background: + radial-gradient(circle at 52% 4%, rgba(214, 179, 106, 0.1), transparent 30%), + radial-gradient(circle at 12% 96%, rgba(214, 179, 106, 0.065), transparent 34%), + linear-gradient(120deg, #0a0a0a 0%, #10100f 46%, #050505 100%); +} + +.skg-board-theme::before { + content: ""; + position: absolute; + inset: 0; + z-index: 0; + pointer-events: none; + background: + linear-gradient(90deg, rgba(255, 255, 255, 0.026) 1px, transparent 1px), + linear-gradient(180deg, rgba(255, 255, 255, 0.022) 1px, transparent 1px); + background-size: 64px 64px; + opacity: 0.44; +} + +.skg-board-theme::after { + content: ""; + position: absolute; + inset: 0; + z-index: 0; + pointer-events: none; + background: + linear-gradient(180deg, rgba(0, 0, 0, 0.22), transparent 42%, rgba(0, 0, 0, 0.4)), + linear-gradient(90deg, rgba(0, 0, 0, 0.28), transparent 38%, rgba(0, 0, 0, 0.24)); +} + +.skg-board-ambient { + background: + radial-gradient(circle at 78% 0%, rgba(232, 201, 122, 0.08), transparent 30%), + radial-gradient(circle at 8% 100%, rgba(214, 179, 106, 0.06), transparent 34%); +} + +.skg-board-topbar, +.skg-board-panel { + border-color: var(--skg-border) !important; + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.022)), + rgba(17, 17, 17, 0.74) !important; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.06), + 0 18px 54px rgba(0, 0, 0, 0.34); + backdrop-filter: blur(10px); +} + +.skg-board-topbar { + background: + linear-gradient(100deg, rgba(214, 179, 106, 0.075), rgba(255, 255, 255, 0.03) 54%, rgba(214, 179, 106, 0.035)), + rgba(12, 12, 12, 0.76) !important; +} + +.skg-board-theme input:focus, +.skg-board-theme textarea:focus, +.skg-board-theme select:focus { + border-color: rgba(214, 179, 106, 0.58) !important; + box-shadow: 0 0 0 2px rgba(214, 179, 106, 0.14); +} + +.skg-board-theme input[type="checkbox"] { + accent-color: #d6b36a; +} + +.skg-board-theme ::selection { + background: rgba(214, 179, 106, 0.28); + color: #fff; +} + +.skg-board-theme--light { + --skg-bg-1: #faf8f4; + --skg-bg-2: #ffffff; + --skg-bg-3: rgba(0, 0, 0, 0.03); + --skg-border: rgba(0, 0, 0, 0.08); + --skg-text-1: #0a0a0a; + --skg-text-2: rgba(0, 0, 0, 0.62); + --skg-text-3: rgba(0, 0, 0, 0.34); + --skg-success: #059669; + --skg-warn: #b7791f; + --skg-danger: #e11d48; + --skg-info: #0891b2; + color: var(--skg-text-1); + background: + radial-gradient(circle at 50% 0%, rgba(232, 212, 168, 0.18), transparent 31%), + radial-gradient(circle at 4% 100%, rgba(214, 179, 106, 0.12), transparent 28%), + linear-gradient(126deg, #faf8f4 0%, #f4efe5 48%, #ffffff 100%); +} + +.skg-board-theme--light::before { + background: + linear-gradient(90deg, rgba(42, 50, 36, 0.05) 1px, transparent 1px), + linear-gradient(180deg, rgba(42, 50, 36, 0.045) 1px, transparent 1px); + opacity: 0.72; +} + +.skg-board-theme--light::after { + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.36), transparent 46%, rgba(214, 179, 106, 0.08)), + linear-gradient(90deg, rgba(255, 255, 255, 0.3), transparent 42%, rgba(255, 255, 255, 0.24)); +} + +.skg-board-theme--light .skg-board-ambient { + background: + radial-gradient(circle at 20% 18%, rgba(214, 179, 106, 0.2), transparent 28%), + radial-gradient(circle at 70% 6%, rgba(143, 176, 113, 0.16), transparent 30%), + radial-gradient(circle at 52% 100%, rgba(214, 179, 106, 0.12), transparent 38%); +} + +.skg-board-theme--light .skg-board-topbar, +.skg-board-theme--light .skg-board-panel { + border-color: rgba(82, 93, 62, 0.16) !important; + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.78), rgba(255, 255, 255, 0.48)), + rgba(249, 246, 236, 0.7) !important; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.78), + 0 18px 48px rgba(65, 55, 30, 0.1); +} + +.skg-board-theme--light .skg-board-topbar { + background: + linear-gradient(100deg, rgba(214, 179, 106, 0.14), rgba(143, 176, 113, 0.08) 42%, rgba(255, 255, 255, 0.58)), + rgba(252, 249, 241, 0.82) !important; +} + +.skg-board-theme--light .skg-board-theme-toggle { + border-color: rgba(82, 93, 62, 0.16) !important; + background: rgba(255, 255, 255, 0.54) !important; + color: rgba(36, 40, 30, 0.72) !important; +} + +.skg-board-theme--light .text-white, +.skg-board-theme--light [class*="text-white/"] { + color: rgba(32, 36, 28, 0.78) !important; +} + +.skg-board-theme--light [class*="bg-black/"], +.skg-board-theme--light [class*="bg-white/"] { + background-color: rgba(255, 255, 250, 0.52) !important; +} + +.skg-board-theme--light [class*="border-white/"] { + border-color: rgba(70, 78, 54, 0.14) !important; +} + +.skg-board-theme--light [class*="text-[#d7efbc]"] { + color: #43662d !important; +} + +.skg-board-theme--light [class*="text-[#e8c77a]"], +.skg-board-theme--light [class*="text-[#f2d58a]"], +.skg-board-theme--light [class*="text-[#f5d98e]"] { + color: #856015 !important; +} + +.skg-board-theme--light [class*="text-emerald-"] { + color: #2f6d3d !important; +} + +.skg-board-theme--light [class*="text-cyan-"], +.skg-board-theme--light [class*="text-sky-"], +.skg-board-theme--light [class*="text-teal-"] { + color: #17606f !important; +} + +.skg-board-theme--light [class*="text-amber-"], +.skg-board-theme--light [class*="text-yellow-"] { + color: #8a5c00 !important; +} + +.skg-board-theme--light [class*="text-rose-"], +.skg-board-theme--light [class*="text-red-"] { + color: #9f1239 !important; +} + +.skg-board-theme--light [class*="text-violet-"], +.skg-board-theme--light [class*="text-purple-"] { + color: #62438a !important; +} + +.skg-board-theme--light [class*="border-[#8fb071]"] { + border-color: rgba(67, 102, 45, 0.28) !important; +} + +.skg-board-theme--light [class*="border-[#d6b36a]"] { + border-color: rgba(133, 96, 21, 0.26) !important; +} + +.skg-board-theme--light [class*="bg-[#8fb071]"], +.skg-board-theme--light [class*="bg-[#d6b36a]"] { + background-color: rgba(214, 179, 106, 0.14) !important; +} + +.skg-board-theme--light input, +.skg-board-theme--light textarea, +.skg-board-theme--light select { + color: #22261f !important; +} + +.skg-board-theme--light input::placeholder, +.skg-board-theme--light textarea::placeholder { + color: rgba(34, 38, 31, 0.36) !important; +} + +.skg-board-theme--light ::selection { + background: rgba(214, 179, 106, 0.32); + color: #171a14; +} + +.skg-board-brand { + display: flex; + min-width: 0; + align-items: center; + gap: 14px; +} + +.skg-board-brand__logo-chip { display: inline-flex; + height: 42px; + width: 132px; + flex-shrink: 0; align-items: center; justify-content: center; + border: 1px solid rgba(214, 179, 106, 0.24); + border-radius: var(--skg-radius-md); + background: #f5efe3; + box-shadow: var(--skg-shadow-button); +} + +.skg-board-brand__logo { + width: 96px; + height: auto; + display: block; +} + +.skg-board-brand__system { + font-size: 12px; + font-weight: 700; + letter-spacing: 0.16em; + color: var(--skg-gold-1); +} + +.skg-board-brand__title { + margin-top: 3px; + color: var(--skg-text-1); + font-size: 20px; + font-weight: 650; + line-height: 1.1; + letter-spacing: 0; +} + +.skg-board-brand__subtitle { + margin-top: 4px; + color: var(--skg-text-3); + font-size: 12px; + line-height: 1.3; +} + +.skg-stat-card { + border: 1px solid rgba(214, 179, 106, 0.18); + border-radius: var(--skg-radius-md); + background: var(--skg-cream); + color: #0a0a0a; + box-shadow: var(--skg-shadow-button); +} + +.skg-stat-card__label { + color: rgba(0, 0, 0, 0.5); +} + +.skg-stat-card__value { + color: #0a0a0a; +} + +.skg-primary-action { + border-radius: var(--skg-radius-md); + background: #f5efe3; + color: #0a0a0a; + box-shadow: var(--skg-shadow-button); +} + +.skg-primary-action:hover { + background: #fff7df; +} + +.skg-secondary-action { + border: 1px solid rgba(214, 179, 106, 0.3); + border-radius: var(--skg-radius-md); + background: rgba(214, 179, 106, 0.08); + color: var(--skg-gold-1); +} + +.skg-secondary-action:hover { + border-color: rgba(214, 179, 106, 0.54); + background: rgba(214, 179, 106, 0.12); + color: #f5d98e; +} + +.skg-empty-state { + border: 1px dashed rgba(214, 179, 106, 0.22); + border-radius: var(--skg-radius-lg); + background: + radial-gradient(circle at 50% 0%, rgba(214, 179, 106, 0.1), transparent 38%), + rgba(255, 255, 255, 0.028); + color: var(--skg-text-3); +} + +.skg-empty-character { + width: min(230px, 82%); + margin: 0 auto 12px; + pointer-events: none; +} + +.skg-empty-character .login-character-stage { + min-height: 112px; + border-color: rgba(214, 179, 106, 0.16); + background: + radial-gradient(circle at 78% 18%, rgba(214, 179, 106, 0.16), transparent 28%), + linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.026)); + box-shadow: none; +} + +.skg-empty-character .login-character-stage::after, +.skg-empty-character .login-stage-grid { + display: none; +} + +.skg-empty-character .login-characters-container { + bottom: -6px; + transform: translateX(-50%) scale(0.22); +} + +.skg-board-theme--light .skg-board-brand__logo-chip { + background: #ffffff; +} + +.skg-board-theme--light .skg-stat-card { + background: #0a0a0a; + color: #fff; + box-shadow: 0 10px 24px -12px rgba(133, 96, 21, 0.38); +} + +.skg-board-theme--light .skg-stat-card__label { + color: rgba(255, 255, 255, 0.54); +} + +.skg-board-theme--light .skg-stat-card__value { + color: #fff; +} + +.skg-board-theme--light .skg-primary-action { + background: #0a0a0a; + color: #fff; + box-shadow: 0 10px 24px -12px rgba(133, 96, 21, 0.42); +} + +.skg-board-theme--light .skg-primary-action:hover { + background: #252525; +} + +.skg-board-theme--light .skg-empty-state { + background: + radial-gradient(circle at 50% 0%, rgba(232, 212, 168, 0.28), transparent 38%), + rgba(255, 255, 255, 0.66); +} + +.login-hero { + isolation: isolate; + color: #282828; + border: 1px solid rgba(255, 255, 255, 0.8); + background: + linear-gradient(145deg, rgba(255, 255, 255, 0.96), rgba(239, 239, 235, 0.9)), + #f7f7f4; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.92), + 0 28px 70px rgba(15, 15, 15, 0.16); +} +.login-hero::before { + content: ""; + position: absolute; + inset: 0; + z-index: 0; + background: + linear-gradient(90deg, transparent 0 48%, rgba(255, 255, 255, 0.58) 48% 100%), + linear-gradient(18deg, transparent 0 58%, rgba(214, 179, 106, 0.1) 58% 66%, transparent 66%), + linear-gradient(180deg, rgba(255, 255, 255, 0.55), transparent 48%); +} +.login-hero::after { + content: ""; + position: absolute; + right: 10%; + bottom: 126px; + z-index: 0; + width: 46%; + height: 1px; + background: linear-gradient(90deg, transparent, rgba(40, 40, 40, 0.16), transparent); + box-shadow: 0 28px 52px rgba(40, 40, 40, 0.22); + pointer-events: none; +} +.login-wordmark, +.login-brand-mark { + display: inline-flex; + align-items: baseline; gap: 8px; + color: #282828; + letter-spacing: 0; +} +.login-wordmark__logo, +.login-brand-mark__logo { + font-size: 26px; + font-weight: 700; + line-height: 1; +} +.login-wordmark__sub, +.login-brand-mark__sub { + font-size: 13px; + color: rgba(40, 40, 40, 0.54); +} +.login-secure-pill, +.login-store-pill { + display: inline-flex; + align-items: center; + gap: 8px; + min-height: 36px; + border-radius: 999px; + background: #282828; + padding: 0 14px; + color: #fff; + font-size: 13px; + box-shadow: 0 10px 24px rgba(40, 40, 40, 0.18); +} +.login-kicker { + margin: 0 0 16px; + color: rgba(40, 40, 40, 0.48); + font-size: 12px; + font-weight: 700; + letter-spacing: 0.18em; +} +.login-premium-title { + margin: 0; + max-width: 620px; + color: #0d0d0d; + font-size: clamp(44px, 5.5vw, 74px); + font-weight: 600; + line-height: 0.98; + letter-spacing: 0; +} +.login-premium-copy { + margin: 18px 0 0; + max-width: 430px; + color: rgba(40, 40, 40, 0.58); + font-size: 16px; + line-height: 1.7; +} +.login-creative-stage { + position: relative; + flex: 1; + min-height: 300px; + margin-top: 26px; +} +.login-creative-stage__halo { + position: absolute; + right: 10%; + bottom: 54px; + width: 46%; height: 46px; - border: 0; + border-radius: 50%; + background: rgba(40, 40, 40, 0.11); + filter: blur(20px); + transform: perspective(500px) rotateX(58deg); +} +.login-creative-orbit { + position: absolute; + right: 2%; + bottom: 8px; + width: min(40%, 330px); + aspect-ratio: 1; + border: 1px solid rgba(40, 40, 40, 0.08); border-radius: 8px; - background: #fff; - color: #08080c; - font-size: 15px; - font-weight: 720; - cursor: pointer; - transition: transform .18s ease, background .18s ease, opacity .18s ease; + background: + radial-gradient(circle at 50% 50%, rgba(214, 179, 106, 0.16), transparent 36%), + linear-gradient(145deg, rgba(255, 255, 255, 0.88), rgba(244, 244, 240, 0.64)); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.9), + 0 34px 70px rgba(40, 40, 40, 0.12); + overflow: hidden; } -.login-submit:hover { - background: #f1edff; +.login-creative-orbit::before, +.login-creative-orbit::after, +.login-creative-orbit span { + content: ""; + position: absolute; + border-radius: 999px; } -.login-submit:active { - transform: translateY(1px); +.login-creative-orbit::before { + inset: 17%; + border: 1px solid rgba(40, 40, 40, 0.12); } -.login-submit:disabled { - cursor: wait; - opacity: .72; +.login-creative-orbit::after { + left: 50%; + top: 50%; + width: 42%; + height: 42%; + background: linear-gradient(145deg, #18191c, #343434); + box-shadow: 0 18px 44px rgba(40, 40, 40, 0.18); + transform: translate(-50%, -50%); +} +.login-creative-orbit span:nth-child(1) { + left: 18%; + top: 22%; + width: 16%; + height: 16%; + background: #d6b36a; +} +.login-creative-orbit span:nth-child(2) { + right: 18%; + top: 34%; + width: 11%; + height: 11%; + background: #111214; +} +.login-creative-orbit span:nth-child(3) { + left: 50%; + bottom: 15%; + width: 13%; + height: 13%; + background: rgba(40, 40, 40, 0.18); +} +.login-creative-caption { + position: absolute; + left: 0; + bottom: 50px; + width: min(310px, 46%); + border-top: 1px solid rgba(40, 40, 40, 0.16); + padding-top: 18px; + color: #151515; +} +.login-creative-caption span { + display: block; + color: rgba(40, 40, 40, 0.5); + font-size: 13px; +} +.login-creative-caption b { + display: block; + margin-top: 5px; + font-size: 28px; + font-weight: 600; + line-height: 1.05; +} +.login-dynamic-dock { + position: absolute; + left: 0; + bottom: 118px; + width: 252px; + border: 1px solid rgba(255, 255, 255, 0.72); + border-radius: 8px; + background: rgba(255, 255, 255, 0.64); + padding: 12px; + box-shadow: 0 22px 52px rgba(40, 40, 40, 0.12); + backdrop-filter: blur(18px); +} +.login-dynamic-dock__label { + display: block; + margin-bottom: 8px; + color: rgba(40, 40, 40, 0.46); + font-size: 11px; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; +} +.login-dynamic-dock .login-character-stage { + min-height: 116px; + border-color: rgba(40, 40, 40, 0.08); + background: + linear-gradient(90deg, rgba(40, 40, 40, 0.04) 1px, transparent 1px), + linear-gradient(180deg, rgba(40, 40, 40, 0.04) 1px, transparent 1px), + rgba(255, 255, 255, 0.5); + background-size: 22px 22px, 22px 22px, auto; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.84); +} +.login-dynamic-dock .login-character-stage::after { + height: 48%; + background: linear-gradient(180deg, transparent, rgba(255, 255, 255, 0.7)); +} +.login-dynamic-dock .login-stage-grid { + inset: 12px; + border-color: rgba(40, 40, 40, 0.08); +} +.login-dynamic-dock .login-characters-container { + left: 50%; + bottom: 0; + transform: translateX(-50%) scale(0.28); +} +.login-studio-chip { + position: absolute; + display: inline-flex; + align-items: center; + gap: 8px; + min-height: 40px; + border: 1px solid rgba(255, 255, 255, 0.72); + border-radius: 999px; + background: rgba(255, 255, 255, 0.72); + padding: 0 14px; + color: rgba(40, 40, 40, 0.68); + font-size: 13px; + box-shadow: 0 18px 40px rgba(40, 40, 40, 0.1); + backdrop-filter: blur(18px); +} +.login-studio-chip--visual { + right: 3%; + top: 28px; +} +.login-studio-chip--review { + right: 35%; + bottom: 104px; +} +.login-premium-metrics { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1px; + margin-top: 24px; + overflow: hidden; + border: 1px solid rgba(40, 40, 40, 0.1); + border-radius: 8px; + background: rgba(40, 40, 40, 0.1); +} +.login-premium-metric { + min-height: 78px; + background: rgba(255, 255, 255, 0.62); + padding: 14px 16px; +} +.login-premium-metric span { + display: block; + color: rgba(40, 40, 40, 0.48); + font-size: 12px; +} +.login-premium-metric b { + display: block; + margin-top: 8px; + color: #121212; + font-size: 20px; + font-weight: 600; +} +.login-auth-panel { + border: 1px solid rgba(255, 255, 255, 0.1); + background: + linear-gradient(180deg, rgba(22, 23, 28, 0.98), rgba(10, 11, 14, 0.98)), + #101114; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.06), + 0 32px 70px rgba(0, 0, 0, 0.35); +} +.login-auth-icon { + background: linear-gradient(145deg, #2b2b2b, #111); + border: 1px solid rgba(214, 179, 106, 0.42); + box-shadow: 0 18px 42px rgba(0, 0, 0, 0.3), 0 0 0 5px rgba(214, 179, 106, 0.06); +} +.login-skg-tile { + border: 1px solid rgba(40, 40, 40, 0.08); + background: + linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(244, 245, 247, 0.75)), + #f5f5f5; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.8), + 0 16px 34px rgba(40, 40, 40, 0.08); } .login-character-stage { position: relative; - width: 100%; - height: 100%; + min-height: 320px; overflow: hidden; + border: 1px solid rgba(40, 40, 40, 0.08); + border-radius: 8px; + background: + radial-gradient(circle at 82% 28%, rgba(245, 135, 32, 0.14), transparent 24%), + linear-gradient(90deg, rgba(40, 40, 40, 0.04) 1px, transparent 1px), + linear-gradient(180deg, rgba(40, 40, 40, 0.04) 1px, transparent 1px), + linear-gradient(180deg, rgba(255, 255, 255, 0.86), rgba(235, 237, 241, 0.78)); + background-size: auto, 34px 34px, 34px 34px, auto; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.8), + 0 30px 70px rgba(40, 40, 40, 0.13); +} +.login-character-stage::after { + content: ""; + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 40%; + background: + linear-gradient(180deg, transparent, rgba(255, 255, 255, 0.56)), + linear-gradient(90deg, transparent 40%, rgba(40, 40, 40, 0.08) 40% 58%, transparent 58%); + pointer-events: none; } .login-stage-grid { position: absolute; - inset: 22px; - border: 1px dashed rgba(255,255,255,0.12); + inset: 26px; + border: 1px dashed rgba(40, 40, 40, 0.11); border-radius: 8px; } .login-characters-container { position: absolute; z-index: 1; left: 50%; - bottom: -8px; + bottom: 0; width: 550px; height: 400px; - transform: translateX(-50%) scale(0.66); + transform: translateX(-50%) scale(0.74); transform-origin: bottom center; } .login-character-base { @@ -360,7 +1214,7 @@ input, textarea { bottom: -12px; height: 28px; border-radius: 999px; - background: radial-gradient(ellipse at center, rgba(0,0,0,0.52), rgba(0,0,0,0) 72%); + background: radial-gradient(ellipse at center, rgba(0, 0, 0, 0.48), rgba(0, 0, 0, 0) 72%); filter: blur(1px); } .login-figure { @@ -368,32 +1222,48 @@ input, textarea { bottom: 0; transform-origin: bottom center; overflow: hidden; - border: 1px solid rgba(255,255,255,0.2); - transition: transform .7s cubic-bezier(.4,0,.2,1), height .55s cubic-bezier(.4,0,.2,1); - filter: drop-shadow(0 34px 32px rgba(0,0,0,0.42)); + border: 1px solid rgba(255, 255, 255, 0.2); + transition: + transform 0.7s cubic-bezier(0.4, 0, 0.2, 1), + height 0.55s cubic-bezier(0.4, 0, 0.2, 1), + opacity 0.2s ease; + will-change: transform; + filter: drop-shadow(0 34px 32px rgba(0, 0, 0, 0.42)); } .login-figure::before { content: ""; position: absolute; inset: 0; z-index: 1; - background: radial-gradient(circle at 30% 18%, rgba(255,255,255,0.34), transparent 24%), linear-gradient(90deg, rgba(255,255,255,0.18), transparent 26%, transparent 62%, rgba(0,0,0,0.3)); + background: + radial-gradient(circle at 30% 18%, rgba(255, 255, 255, 0.34), transparent 24%), + linear-gradient(90deg, rgba(255, 255, 255, 0.18), transparent 26%, transparent 62%, rgba(0, 0, 0, 0.3)), + linear-gradient(180deg, rgba(255, 255, 255, 0.14), transparent 34%, rgba(0, 0, 0, 0.18)); mix-blend-mode: screen; + pointer-events: none; } .login-figure::after { content: ""; position: absolute; inset: 0; z-index: 1; - background: linear-gradient(105deg, rgba(255,255,255,0.2), transparent 30%, rgba(0,0,0,0.26)); - box-shadow: inset 12px 0 22px rgba(255,255,255,0.09), inset -18px 0 28px rgba(0,0,0,0.22), inset 0 -28px 36px rgba(0,0,0,0.18); + background: + linear-gradient(105deg, rgba(255, 255, 255, 0.2), transparent 30%, rgba(0, 0, 0, 0.26)), + radial-gradient(ellipse at 50% 106%, rgba(0, 0, 0, 0.28), transparent 54%); + box-shadow: + inset 12px 0 22px rgba(255, 255, 255, 0.09), + inset -18px 0 28px rgba(0, 0, 0, 0.22), + inset 0 -28px 36px rgba(0, 0, 0, 0.18); + pointer-events: none; } .login-figure__rim { position: absolute; inset: 8px; z-index: 1; - border: 1px solid rgba(255,255,255,0.16); + border: 1px solid rgba(255, 255, 255, 0.16); border-radius: inherit; + opacity: 0.85; + pointer-events: none; } .login-figure__shine { position: absolute; @@ -403,26 +1273,30 @@ input, textarea { width: 42%; height: 11%; border-radius: 999px; - background: rgba(255,255,255,0.22); + background: rgba(255, 255, 255, 0.22); transform: rotate(-14deg); + pointer-events: none; } .login-figure__panel { position: absolute; z-index: 1; - border: 1px solid rgba(255,255,255,0.13); - background: rgba(255,255,255,0.1); + border: 1px solid rgba(255, 255, 255, 0.13); + background: rgba(255, 255, 255, 0.1); + pointer-events: none; } .login-figure__signal { position: absolute; z-index: 2; display: flex; gap: 6px; + pointer-events: none; } .login-figure__signal span { width: 7px; height: 7px; border-radius: 999px; - background: rgba(255,255,255,0.56); + background: rgba(255, 255, 255, 0.56); + box-shadow: 0 0 12px rgba(255, 255, 255, 0.24); } .login-figure--purple { left: 72px; @@ -431,6 +1305,11 @@ input, textarea { z-index: 1; background: linear-gradient(165deg, #9b7bff 0%, #6c3ff5 46%, #3e1eb8 100%); border-radius: 22px 22px 8px 8px; + box-shadow: + inset 18px 0 26px rgba(255, 255, 255, 0.12), + inset -22px 0 32px rgba(31, 14, 114, 0.42), + inset 0 -30px 38px rgba(26, 12, 88, 0.32), + 0 24px 44px rgba(45, 22, 140, 0.26); } .login-figure--black { left: 240px; @@ -439,6 +1318,12 @@ input, textarea { z-index: 2; background: linear-gradient(165deg, #34343a 0%, #202126 48%, #111217 100%); border-radius: 18px 18px 6px 6px; + border-color: rgba(170, 160, 255, 0.18); + box-shadow: + inset 14px 0 22px rgba(255, 255, 255, 0.08), + inset -18px 0 28px rgba(0, 0, 0, 0.45), + inset 0 -26px 34px rgba(0, 0, 0, 0.34), + 0 22px 38px rgba(0, 0, 0, 0.36); } .login-figure--orange { left: 0; @@ -447,6 +1332,11 @@ input, textarea { z-index: 3; background: linear-gradient(160deg, #ffb27f 0%, #ff8f61 56%, #dc6f48 100%); border-radius: 120px 120px 0 0; + box-shadow: + inset 18px 0 24px rgba(255, 255, 255, 0.16), + inset -20px 0 28px rgba(153, 66, 41, 0.32), + inset 0 -22px 34px rgba(149, 55, 37, 0.24), + 0 22px 36px rgba(113, 42, 30, 0.28); } .login-figure--yellow { left: 310px; @@ -455,27 +1345,97 @@ input, textarea { z-index: 4; background: linear-gradient(160deg, #fff17a 0%, #e8d754 58%, #bfa73a 100%); border-radius: 70px 70px 0 0; + box-shadow: + inset 14px 0 22px rgba(255, 255, 255, 0.2), + inset -18px 0 24px rgba(113, 94, 20, 0.28), + inset 0 -24px 32px rgba(117, 96, 17, 0.22), + 0 22px 34px rgba(84, 69, 16, 0.22); +} +.login-figure--purple .login-figure__panel { + left: 22px; + bottom: 88px; + width: 36px; + height: 152px; + border-radius: 999px; +} +.login-figure--purple .login-figure__signal { + left: 26px; + bottom: 46px; +} +.login-figure--black .login-figure__panel { + right: 16px; + bottom: 40px; + width: 12px; + height: 190px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.08); +} +.login-figure--black .login-figure__signal { + right: 18px; + top: 88px; + flex-direction: column; +} +.login-figure--orange .login-figure__panel { + left: 42px; + bottom: 24px; + width: 88px; + height: 18px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.16); +} +.login-figure--orange .login-figure__signal { + right: 54px; + bottom: 28px; +} +.login-figure--yellow .login-figure__panel { + left: 24px; + bottom: 44px; + width: 92px; + height: 24px; + border-radius: 999px; + background: rgba(45, 45, 45, 0.08); + border-color: rgba(45, 45, 45, 0.12); +} +.login-figure--yellow .login-figure__shine { + background: rgba(255, 255, 255, 0.3); +} +.login-figure--yellow .login-figure__signal { + left: 34px; + top: 124px; } -.login-figure--purple .login-figure__panel { left: 22px; bottom: 88px; width: 36px; height: 152px; border-radius: 999px; } -.login-figure--purple .login-figure__signal { left: 26px; bottom: 46px; } -.login-figure--black .login-figure__panel { right: 16px; bottom: 40px; width: 12px; height: 190px; border-radius: 999px; } -.login-figure--black .login-figure__signal { right: 18px; top: 88px; flex-direction: column; } -.login-figure--orange .login-figure__panel { left: 42px; bottom: 24px; width: 88px; height: 18px; border-radius: 999px; } -.login-figure--orange .login-figure__signal { right: 54px; bottom: 28px; } -.login-figure--yellow .login-figure__panel { left: 24px; bottom: 44px; width: 92px; height: 24px; border-radius: 999px; background: rgba(45,45,45,0.08); } -.login-figure--yellow .login-figure__signal { left: 34px; top: 124px; } .login-figure--yellow .login-figure__signal span, -.login-figure--orange .login-figure__signal span { background: rgba(45,45,45,0.36); } +.login-figure--orange .login-figure__signal span { + background: rgba(45, 45, 45, 0.36); + box-shadow: none; +} .login-eyes { position: absolute; z-index: 2; display: flex; - transition: left .35s cubic-bezier(.4,0,.2,1), top .35s cubic-bezier(.4,0,.2,1); + transition: + left 0.35s cubic-bezier(0.4, 0, 0.2, 1), + top 0.35s cubic-bezier(0.4, 0, 0.2, 1); +} +.login-eyes--purple { + left: 75px; + top: 25px; + gap: 32px; +} +.login-eyes--black { + left: 26px; + top: 32px; + gap: 24px; +} +.login-eyes--orange { + left: 112px; + top: 60px; + gap: 32px; +} +.login-eyes--yellow { + left: 52px; + top: 40px; + gap: 24px; } -.login-eyes--purple { left: 75px; top: 25px; gap: 32px; } -.login-eyes--black { left: 26px; top: 32px; gap: 24px; } -.login-eyes--orange { left: 112px; top: 60px; gap: 32px; } -.login-eyes--yellow { left: 52px; top: 40px; gap: 24px; } .login-eye { position: relative; width: 22px; @@ -483,8 +1443,12 @@ input, textarea { border-radius: 999px; background: white; overflow: hidden; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25); +} +.login-eye--small { + width: 20px; + height: 20px; } -.login-eye--small { width: 20px; height: 20px; } .login-eye::after, .login-pupil::after { content: ""; @@ -496,9 +1460,11 @@ input, textarea { border-radius: 50%; background: #2d2d2d; transform: translate(var(--eye-x), var(--eye-y)); - transition: transform .08s linear, opacity .2s ease; + transition: transform 0.08s linear, opacity 0.2s ease; +} +.login-eye::after { + margin: -4px 0 0 -4px; } -.login-eye::after { margin: -4px 0 0 -4px; } .login-pupil { position: relative; width: 12px; @@ -514,10 +1480,28 @@ input, textarea { position: absolute; z-index: 2; background: #2d2d2d; - transition: width .35s cubic-bezier(.4,0,.2,1), height .35s cubic-bezier(.4,0,.2,1), border-radius .35s cubic-bezier(.4,0,.2,1), transform .35s cubic-bezier(.4,0,.2,1); + transition: + width 0.35s cubic-bezier(0.4, 0, 0.2, 1), + height 0.35s cubic-bezier(0.4, 0, 0.2, 1), + border-radius 0.35s cubic-bezier(0.4, 0, 0.2, 1), + transform 0.35s cubic-bezier(0.4, 0, 0.2, 1), + left 0.35s cubic-bezier(0.4, 0, 0.2, 1), + top 0.35s cubic-bezier(0.4, 0, 0.2, 1); +} +.login-mouth--purple { + left: 97px; + top: 57px; + width: 24px; + height: 8px; + border-radius: 0 0 12px 12px; +} +.login-mouth--orange { + left: 126px; + top: 92px; + width: 26px; + height: 13px; + border-radius: 0 0 13px 13px; } -.login-mouth--purple { left: 97px; top: 57px; width: 24px; height: 8px; border-radius: 0 0 12px 12px; } -.login-mouth--orange { left: 126px; top: 92px; width: 26px; height: 13px; border-radius: 0 0 13px 13px; } .login-yellow-mouth { position: absolute; z-index: 2; @@ -530,27 +1514,86 @@ input, textarea { fill: none; stroke-linecap: round; } -.login-character-stage[data-mood="typing"] .login-figure--purple { height: 430px; transform: skewX(-10deg) translateX(36px); } -.login-character-stage[data-mood="typing"] .login-figure--black { transform: skewX(7deg) translateX(6px); } -.login-character-stage[data-mood="typing"] .login-figure--orange { transform: skewX(-5deg); } -.login-character-stage[data-mood="typing"] .login-figure--yellow { transform: skewX(4deg); } -.login-character-stage[data-mood="typing"] .login-mouth--purple { width: 7px; height: 32px; border-radius: 0; transform: translate(14px, -28px) skewX(10deg); } -.login-character-stage[data-mood="typing"] .login-mouth--orange { width: 14px; height: 14px; border-radius: 50%; transform: translateX(6px); } +.login-character-stage[data-mood="typing"] .login-figure--purple { + height: 430px; + transform: skewX(-10deg) translateX(36px); +} +.login-character-stage[data-mood="typing"] .login-figure--black { + transform: skewX(7deg) translateX(6px); +} +.login-character-stage[data-mood="typing"] .login-figure--orange { + transform: skewX(-5deg); +} +.login-character-stage[data-mood="typing"] .login-figure--yellow { + transform: skewX(4deg); +} +.login-character-stage[data-mood="typing"] .login-mouth--purple { + width: 7px; + height: 32px; + border-radius: 0; + transform: translate(14px, -28px) skewX(10deg); +} +.login-character-stage[data-mood="typing"] .login-mouth--orange { + width: 14px; + height: 14px; + border-radius: 50%; + transform: translateX(6px); +} .login-character-stage[data-mood="peek"] .login-figure--purple, -.login-character-stage[data-mood="peek"] .login-figure--black { transform: skewX(0deg) translateY(-10px); } -.login-character-stage[data-mood="peek"] .login-eyes--purple { left: 40px; top: 14px; } -.login-character-stage[data-mood="peek"] .login-eyes--black { left: 2px; top: 20px; } -.login-character-stage[data-mood="peek"] .login-eyes--orange { left: 68px; top: 48px; } -.login-character-stage[data-mood="peek"] .login-eyes--yellow { left: 10px; top: 28px; } +.login-character-stage[data-mood="peek"] .login-figure--black { + transform: skewX(0deg) translateY(-10px); +} +.login-character-stage[data-mood="peek"] .login-eyes--purple { + left: 40px; + top: 14px; +} +.login-character-stage[data-mood="peek"] .login-eyes--black { + left: 2px; + top: 20px; +} +.login-character-stage[data-mood="peek"] .login-eyes--orange { + left: 68px; + top: 48px; +} +.login-character-stage[data-mood="peek"] .login-eyes--yellow { + left: 10px; + top: 28px; +} .login-character-stage[data-mood="peek"] .login-eye::after, -.login-character-stage[data-mood="peek"] .login-pupil::after { transform: translate(-8px, -6px); } -.login-character-stage[data-mood="error"] .login-characters-container { animation: login-shake .28s ease-in-out 2; } -.login-character-stage[data-mood="error"] .login-eye { height: 10px; margin-top: 4px; } +.login-character-stage[data-mood="peek"] .login-pupil::after { + transform: translate(-8px, -6px); +} +.login-character-stage[data-mood="error"] .login-characters-container { + animation: login-shake 0.28s ease-in-out 2; +} +.login-character-stage[data-mood="error"] .login-eye { + height: 10px; + margin-top: 4px; +} .login-character-stage[data-mood="error"] .login-mouth--purple, -.login-character-stage[data-mood="error"] .login-mouth--orange { border-radius: 12px 12px 0 0; transform: translateY(10px); } -.login-character-stage[data-mood="success"] .login-characters-container { animation: login-stage-success .75s cubic-bezier(.34,1.56,.64,1) both; } -.login-character-stage[data-mood="success"] .login-mouth--purple { width: 30px; height: 16px; border-radius: 0 0 15px 15px; } -.login-character-stage[data-mood="success"] .login-mouth--orange { width: 32px; height: 18px; border-radius: 0 0 16px 16px; } +.login-character-stage[data-mood="error"] .login-mouth--orange { + border-radius: 12px 12px 0 0; + transform: translateY(10px); +} +.login-character-stage[data-mood="error"] .login-yellow-mouth path { + d: path("M0 10 Q10 2, 20 10 Q30 18, 40 10 Q50 2, 60 10 Q70 18, 80 10"); +} +.login-character-stage[data-mood="success"] .login-characters-container { + animation: login-stage-success 0.75s cubic-bezier(0.34, 1.56, 0.64, 1) both; +} +.login-character-stage[data-mood="success"] .login-mouth--purple { + width: 30px; + height: 16px; + border-radius: 0 0 15px 15px; +} +.login-character-stage[data-mood="success"] .login-mouth--orange { + width: 32px; + height: 18px; + border-radius: 0 0 16px 16px; +} +.login-character-stage[data-mood="success"] .login-yellow-mouth path { + d: path("M0 6 Q20 18, 40 18 Q60 18, 80 6"); +} @keyframes login-shake { 0%, 100% { translate: 0 0; } 33% { translate: -5px 0; } @@ -561,24 +1604,182 @@ input, textarea { 45% { translate: 0 -22px; } 100% { translate: 0 -8px; } } -@media (max-width: 860px) { - .login-shell { - width: min(100vw - 28px, 460px); +@media (max-width: 720px) { + .login-page { + background: linear-gradient(164deg, #f7f7f4 0 48%, #111214 48% 100%); + } + .login-page--oasis { + background: #030303; + } + .login-page--oasis::after { + background: + radial-gradient(circle at 50% 34%, rgba(214, 179, 106, 0.16), transparent 40%), + linear-gradient(180deg, rgba(0, 0, 0, 0.72), rgba(0, 0, 0, 0.2) 48%, rgba(0, 0, 0, 0.82)); + } + .login-page--oasis .login-oasis-hero { + min-height: 740px; + padding: 24px 20px; + } + .login-page--oasis .login-auth-panel { + padding: 24px 18px; + } + .login-source-overlay { + min-height: 100vh; grid-template-columns: 1fr; - gap: 18px; align-content: center; + padding: 20px; + pointer-events: none; } - .login-showcase h1 { - font-size: 40px; + .login-page--oasis .login-source-auth-panel { + display: block; + width: min(100%, 350px); + justify-self: center; + padding: 16px 18px 20px; } - .login-showcase p { - font-size: 13px; + .login-source-form-pane { + transform: none; } - .login-character-strip { - height: 210px; + .login-top-brand { + left: 18px; + top: 16px; + gap: 10px; + } + .login-top-brand__logo { + width: 112px; + } + .login-top-brand__system { + min-height: 16px; + max-width: 104px; + padding-left: 10px; + font-size: 10px; + letter-spacing: 0.06em; + transform: translateY(2px); + white-space: normal; + } + .login-source-character-strip { + height: 172px; + margin-bottom: 12px; + } + .login-source-character-strip .login-character-stage { + min-height: 172px; + } + .login-source-character-strip .login-characters-container { + transform: translateX(-50%) scale(0.43); + } + .login-page--oasis .login-wordmark__logo { + font-size: 24px; + } + .login-page--oasis .login-secure-pill { + min-height: 34px; + padding: 0 12px; + font-size: 12px; + } + .login-premium-title { + font-size: 34px; + } + .login-page--oasis .login-premium-title { + font-size: 42px; + line-height: 1.06; + } + .login-premium-copy { + font-size: 14px; + } + .login-page--oasis .login-premium-copy { + max-width: 320px; + color: rgba(247, 246, 236, 0.72); + } + .login-creative-stage { + min-height: 340px; + } + .login-page--oasis .login-creative-stage { + min-height: 450px; + } + .login-creative-orbit { + right: -20%; + bottom: 34px; + width: 78%; + } + .login-creative-caption { + bottom: 34px; + width: 48%; + } + .login-page--oasis .login-creative-caption { + display: none; + } + .login-creative-caption b { + font-size: 22px; + } + .login-dynamic-dock { + left: 0; + bottom: 132px; + width: 210px; + padding: 10px; + } + .login-page--oasis .login-dynamic-dock { + bottom: 112px; + width: min(100%, 330px); + padding: 14px; + } + .login-dynamic-dock .login-character-stage { + min-height: 94px; + } + .login-dynamic-dock .login-characters-container { + transform: translateX(-50%) scale(0.22); + } + .login-page--oasis .login-dynamic-dock .login-character-stage { + min-height: 190px; + } + .login-page--oasis .login-dynamic-dock .login-characters-container { + transform: translateX(-50%) scale(0.45); + } + .login-studio-chip { + font-size: 12px; + } + .login-studio-chip--visual { + right: 0; + top: 12px; + } + .login-page--oasis .login-studio-chip--visual { + left: auto; + right: 0; + top: 118px; + } + .login-studio-chip--review { + display: none; + } + .login-premium-metrics { + grid-template-columns: 1fr; + } + .login-character-stage { + min-height: 270px; } .login-characters-container { - transform: translateX(-50%) scale(0.46); + transform: translateX(-50%) scale(0.58); + } +} +@media (prefers-reduced-motion: reduce) { + .login-character-stage[data-mood="error"] .login-characters-container, + .login-character-stage[data-mood="success"] .login-characters-container { + animation: none; + } +} +.login-top-brand__wordmark { + display: inline-flex; + width: auto; + min-width: 148px; + height: auto; + color: rgba(255, 255, 255, 0.92); + font-size: 22px; + font-weight: 760; + letter-spacing: 0; + line-height: 1; + filter: drop-shadow(0 10px 20px rgba(0, 0, 0, 0.45)); +} +@media (max-width: 720px) { + .login-top-brand__wordmark { + min-width: 0; + font-size: 15px; + white-space: nowrap; } } diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 5ce1ba0..b4c22d9 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -4,11 +4,28 @@ import type { FormEvent } from 'react'; import { Suspense, useEffect, useMemo, useState } from 'react'; import { useSearchParams } from 'next/navigation'; import { AnimatedLoginCharacters, type LoginCharacterMood } from '@/components/login/AnimatedLoginCharacters'; +import { OasisCanvas } from '@/components/login/OasisCanvas'; type LoginStatus = 'idle' | 'loading' | 'success'; -function Icon({ type }: { type: 'user' | 'lock' | 'eye' | 'eyeOff' | 'arrow' | 'check' }) { - const common = { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2.2, strokeLinecap: 'round' as const, strokeLinejoin: 'round' as const }; +function Icon({ + type, + className = 'h-4 w-4', +}: { + type: 'user' | 'lock' | 'eye' | 'eyeOff' | 'arrow' | 'check'; + className?: string; +}) { + const common = { + className, + width: 16, + height: 16, + viewBox: '0 0 24 24', + fill: 'none', + stroke: 'currentColor', + strokeWidth: 2.2, + strokeLinecap: 'round' as const, + strokeLinejoin: 'round' as const, + }; if (type === 'user') return ; if (type === 'lock') return ; if (type === 'eye') return ; @@ -25,7 +42,6 @@ function LoginInner() { const [showPassword, setShowPassword] = useState(false); const [activeField, setActiveField] = useState<'username' | 'password' | null>(null); const [hasError, setHasError] = useState(false); - const [message, setMessage] = useState(''); const [status, setStatus] = useState('idle'); const [eyeOffset, setEyeOffset] = useState({ x: 0, y: 0 }); @@ -53,10 +69,8 @@ function LoginInner() { async function onSubmit(event: FormEvent) { event.preventDefault(); setHasError(false); - setMessage(''); if (!username.trim() || !password) { setHasError(true); - setMessage('账号和密码都要填。'); return; } @@ -75,88 +89,105 @@ function LoginInner() { } catch { setStatus('idle'); setHasError(true); - setMessage('账号或密码不对。'); } } return ( -
-
-
-
-
AI Toy
-

AI Toy Patent

-

进入玩具 IP 生成工作台,管理上传、生成、图库和操作记录。

-
+
+ +
+
+
+ + -
-
-
-
Private Workspace
-

登录工作台

-
+ +
+ - + +
- - -
-
- {message ?
{message}
: null} + {status === 'success' ? ( +
+
+ +
+
+ ) : null} - -
-
+ + + +
); } diff --git a/src/components/login/OasisCanvas.tsx b/src/components/login/OasisCanvas.tsx new file mode 100644 index 0000000..35b8839 --- /dev/null +++ b/src/components/login/OasisCanvas.tsx @@ -0,0 +1,67 @@ +'use client'; + +import { useEffect, useRef } from 'react'; + +export function OasisCanvas() { + const frameRef = useRef(null); + + useEffect(() => { + const dispatchNativeMouseEvent = (type: 'mousemove' | 'mouseleave', event?: PointerEvent) => { + const frameWindow = frameRef.current?.contentWindow; + if (!frameWindow) return false; + + try { + const nativeEvent = new MouseEvent(type, { + bubbles: true, + cancelable: false, + clientX: event?.clientX ?? 99999, + clientY: event?.clientY ?? 99999, + screenX: event?.screenX ?? 99999, + screenY: event?.screenY ?? 99999, + buttons: event?.buttons ?? 0, + view: frameWindow, + }); + frameWindow.dispatchEvent(nativeEvent); + return true; + } catch { + return false; + } + }; + + const sendPointer = (type: 'pointermove' | 'pointerleave', event?: PointerEvent) => { + const frameWindow = frameRef.current?.contentWindow; + if (!frameWindow) return; + dispatchNativeMouseEvent(type === 'pointermove' ? 'mousemove' : 'mouseleave', event); + frameWindow.postMessage( + { + type: `skg-oasis-${type}`, + x: event?.clientX ?? 99999, + y: event?.clientY ?? 99999, + }, + window.location.origin, + ); + }; + + const onPointerMove = (event: PointerEvent) => sendPointer('pointermove', event); + const onPointerLeave = () => sendPointer('pointerleave'); + const listenerOptions = { capture: true, passive: true }; + + document.addEventListener('pointermove', onPointerMove, listenerOptions); + window.addEventListener('pointerleave', onPointerLeave, listenerOptions); + return () => { + document.removeEventListener('pointermove', onPointerMove, listenerOptions); + window.removeEventListener('pointerleave', onPointerLeave, listenerOptions); + }; + }, []); + + return ( +