diff --git a/README.md b/README.md index 2a2cbbb..e3de6ea 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Get started: [Quick Demo](#get-started-quick-demo) or [Self-Hosting](#get-starte The built-in control plane centralizes gateway configuration, access management, traffic controls, and operations in one self-hosted interface. -![Doorman API catalog](docs/images/api-catalog.png) +![Doorman control plane](docs/images/control-plane.png) - **API lifecycle:** catalog and visual builder, protocol and endpoint configuration, schema validation, and API discovery. - **Access and consumption:** authentication, users, roles, groups, subscriptions, credits, tiers, and quotas. diff --git a/docs/images/api-catalog.png b/docs/images/api-catalog.png deleted file mode 100644 index 28c2986..0000000 Binary files a/docs/images/api-catalog.png and /dev/null differ diff --git a/docs/images/control-plane.png b/docs/images/control-plane.png new file mode 100644 index 0000000..232f6cc Binary files /dev/null and b/docs/images/control-plane.png differ diff --git a/web-client/public/android-chrome-192x192.png b/web-client/public/android-chrome-192x192.png index 5cce97b..4492179 100644 Binary files a/web-client/public/android-chrome-192x192.png and b/web-client/public/android-chrome-192x192.png differ diff --git a/web-client/public/android-chrome-512x512.png b/web-client/public/android-chrome-512x512.png index 31dd66e..6896765 100644 Binary files a/web-client/public/android-chrome-512x512.png and b/web-client/public/android-chrome-512x512.png differ diff --git a/web-client/public/apple-touch-icon.png b/web-client/public/apple-touch-icon.png index 9c02d55..f9ecbe3 100644 Binary files a/web-client/public/apple-touch-icon.png and b/web-client/public/apple-touch-icon.png differ diff --git a/web-client/public/favicon-16x16.png b/web-client/public/favicon-16x16.png index 8702c9f..bec1a4a 100644 Binary files a/web-client/public/favicon-16x16.png and b/web-client/public/favicon-16x16.png differ diff --git a/web-client/public/favicon-32x32.png b/web-client/public/favicon-32x32.png index ae2866e..90a1ede 100644 Binary files a/web-client/public/favicon-32x32.png and b/web-client/public/favicon-32x32.png differ diff --git a/web-client/src/app/login/page.tsx b/web-client/src/app/login/page.tsx index 897673f..32cf811 100644 --- a/web-client/src/app/login/page.tsx +++ b/web-client/src/app/login/page.tsx @@ -8,6 +8,39 @@ import { postJson, getJson } from '@/utils/api' const DEFAULT_AUTH_REDIRECT = '/dashboard' +function SiteHeader() { + const [open, setOpen] = useState(false) + const links: [string, string][] = [['Gateways', 'https://doorman.dev/#platform'], ['Capabilities', 'https://doorman.dev/#features'], ['Deploy', 'https://doorman.dev/#deploy']] + return ( +
+
+
+ + + DoormanAPI + AI Gateway + + +
+ + Log in + Get Doorman + +
+
+ +
+
+ ) +} + function getSafeNextPath(nextValue: string | null): string { const candidate = nextValue ? (() => { @@ -72,7 +105,7 @@ function LoginPageContent() { } finally { setIsLoading(false) } } - return
DoormanAPI + AI Gateway

Gateway access

Sign in.

Use your Doorman account to manage gateway configuration, traffic, and access control.

setEmail(event.target.value)} required autoComplete="email" placeholder="you@company.com" className="input" disabled={isLoading} />
setPassword(event.target.value)} required autoComplete="current-password" placeholder="Enter your password" className="input" disabled={isLoading} />
{errorMessage &&
{errorMessage}
}
+ return <>

Gateway access

Sign in to Doorman

Use your Doorman account to manage gateway configuration, traffic, and access control.

setEmail(event.target.value)} required autoComplete="email" placeholder="you@company.com" className="input" disabled={isLoading} />
setPassword(event.target.value)} required autoComplete="current-password" placeholder="Enter your password" className="input" disabled={isLoading} />
{errorMessage &&
{errorMessage}
}
} export default function LoginPage() { diff --git a/web-client/src/app/signal.css b/web-client/src/app/signal.css index 6d9ebc1..cacbb2e 100644 --- a/web-client/src/app/signal.css +++ b/web-client/src/app/signal.css @@ -476,3 +476,51 @@ input[type='file']:hover::file-selector-button, .signal-file-picker:hover::file- /* Cards already pad themselves; drop the extra inner padding so tables/forms span the full card width */ .card > .p-6, .card > .p-4, .card > .p-5 { padding-left: 0 !important; padding-right: 0 !important; padding-bottom: 0 !important; padding-top: 4px !important; } + +/* ---- Shared site header (1:1 with doorman-site Navbar) ---- */ +.sh { font-size: 16px; letter-spacing: normal; line-height: 1.5; position: sticky; top: 0; z-index: 50; width: 100%; background: rgba(255,255,255,.95) !important; backdrop-filter: blur(8px); border-bottom: 1px solid #dfe3e8 !important; font-family: 'Segoe UI', 'Helvetica Neue', Arial, system-ui, sans-serif; } +.sh-container { width: 100%; padding: 0 1.25rem; margin: 0 auto; } +.sh-inner { display: flex; height: 60px; align-items: center; justify-content: space-between; } +.sh-brand { display: flex; align-items: center; gap: .75rem; text-decoration: none; } +.sh-brand img { width: 40px; height: 40px; display: block; flex: none; } +.sh-name { display: block; font-size: 18px; font-weight: 700; line-height: 1; letter-spacing: -.025em; color: #111827; } +.sh-sub { display: block; margin-top: 4px; font-size: 10px; font-weight: 600; line-height: 1; letter-spacing: .13em; text-transform: uppercase; color: #66727f; } +.sh-nav { display: none; align-items: center; gap: 1.75rem; } +.sh-nav a { font-size: 14px; line-height: 20px; font-weight: 500; color: #1f2933; text-decoration: none; } +.sh-actions { display: flex; align-items: center; gap: .625rem; } +.sh-gh { display: none; width: 40px; height: 40px; align-items: center; justify-content: center; border-radius: 8px !important; color: #55616d; transition: background .15s, color .15s; } +.sh-gh:hover { background: #f2f4f7; color: #111827; } +.sh-btn { display: none; min-height: 44px; align-items: center; justify-content: center; padding: 10px 20px; border: 1px solid #1d4ed8; border-radius: 3px; background: #fff; color: #1d4ed8; font-size: 14px; line-height: 20px; font-weight: 600; text-decoration: none; box-shadow: 0 1px 1px rgba(16,24,40,.03); transition: background .15s, color .15s; cursor: pointer; } +.sh-btn:hover { background: #eff6ff; color: #1e40af; } +.sh-btn--primary { background: #1d4ed8; color: #fff; } +.sh-btn--primary:hover { background: #1d4ed8; color: #fff; } +.sh-burger { display: inline-flex; width: 40px; height: 40px; align-items: center; justify-content: center; border: 1px solid #dfe3e8; border-radius: 8px !important; background: transparent; color: #3b4753; cursor: pointer; padding: 0; } +.sh-mobile { display: none; border-top: 1px solid #dfe3e8; padding: 1rem 0; } +.sh-mobile.open { display: block; } +.sh-mobile a { display: block; padding: .75rem; border-radius: 8px; font-size: 14px; font-weight: 600; color: #1f2933; text-decoration: none; } +.sh-mobile a:hover { background: #f2f4f7; } +.sh-mobile .sh-btn { display: flex; margin-top: .75rem; color: #fff; } +.login-signal { min-height: calc(100vh - 61px); } +@media (min-width: 640px) { .sh-gh { display: inline-flex; } .sh-btn { display: inline-flex; } .sh-mobile .sh-btn { display: flex; } } +@media (min-width: 768px) { .sh-container { width: 80%; padding: 0 2rem; } .sh-nav { display: flex; } .sh-burger, .sh-mobile { display: none !important; } } +@media (min-width: 1024px) { .sh-btn--primary { display: inline-flex; } } +@media (max-width: 1023px) { .sh-actions > .sh-btn--primary { display: none; } } +@media (max-width: 767px) { .sh-mobile .sh-btn--primary { display: flex; } } + +.login-signal { place-items: start center; align-content: start; padding-top: 39px; padding-bottom: 56px; } + +/* ---- Login card: same format as the wrapper signup card ---- */ +.login-signal { padding-top: 39px; } +.login-signal__panel { width: min(100%, 520px); border: 1px solid #dfe3e8; border-radius: 6px; box-shadow: 0 2px 6px rgba(16, 24, 40, .08); } +.login-signal__header { display: flex; flex-direction: column; gap: 5px; padding: 28px 32px 20px; border-bottom: 1px solid #eceff3; } +.login-signal__header .signal-kicker { margin: 0; color: #1d4ed8; font-size: 12px; font-weight: 600; letter-spacing: .02em !important; text-transform: none !important; } +.login-signal__header h1 { margin: 0; font-size: 22px; font-weight: 600; line-height: 1.2; letter-spacing: 0; color: #111827; } +.login-signal__header > p:last-child { max-width: none; margin: 2px 0 0; color: #66727f; font-size: 14px; line-height: 1.45; } +.login-signal__form { gap: 20px; padding: 24px 32px 32px; } +.login-signal__form > div { gap: 6px; } +.login-signal__form .input { padding: 10px 12px; font-size: 14px; border-radius: 4px !important; } +.login-signal__form label { font-size: 13px; font-weight: 600; color: #1f2933 !important; } +.login-signal__form .signal-button { width: 100%; min-height: 44px; font-size: 14px !important; font-weight: 600 !important; } +.login-signal footer { padding: 14px 32px; border-top: 1px solid #eceff3; font-size: 12px; color: #66727f; } +.login-signal footer a { color: #1d4ed8; font-weight: 500; text-decoration: none; } +.login-signal footer a:hover { text-decoration: underline; }