diff --git a/app/globals.css b/app/globals.css
index fa6f070..9f098c0 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -103,12 +103,15 @@
--sidebar-bottom: #f6f6f7;
--sidebar-edge: 0 1px 0 var(--hairline), 6px 0 16px -14px rgb(13 13 13 / 0.28);
/* API-key gate: near-white stage with soft blank glows, tinted input. */
- --gate-base: #f7f7f8;
- --gate-glow-a: rgb(64 74 90 / 0.1);
- --gate-glow-b: rgb(96 108 124 / 0.07);
+ --gate-base: #f6f6f8;
+ --gate-glow-a: rgb(88 106 132 / 0.16);
+ --gate-glow-b: rgb(126 140 160 / 0.12);
+ --gate-card: #ffffff;
+ --gate-card-border: #e7e7e9;
+ --gate-callout-border: #d9d9dc;
--field: #f3f3f4;
--field-border: #e2e2e4;
- --shadow-gate: 0 28px 70px -36px rgb(13 13 13 / 0.35), 0 1px 2px rgb(13 13 13 / 0.05);
+ --shadow-gate: 0 28px 70px -36px rgb(13 13 13 / 0.3), 0 1px 2px rgb(13 13 13 / 0.05);
--shadow-card: 0 1px 2px rgb(13 13 13 / 0.06), 0 1px 3px rgb(13 13 13 / 0.04);
--shadow-card-hover: 0 10px 28px -14px rgb(13 13 13 / 0.22), 0 1px 2px rgb(13 13 13 / 0.06);
}
@@ -131,12 +134,15 @@
--sidebar-bottom: #151515;
--sidebar-edge: 0 1px 0 var(--hairline), 6px 0 16px -14px rgb(0 0 0 / 0.75);
/* API-key gate: near-black stage, monochrome glows, raised input. */
- --gate-base: #0d0d0e;
- --gate-glow-a: rgb(255 255 255 / 0.075);
- --gate-glow-b: rgb(255 255 255 / 0.05);
- --field: #383838;
- --field-border: rgb(255 255 255 / 0.12);
- --shadow-gate: 0 30px 80px -40px rgb(0 0 0 / 0.9), 0 1px 2px rgb(0 0 0 / 0.4);
+ --gate-base: #0c0c0d;
+ --gate-glow-a: rgb(255 255 255 / 0.14);
+ --gate-glow-b: rgb(255 255 255 / 0.09);
+ --gate-card: #171718;
+ --gate-card-border: rgb(255 255 255 / 0.08);
+ --gate-callout-border: rgb(255 255 255 / 0.2);
+ --field: #242425;
+ --field-border: rgb(255 255 255 / 0.1);
+ --shadow-gate: 0 30px 80px -40px rgb(0 0 0 / 0.85), 0 1px 2px rgb(0 0 0 / 0.4);
--shadow-card: 0 1px 2px rgb(0 0 0 / 0.25);
--shadow-card-hover: 0 10px 28px -16px rgb(0 0 0 / 0.55), 0 1px 2px rgb(0 0 0 / 0.3);
}
@@ -191,8 +197,8 @@ body {
softest "blurred glow" available without extra layers. */
.gate-bg {
background:
- radial-gradient(64rem 46rem at 112% -12%, var(--gate-glow-a), transparent 68%),
- radial-gradient(58rem 42rem at -12% 112%, var(--gate-glow-b), transparent 70%),
+ radial-gradient(72rem 54rem at 108% -14%, var(--gate-glow-a), transparent 70%),
+ radial-gradient(64rem 48rem at -14% 112%, var(--gate-glow-b), transparent 72%),
var(--gate-base);
}
diff --git a/components/ApiKeyGate.tsx b/components/ApiKeyGate.tsx
index 4c33c40..b07fdd5 100644
--- a/components/ApiKeyGate.tsx
+++ b/components/ApiKeyGate.tsx
@@ -3,7 +3,18 @@
import { AnimatePresence, motion, useReducedMotion } from "framer-motion";
import { useEffect, useRef, useState, useSyncExternalStore } from "react";
-import { EyeIcon, EyeOffIcon, QuestionIcon, SnowflakeIcon, XIcon } from "@/components/icons";
+import { useTheme } from "@/components/ThemeToggle";
+import {
+ CheckCircleIcon,
+ ExternalLinkIcon,
+ EyeIcon,
+ EyeOffIcon,
+ MoonIcon,
+ QuestionIcon,
+ SnowflakeIcon,
+ SunIcon,
+ XIcon,
+} from "@/components/icons";
import { Spinner } from "@/components/ui";
import { verifyOllamaKey } from "@/lib/client-api";
import { saveSettings, settingsStore } from "@/lib/settings";
@@ -40,8 +51,34 @@ export function ApiKeyGate({ children }: { children: React.ReactNode }) {
return
+
One step and you’re ready to freeze your first deck.
@@ -150,7 +195,7 @@ function GateScreen() { disabled={busy} aria-invalid={error?.tone === "invalid" || undefined} aria-describedby={error ? "gate-api-key-error" : undefined} - className="h-12 w-full rounded-[13px] border border-[var(--field-border)] bg-[var(--field)] pl-3.5 pr-12 text-[14px] text-[var(--text)] outline-none transition placeholder:text-[var(--text-subtle)] focus:border-[var(--text-subtle)] disabled:opacity-60" + className="h-12 w-full rounded-[13px] border border-[var(--field-border)] bg-[var(--field)] pl-3.5 pr-12 text-left text-[14px] text-[var(--text)] outline-none transition placeholder:text-[var(--text-subtle)] focus:border-[var(--text-subtle)] disabled:opacity-60" />- You only need the free cloud tier. No payment and no credit card required. -
++ You only need the{" "} + free cloud tier. No + payment and no credit card required. +
+