From dfad15281082741e42700502c82e5161ef618a93 Mon Sep 17 00:00:00 2001 From: masnwilliams <43387599+masnwilliams@users.noreply.github.com> Date: Wed, 15 Apr 2026 18:22:42 +0000 Subject: [PATCH 01/11] rebrand oauth/cli auth UI to match new kernel.sh branding - Replace color palette with Kernel brand colors (kernel green #81b300, charcoal #212225, beige #f2f0e7, grey scale) - Switch fonts from Commit Mono to Inter (sans) + IBM Plex Mono (mono) - Replace old purple abstract favicon with Kernel green "krnl." lettermark - Replace KernelIcon PNG with inline SVG using the new brand mark - Add KernelWordmark component for the full "kernel." wordmark - Update Clerk theme to match brand colors (green primary, charcoal bg) - Restyle select-org page: cleaner layout, brand wordmark header, lowercase text, green accent buttons - Remove old bg-overlay.png background decoration - Add Inter + IBM Plex Mono via next/font/google --- public/favicon.ico | Bin 0 -> 15086 bytes public/favicon.svg | 5 +- src/app/bg-overlay.png | Bin 76261 -> 0 bytes src/app/globals.css | 158 ++++++++--------------- src/app/layout.tsx | 55 ++++++-- src/app/select-org/page.tsx | 122 +++++++++-------- src/components/icons.tsx | 54 ++++++-- src/components/spinner/loading-state.tsx | 2 +- 8 files changed, 201 insertions(+), 195 deletions(-) create mode 100644 public/favicon.ico delete mode 100644 src/app/bg-overlay.png diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..02202a523febd93d94dc33bee52c71d33855786f GIT binary patch literal 15086 zcmeI3F^&{55Jin3AzP6`&;dwh9{u`ooJ-epG|^)uy_X zuk}LT{rmm>Qu4|gWDjHyWDjHyWDjHyWDjiWfmh$YT;48kE{y&e>gCUeN8RhsA1=tO zVZ$7IztFkwUNXF#hj61F8`j)5$}xY%nmMZW;-WgYYTU|6evI;+$v4Js@o#Y#Kj-W6 z5w$0m$iK(E#s8?D_dSUGy{1u){geD}e`oB~ztu-iss8j>%;6gUBknz|^Q&{ZmA~h7 z#62kXkJr)HbXNULW9v5V>-UJ+vUs%cwI&Xld#$CD&E6yUToD(JQNL9eW6hew&wD~R z-WRHMw2QtmSH+q+I!~S5$V+jN?Lo9-9(8BnA8Sfq zw7BYQ`*;TaaENtfj^4RO8JoDbd(BmI=b#+aKX8%GxwGzmdvQ*j+u!}NhFQbxf$V|o zf$V|ofrERX`@^7I*rNjcPHU;xr+Ve@v<^NC^<5+HM_GfX+5>vmZ@oM7uB>&vN4wpK zoIO6WzqfG#1jT%#AiPG`vb>!?1&HcsGL2{+3?|`J@@)6|B-ti_g{P4 z!&k44<^Z0s;Y57qj6K=+@K#w^isSPrGnd_nk^I#6#8d6jfu%LKLmq)m499S6?TPSx z9EBb6BZhO++UWXU!)UF+V~_mR_nx=pJ@%j6Tlv!$Bl9N~F%?&sEqrt%b03{Y#>>ya z*#jr)f%^Txk$-$oQUAs4@wmQl|H>DJDe{CTF}qjBrAqvyYd>+4_= z2kyvvo^9cPjr`pg*)e*u_$zn(B=>w=@BZSCKbPBGld+XAqvqFq{@b-1Z&H5&lMN@M literal 0 HcmV?d00001 diff --git a/public/favicon.svg b/public/favicon.svg index b9a86da..af5a174 100644 --- a/public/favicon.svg +++ b/public/favicon.svg @@ -1,4 +1 @@ - - - - +RealFaviconGeneratorhttps://realfavicongenerator.net \ No newline at end of file diff --git a/src/app/bg-overlay.png b/src/app/bg-overlay.png deleted file mode 100644 index e4bf5c45664cb4518085629bbff16641baa9dc55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76261 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 diff --git a/src/app/globals.css b/src/app/globals.css index 6d2831b..fd00694 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -5,21 +5,8 @@ @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: 'Commit Mono', monospace; - --color-sidebar-ring: var(--sidebar-ring); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar: var(--sidebar); - --color-chart-5: var(--chart-5); - --color-chart-4: var(--chart-4); - --color-chart-3: var(--chart-3); - --color-chart-2: var(--chart-2); - --color-chart-1: var(--chart-1); + --font-sans: var(--font-inter); + --font-mono: var(--font-ibm-plex-mono); --color-ring: var(--ring); --color-input: var(--input); --color-border: var(--border); @@ -43,72 +30,46 @@ } :root { - --radius: 0.625rem; - --background: #FBFBFB; - --foreground: oklch(0.145 0 0); - --card: #FBFBFB; - --card-foreground: oklch(0.145 0 0); - --popover: #FBFBFB; - --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.205 0 0); - --primary-foreground: #FBFBFB; - --secondary: #F5F5F5; - --secondary-foreground: oklch(0.205 0 0); - --muted: #F5F5F5; - --muted-foreground: oklch(0.556 0 0); - --accent: #F5F5F5; - --accent-foreground: oklch(0.205 0 0); - --destructive: oklch(0.577 0.245 27.325); - --border: #E9E9E9; - --input: #E9E9E9; - --ring: oklch(0.708 0 0); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - --sidebar: #FBFBFB; - --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.205 0 0); - --sidebar-primary-foreground: #FBFBFB; - --sidebar-accent: #F5F5F5; - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: #E9E9E9; - --sidebar-ring: oklch(0.708 0 0); + --radius: 0.5rem; + --background: #f2f0e7; + --foreground: #1c2024; + --card: #faf9f2; + --card-foreground: #1c2024; + --popover: #faf9f2; + --popover-foreground: #1c2024; + --primary: #81b300; + --primary-foreground: #1c2024; + --secondary: #e1dccf; + --secondary-foreground: #1c2024; + --muted: #e1dccf; + --muted-foreground: #60646c; + --accent: #f0f0f3; + --accent-foreground: #1c2024; + --destructive: #dc3545; + --border: rgba(28, 32, 36, 0.15); + --input: rgba(28, 32, 36, 0.15); + --ring: #81b300; } .dark { - --background: #2C2C2C; - --foreground: #FBFBFB; - --card: oklch(0.205 0 0); - --card-foreground: #FBFBFB; - --popover: oklch(0.205 0 0); - --popover-foreground: #FBFBFB; - --primary: oklch(0.922 0 0); - --primary-foreground: oklch(0.205 0 0); - --secondary: oklch(0.269 0 0); - --secondary-foreground: #FBFBFB; - --muted: oklch(0.269 0 0); - --muted-foreground: oklch(0.708 0 0); - --accent: oklch(0.269 0 0); - --accent-foreground: #FBFBFB; - --destructive: oklch(0.704 0.191 22.216); - --border: rgba(251, 251, 251, 0.1); - --input: rgba(251, 251, 251, 0.15); - --ring: oklch(0.556 0 0); - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - --sidebar: oklch(0.205 0 0); - --sidebar-foreground: #FBFBFB; - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: #FBFBFB; - --sidebar-accent: oklch(0.269 0 0); - --sidebar-accent-foreground: #FBFBFB; - --sidebar-border: rgba(251, 251, 251, 0.1); - --sidebar-ring: oklch(0.556 0 0); + --background: #212225; + --foreground: #edeef0; + --card: #2a2b2e; + --card-foreground: #edeef0; + --popover: #2a2b2e; + --popover-foreground: #edeef0; + --primary: #81b300; + --primary-foreground: #212225; + --secondary: #333437; + --secondary-foreground: #edeef0; + --muted: #333437; + --muted-foreground: #9b9da2; + --accent: #333437; + --accent-foreground: #edeef0; + --destructive: #dc3545; + --border: rgba(237, 238, 240, 0.1); + --input: rgba(237, 238, 240, 0.12); + --ring: #81b300; } @layer base { @@ -126,30 +87,26 @@ } body { @apply bg-background text-foreground; - position: relative; + font-family: var(--font-sans); + font-weight: 300; + line-height: 1.2; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } - body::before { - content: ''; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - background-image: url("./bg-overlay.png"); - background-position: right; - background-repeat: no-repeat; - background-size: contain; - background-attachment: fixed; - opacity: 0.6; - z-index: -1; - pointer-events: none; + h1, h2, h3, h4, h5, h6 { + font-weight: 300; + line-height: 1.2; + } + ::selection { + background-color: #81b300; + color: #212225; } } /* Custom toast styling */ .toaster { --toast-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1); - font-family: var(--font-mono); + font-family: var(--font-sans); } .toaster [data-sonner-toast] { @apply border border-border rounded-lg shadow-md; @@ -167,14 +124,3 @@ .toaster [data-sonner-toast][data-type="warning"] [data-icon] { @apply text-yellow-500; } - -.text-shadow { - text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); -} - -h1 { - @apply text-sm; -} -h2 { - @apply text-xs; -} \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 3363c13..774e584 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,22 +1,33 @@ import { ClerkProvider } from '@clerk/nextjs' import { dark } from '@clerk/themes' import type { Metadata } from 'next' +import { Inter, IBM_Plex_Mono } from 'next/font/google' import { ThemeProvider } from 'next-themes' import './globals.css' +const inter = Inter({ + weight: ['300', '400', '500', '600'], + variable: '--font-inter', + subsets: ['latin'], + display: 'optional', +}) + +const ibmPlexMono = IBM_Plex_Mono({ + weight: ['400', '500'], + variable: '--font-ibm-plex-mono', + subsets: ['latin'], + display: 'swap', +}) + export const metadata: Metadata = { - title: 'Kernel MCP Server', - description: 'A Model Context Protocol (MCP) server that provides AI assistants with secure access to Kernel platform tools and browser automation capabilities.', + title: 'Kernel', + description: 'Authorize access to Kernel platform tools and browser automation capabilities.', keywords: [ - 'MCP', - 'Model Context Protocol', 'Kernel', + 'MCP', 'browser automation', 'AI assistants', - 'cloud deployment', - 'web automation', - 'Chromium', - 'headless browser' + 'OAuth', ], } @@ -29,10 +40,34 @@ export default function RootLayout({ - + ) -} \ No newline at end of file +} diff --git a/src/app/select-org/page.tsx b/src/app/select-org/page.tsx index ddac6fe..986a9f7 100644 --- a/src/app/select-org/page.tsx +++ b/src/app/select-org/page.tsx @@ -6,6 +6,7 @@ import { useState, Suspense, useEffect, useRef } from 'react'; import { Col } from '@/components/col' import { Row } from '@/components/row' import { LoadingState } from '@/components/spinner/loading-state'; +import { KernelWordmark } from '@/components/icons'; function SelectOrgContent(): React.ReactElement { const { isLoaded, setActive, userMemberships } = useOrganizationList({ @@ -65,25 +66,25 @@ function SelectOrgContent(): React.ReactElement { const handleConfirm = async (): Promise => { if (!setActive || isSelecting || !selectedOrgId) return; - + setIsSelecting(true); - + try { await setActive({ organization: selectedOrgId }); - + // After setting active org, redirect back to authorize const authorizeUrl = new URL('/authorize', window.location.origin); - + // Add all original OAuth parameters Object.entries(originalParams).forEach(([key, value]) => { if (value) authorizeUrl.searchParams.set(key, value); }); - + // Add the selected orgId as a parameter authorizeUrl.searchParams.set('org_id', selectedOrgId); const redirectUri = authorizeUrl.toString(); - + router.push(redirectUri); } catch (error) { console.error('Failed to set active organization:', error); @@ -95,11 +96,11 @@ function SelectOrgContent(): React.ReactElement { return ( - -

Loading your organizations...

+ +

loading your organizations...

- ); + ); } // Check if user has any organizations (only after loaded) @@ -108,17 +109,19 @@ function SelectOrgContent(): React.ReactElement { {/* User button in top-right corner */}
-
- - -

Create Organization

-

- You need to be a member of at least one organization to continue with authorization. -

- + + +

+ you need to be a member of at least one organization to continue. +

+ + { const params = new URLSearchParams(searchParams.toString()); params.set('org_created', 'true'); @@ -135,29 +138,24 @@ function SelectOrgContent(): React.ReactElement { {/* User button in top-right corner */}
-
- - - -

Select Organization

-

- Choose which organization you'd like to authorize access for. + + + + +

+ select an organization to authorize access.

- {orgId && ( -

- Currently active: {userMemberships?.data?.find(m => m.organization.id === orgId)?.organization.name || user?.organizationMemberships?.find(m => m.organization.id === orgId)?.organization.name || orgId} -

- )}
-
{(userMemberships?.data || user?.organizationMemberships) ?.sort((a, b) => { @@ -174,60 +172,58 @@ function SelectOrgContent(): React.ReactElement { key={membership.organization.id} onClick={() => handleOrgSelect(membership.organization.id)} disabled={isSelecting} - className={`w-full p-4 text-left border rounded-lg transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed ${ - isSelected - ? 'border-primary bg-background' - : 'border-border hover:border-primary/50 hover:bg-accent/50' + className={`w-full p-4 text-left rounded-lg transition-all cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed ${ + isSelected + ? 'bg-primary/10 border border-primary/40' + : 'border border-border hover:border-primary/30 hover:bg-primary/5' }`} > {membership.organization.imageUrl && ( - {membership.organization.name} )} -

{membership.organization.name}

+ {membership.organization.name} {isCurrentlyActive && ( - - Active + + active )}
-

{membership.organization.slug}

+ {membership.organization.slug}
); })}
- + {/* Fade overlays to indicate scrollability */} {canScrollUp && ( -
+
)} {canScrollDown && ( -
+
)}
- - - + ); @@ -236,9 +232,9 @@ function SelectOrgContent(): React.ReactElement { function LoadingFallback(): React.ReactElement { return ( - -
-

Loading...

+ + +

loading...

); @@ -250,4 +246,4 @@ export default function SelectOrgPage(): React.ReactElement { ); -} +} diff --git a/src/components/icons.tsx b/src/components/icons.tsx index d0d8918..802d868 100644 --- a/src/components/icons.tsx +++ b/src/components/icons.tsx @@ -1,5 +1,4 @@ import { Info } from 'lucide-react'; -import Image from 'next/image'; type AppIcon = { alt?: string; @@ -11,21 +10,54 @@ type AppIcon = { }; export const KernelIcon = ({ - alt = 'Kernel Icon', className, - width = 32, - height = 32, size = 32, }: AppIcon) => { return ( - {alt} + width={size} + height={size} + viewBox="0 0 400 400" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + + + + + + + + ); +}; + +export const KernelWordmark = ({ + className, + width = 120, + height = 25, +}: { + className?: string; + width?: number; + height?: number; +}) => { + return ( + + + + + + + + + ); }; diff --git a/src/components/spinner/loading-state.tsx b/src/components/spinner/loading-state.tsx index cd28b11..5a46f99 100644 --- a/src/components/spinner/loading-state.tsx +++ b/src/components/spinner/loading-state.tsx @@ -11,7 +11,7 @@ export interface LoadingStateProps { export const LoadingState = ({ children, fullscreen }: LoadingStateProps) => { const spinner = ( - + {children} ); From b174c43a39269b46dd963a24e650b9a31d2381be Mon Sep 17 00:00:00 2001 From: masnwilliams <43387599+masnwilliams@users.noreply.github.com> Date: Wed, 15 Apr 2026 18:33:40 +0000 Subject: [PATCH 02/11] restyle oauth pages to match kernel.sh light theme - switch from dark to light theme (beige #f2f0e7 background) - hard corners (0px border-radius) throughout - 0.5px solid charcoal borders instead of translucent - lowercase text-transform on body - clerk appearance updated for light mode with sharp corners - org cards use collapsed borders, tag-style active badge - continue button uses charcoal bg with hover underline - remove rounded corners from icon, toasts, avatars Co-Authored-By: Claude Opus 4.6 --- src/app/globals.css | 30 ++++++++++++------ src/app/layout.tsx | 61 ++++++++++++++++++++++++++++--------- src/app/select-org/page.tsx | 38 +++++++++-------------- src/components/icons.tsx | 2 +- 4 files changed, 81 insertions(+), 50 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index fd00694..01ed476 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -30,12 +30,12 @@ } :root { - --radius: 0.5rem; + --radius: 0px; --background: #f2f0e7; --foreground: #1c2024; - --card: #faf9f2; + --card: #f2f0e7; --card-foreground: #1c2024; - --popover: #faf9f2; + --popover: #f2f0e7; --popover-foreground: #1c2024; --primary: #81b300; --primary-foreground: #1c2024; @@ -46,17 +46,17 @@ --accent: #f0f0f3; --accent-foreground: #1c2024; --destructive: #dc3545; - --border: rgba(28, 32, 36, 0.15); - --input: rgba(28, 32, 36, 0.15); + --border: #1c2024; + --input: #1c2024; --ring: #81b300; } .dark { --background: #212225; --foreground: #edeef0; - --card: #2a2b2e; + --card: #212225; --card-foreground: #edeef0; - --popover: #2a2b2e; + --popover: #212225; --popover-foreground: #edeef0; --primary: #81b300; --primary-foreground: #212225; @@ -67,8 +67,8 @@ --accent: #333437; --accent-foreground: #edeef0; --destructive: #dc3545; - --border: rgba(237, 238, 240, 0.1); - --input: rgba(237, 238, 240, 0.12); + --border: #edeef0; + --input: #edeef0; --ring: #81b300; } @@ -90,13 +90,23 @@ font-family: var(--font-sans); font-weight: 300; line-height: 1.2; + text-transform: lowercase; + font-feature-settings: 'liga' off, 'clig' off; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } + input, textarea, [data-preserve-case] { + text-transform: none; + } h1, h2, h3, h4, h5, h6 { font-weight: 300; line-height: 1.2; } + a:hover { + text-decoration: underline; + text-decoration-thickness: 0.5px; + text-underline-offset: 2px; + } ::selection { background-color: #81b300; color: #212225; @@ -109,7 +119,7 @@ font-family: var(--font-sans); } .toaster [data-sonner-toast] { - @apply border border-border rounded-lg shadow-md; + @apply border border-border shadow-md; padding: 0.875rem !important; } .toaster [data-sonner-toast][data-type="success"] [data-icon] { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 774e584..fde0b81 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,4 @@ import { ClerkProvider } from '@clerk/nextjs' -import { dark } from '@clerk/themes' import type { Metadata } from 'next' import { Inter, IBM_Plex_Mono } from 'next/font/google' import { ThemeProvider } from 'next-themes' @@ -39,29 +38,61 @@ export default function RootLayout({ return ( diff --git a/src/app/select-org/page.tsx b/src/app/select-org/page.tsx index 986a9f7..4ab4bf1 100644 --- a/src/app/select-org/page.tsx +++ b/src/app/select-org/page.tsx @@ -27,7 +27,6 @@ function SelectOrgContent(): React.ReactElement { // Check if we just returned from org creation and reload to get fresh data useEffect(() => { if (searchParams.get('org_created') === 'true') { - // Remove the flag from URL and reload to get fresh organization data const newUrl = new URL(window.location.href); newUrl.searchParams.delete('org_created'); window.location.href = newUrl.toString(); @@ -72,20 +71,15 @@ function SelectOrgContent(): React.ReactElement { try { await setActive({ organization: selectedOrgId }); - // After setting active org, redirect back to authorize const authorizeUrl = new URL('/authorize', window.location.origin); - // Add all original OAuth parameters Object.entries(originalParams).forEach(([key, value]) => { if (value) authorizeUrl.searchParams.set(key, value); }); - // Add the selected orgId as a parameter authorizeUrl.searchParams.set('org_id', selectedOrgId); - const redirectUri = authorizeUrl.toString(); - - router.push(redirectUri); + router.push(authorizeUrl.toString()); } catch (error) { console.error('Failed to set active organization:', error); setIsSelecting(false); @@ -103,12 +97,11 @@ function SelectOrgContent(): React.ReactElement { ); } - // Check if user has any organizations (only after loaded) + // No organizations — show create flow if (isLoaded && !userMemberships?.isLoading && (!userMemberships?.data || userMemberships.data.length === 0)) { return ( - {/* User button in top-right corner */} -
+
@@ -136,8 +129,7 @@ function SelectOrgContent(): React.ReactElement { return ( - {/* User button in top-right corner */} -
+
@@ -155,11 +147,10 @@ function SelectOrgContent(): React.ReactElement {
{(userMemberships?.data || user?.organizationMemberships) ?.sort((a, b) => { - // Put the currently active org first if (a.organization.id === orgId) return -1; if (b.organization.id === orgId) return 1; return 0; @@ -172,10 +163,10 @@ function SelectOrgContent(): React.ReactElement { key={membership.organization.id} onClick={() => handleOrgSelect(membership.organization.id)} disabled={isSelecting} - className={`w-full p-4 text-left rounded-lg transition-all cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed ${ + className={`w-full p-4 text-left transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed border-[0.5px] border-foreground -mt-[0.5px] first:mt-0 ${ isSelected - ? 'bg-primary/10 border border-primary/40' - : 'border border-border hover:border-primary/30 hover:bg-primary/5' + ? 'bg-primary/10' + : 'hover:bg-primary/5' }`} > @@ -183,14 +174,14 @@ function SelectOrgContent(): React.ReactElement { {membership.organization.name} )} {membership.organization.name} {isCurrentlyActive && ( - + active )} @@ -203,23 +194,22 @@ function SelectOrgContent(): React.ReactElement { })}
- {/* Fade overlays to indicate scrollability */} {canScrollUp && ( -
+
)} {canScrollDown && ( -
+
)}
+ ))} + {/* Button inside the container */} + +
+ + +

+ v1 — bordered card container +

+ + ); +} diff --git a/src/app/select-org-v2/page.tsx b/src/app/select-org-v2/page.tsx new file mode 100644 index 0000000..c48c267 --- /dev/null +++ b/src/app/select-org-v2/page.tsx @@ -0,0 +1,66 @@ +'use client'; + +import { Col } from '@/components/col'; +import { Row } from '@/components/row'; +import { KernelWordmark } from '@/components/icons'; + +const MOCK_ORGS = [ + { id: '1', name: 'mason', slug: 'mason', initial: 'M', isActive: true, isSelected: true }, + { id: '2', name: '1234-testing', slug: '1234-testing', initial: '1', isActive: false, isSelected: false }, + { id: '3', name: '123-testing', slug: '123-testing', initial: '1', isActive: false, isSelected: false }, +]; + +// V2: Lighter background (#faf9f2) inset card with muted (#e1dccf) border + dividers +// Creates a subtle "lifted" panel against the beige page without shadows +export default function SelectOrgV2(): React.ReactElement { + return ( + + + + +

+ select an organization to authorize access. +

+ + + {/* Lighter background card with muted border */} +
+ {MOCK_ORGS.map((org, i) => ( + + ))} +
+ + {/* Button separate, full width */} + + + +

+ v2 — lighter background inset card with muted border +

+ + ); +} diff --git a/src/app/select-org-v3/page.tsx b/src/app/select-org-v3/page.tsx new file mode 100644 index 0000000..29dbfaa --- /dev/null +++ b/src/app/select-org-v3/page.tsx @@ -0,0 +1,63 @@ +'use client'; + +import { Col } from '@/components/col'; +import { Row } from '@/components/row'; +import { KernelWordmark } from '@/components/icons'; + +const MOCK_ORGS = [ + { id: '1', name: 'mason', slug: 'mason', initial: 'M', isActive: true, isSelected: true }, + { id: '2', name: '1234-testing', slug: '1234-testing', initial: '1', isActive: false, isSelected: false }, + { id: '3', name: '123-testing', slug: '123-testing', initial: '1', isActive: false, isSelected: false }, +]; + +// V3: Bordered container with a 2px kernel-green accent line on top +// Combines containment of V1 with brand color accent for more visual weight +export default function SelectOrgV3(): React.ReactElement { + return ( + + + + +

+ select an organization to authorize access. +

+ + + {/* Bordered container with green accent top */} +
+ {MOCK_ORGS.map((org) => ( + + ))} + {/* Button inside container */} + +
+ + +

+ v3 — green accent line + bordered container +

+ + ); +} diff --git a/src/app/select-org-v4/page.tsx b/src/app/select-org-v4/page.tsx new file mode 100644 index 0000000..cd91dca --- /dev/null +++ b/src/app/select-org-v4/page.tsx @@ -0,0 +1,67 @@ +'use client'; + +import { Col } from '@/components/col'; +import { Row } from '@/components/row'; +import { KernelWordmark } from '@/components/icons'; + +const MOCK_ORGS = [ + { id: '1', name: 'mason', slug: 'mason', initial: 'M', isActive: true, isSelected: true }, + { id: '2', name: '1234-testing', slug: '1234-testing', initial: '1', isActive: false, isSelected: false }, + { id: '3', name: '123-testing', slug: '123-testing', initial: '1', isActive: false, isSelected: false }, +]; + +// V4: Charcoal outer frame with lighter inner panel (#faf9f2) + muted dividers +// Two-layer depth — creates layered definition without shadows +export default function SelectOrgV4(): React.ReactElement { + return ( + + + + +

+ select an organization to authorize access. +

+ + + {/* Charcoal outer frame with lighter inner panel */} +
+
+ {MOCK_ORGS.map((org, i) => ( + + ))} +
+ {/* Button at bottom of frame */} + +
+ + +

+ v4 — charcoal frame + lighter inner panel with muted dividers +

+ + ); +} From 9a0c4c20d3c70d9dff3cc6411fc5f0e677cc7aa8 Mon Sep 17 00:00:00 2001 From: masnwilliams <43387599+masnwilliams@users.noreply.github.com> Date: Wed, 15 Apr 2026 19:05:29 +0000 Subject: [PATCH 06/11] apply v2 inset card styling to select-org and remove variations Org list now sits on a lighter #faf9f2 background with muted #e1dccf border/dividers, creating subtle depth against the beige page without drop shadows. Scroll gradient fades match the new card background. Removes all variation mockup pages (v1-v4). Co-Authored-By: Claude Opus 4.6 --- src/app/select-org-v1/page.tsx | 62 ------------------------------- src/app/select-org-v2/page.tsx | 66 --------------------------------- src/app/select-org-v3/page.tsx | 63 -------------------------------- src/app/select-org-v4/page.tsx | 67 ---------------------------------- src/app/select-org/page.tsx | 15 +++++--- 5 files changed, 9 insertions(+), 264 deletions(-) delete mode 100644 src/app/select-org-v1/page.tsx delete mode 100644 src/app/select-org-v2/page.tsx delete mode 100644 src/app/select-org-v3/page.tsx delete mode 100644 src/app/select-org-v4/page.tsx diff --git a/src/app/select-org-v1/page.tsx b/src/app/select-org-v1/page.tsx deleted file mode 100644 index bb47cd0..0000000 --- a/src/app/select-org-v1/page.tsx +++ /dev/null @@ -1,62 +0,0 @@ -'use client'; - -import { Col } from '@/components/col'; -import { Row } from '@/components/row'; -import { KernelWordmark } from '@/components/icons'; - -const MOCK_ORGS = [ - { id: '1', name: 'mason', slug: 'mason', initial: 'M', isActive: true, isSelected: true }, - { id: '2', name: '1234-testing', slug: '1234-testing', initial: '1', isActive: false, isSelected: false }, - { id: '3', name: '123-testing', slug: '123-testing', initial: '1', isActive: false, isSelected: false }, -]; - -// V1: Bordered card container — org list + button wrapped in a single bordered box -export default function SelectOrgV1(): React.ReactElement { - return ( - - - - -

- select an organization to authorize access. -

- - - {/* Bordered container wrapping org list + button */} -
- {MOCK_ORGS.map((org) => ( - - ))} - {/* Button inside the container */} - -
- - -

- v1 — bordered card container -

- - ); -} diff --git a/src/app/select-org-v2/page.tsx b/src/app/select-org-v2/page.tsx deleted file mode 100644 index c48c267..0000000 --- a/src/app/select-org-v2/page.tsx +++ /dev/null @@ -1,66 +0,0 @@ -'use client'; - -import { Col } from '@/components/col'; -import { Row } from '@/components/row'; -import { KernelWordmark } from '@/components/icons'; - -const MOCK_ORGS = [ - { id: '1', name: 'mason', slug: 'mason', initial: 'M', isActive: true, isSelected: true }, - { id: '2', name: '1234-testing', slug: '1234-testing', initial: '1', isActive: false, isSelected: false }, - { id: '3', name: '123-testing', slug: '123-testing', initial: '1', isActive: false, isSelected: false }, -]; - -// V2: Lighter background (#faf9f2) inset card with muted (#e1dccf) border + dividers -// Creates a subtle "lifted" panel against the beige page without shadows -export default function SelectOrgV2(): React.ReactElement { - return ( - - - - -

- select an organization to authorize access. -

- - - {/* Lighter background card with muted border */} -
- {MOCK_ORGS.map((org, i) => ( - - ))} -
- - {/* Button separate, full width */} - - - -

- v2 — lighter background inset card with muted border -

- - ); -} diff --git a/src/app/select-org-v3/page.tsx b/src/app/select-org-v3/page.tsx deleted file mode 100644 index 29dbfaa..0000000 --- a/src/app/select-org-v3/page.tsx +++ /dev/null @@ -1,63 +0,0 @@ -'use client'; - -import { Col } from '@/components/col'; -import { Row } from '@/components/row'; -import { KernelWordmark } from '@/components/icons'; - -const MOCK_ORGS = [ - { id: '1', name: 'mason', slug: 'mason', initial: 'M', isActive: true, isSelected: true }, - { id: '2', name: '1234-testing', slug: '1234-testing', initial: '1', isActive: false, isSelected: false }, - { id: '3', name: '123-testing', slug: '123-testing', initial: '1', isActive: false, isSelected: false }, -]; - -// V3: Bordered container with a 2px kernel-green accent line on top -// Combines containment of V1 with brand color accent for more visual weight -export default function SelectOrgV3(): React.ReactElement { - return ( - - - - -

- select an organization to authorize access. -

- - - {/* Bordered container with green accent top */} -
- {MOCK_ORGS.map((org) => ( - - ))} - {/* Button inside container */} - -
- - -

- v3 — green accent line + bordered container -

- - ); -} diff --git a/src/app/select-org-v4/page.tsx b/src/app/select-org-v4/page.tsx deleted file mode 100644 index cd91dca..0000000 --- a/src/app/select-org-v4/page.tsx +++ /dev/null @@ -1,67 +0,0 @@ -'use client'; - -import { Col } from '@/components/col'; -import { Row } from '@/components/row'; -import { KernelWordmark } from '@/components/icons'; - -const MOCK_ORGS = [ - { id: '1', name: 'mason', slug: 'mason', initial: 'M', isActive: true, isSelected: true }, - { id: '2', name: '1234-testing', slug: '1234-testing', initial: '1', isActive: false, isSelected: false }, - { id: '3', name: '123-testing', slug: '123-testing', initial: '1', isActive: false, isSelected: false }, -]; - -// V4: Charcoal outer frame with lighter inner panel (#faf9f2) + muted dividers -// Two-layer depth — creates layered definition without shadows -export default function SelectOrgV4(): React.ReactElement { - return ( - - - - -

- select an organization to authorize access. -

- - - {/* Charcoal outer frame with lighter inner panel */} -
-
- {MOCK_ORGS.map((org, i) => ( - - ))} -
- {/* Button at bottom of frame */} - -
- - -

- v4 — charcoal frame + lighter inner panel with muted dividers -

- - ); -} diff --git a/src/app/select-org/page.tsx b/src/app/select-org/page.tsx index 4f5fe3a..587e4d3 100644 --- a/src/app/select-org/page.tsx +++ b/src/app/select-org/page.tsx @@ -147,7 +147,7 @@ function SelectOrgContent(): React.ReactElement {
{(userMemberships?.data || user?.organizationMemberships) ?.sort((a, b) => { @@ -155,18 +155,21 @@ function SelectOrgContent(): React.ReactElement { if (b.organization.id === orgId) return 1; return 0; }) - ?.map((membership) => { + ?.map((membership, index, arr) => { const isSelected = membership.organization.id === selectedOrgId; const isCurrentlyActive = membership.organization.id === orgId; + const isLast = index === arr.length - 1; return (
{canScrollUp && ( -
+
)} {canScrollDown && ( -
+
)}
From 9ff968841e735a143abd08f4fb2b5431db97f609 Mon Sep 17 00:00:00 2001 From: masnwilliams <43387599+masnwilliams@users.noreply.github.com> Date: Wed, 15 Apr 2026 19:07:53 +0000 Subject: [PATCH 07/11] add overscroll-contain to org list + loading state variants page Prevents rubber-band overscroll on the org list scrollable area. Adds /loading-variants with 7 different loading indicator options for comparison (spinning logo, pulse, bar, dots, square spinner, green dot, progress blocks). Co-Authored-By: Claude Opus 4.6 --- src/app/loading-variants/page.tsx | 173 ++++++++++++++++++++++++++++++ src/app/select-org/page.tsx | 2 +- 2 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 src/app/loading-variants/page.tsx diff --git a/src/app/loading-variants/page.tsx b/src/app/loading-variants/page.tsx new file mode 100644 index 0000000..1bc2cb1 --- /dev/null +++ b/src/app/loading-variants/page.tsx @@ -0,0 +1,173 @@ +'use client'; + +import { Col } from '@/components/col'; +import { Row } from '@/components/row'; +import { KernelIcon, KernelWordmark } from '@/components/icons'; + +// A: Current — spinning logo (for reference) +function VariantA(): React.ReactElement { + return ( + + +

loading your organizations...

+ + ); +} + +// B: Pulsing logo — gentle opacity pulse instead of spin +function VariantB(): React.ReactElement { + return ( + + +

loading your organizations...

+ + ); +} + +// C: Minimal bar loader — thin animated line under the wordmark +function VariantC(): React.ReactElement { + return ( + + +
+
+
+

loading your organizations...

+ + + ); +} + +// D: Three dots — simple typing-style dots +function VariantD(): React.ReactElement { + return ( + + + + {[0, 1, 2].map((i) => ( +
+ ))} + +

loading your organizations...

+ + + ); +} + +// E: Border spinner — small square outline with one side animated +function VariantE(): React.ReactElement { + return ( + + +
+

loading your organizations...

+ + + ); +} + +// F: Wordmark with pulsing green dot — static wordmark, small green dot pulses +function VariantF(): React.ReactElement { + return ( + + + +
+ +

loading your organizations...

+ + + ); +} + +// G: Progress blocks — three small squares filling sequentially +function VariantG(): React.ReactElement { + return ( + + + + {[0, 1, 2].map((i) => ( +
+ ))} + +

loading your organizations...

+ + + ); +} + +export default function LoadingVariants(): React.ReactElement { + const variants = [ + { label: 'a — spinning logo (current)', component: }, + { label: 'b — pulsing logo', component: }, + { label: 'c — minimal bar loader', component: }, + { label: 'd — three dots', component: }, + { label: 'e — square border spinner', component: }, + { label: 'f — wordmark + pulsing green dot', component: }, + { label: 'g — progress blocks', component: }, + ]; + + return ( + +

loading state variants

+
+ {variants.map((v) => ( + + {v.component} +

{v.label}

+ + ))} +
+ + ); +} diff --git a/src/app/select-org/page.tsx b/src/app/select-org/page.tsx index 587e4d3..aa0e90a 100644 --- a/src/app/select-org/page.tsx +++ b/src/app/select-org/page.tsx @@ -147,7 +147,7 @@ function SelectOrgContent(): React.ReactElement {
{(userMemberships?.data || user?.organizationMemberships) ?.sort((a, b) => { From 782222806473033dcd3a36b51f709dc1f42dd702 Mon Sep 17 00:00:00 2001 From: masnwilliams <43387599+masnwilliams@users.noreply.github.com> Date: Wed, 15 Apr 2026 19:10:36 +0000 Subject: [PATCH 08/11] fix overscroll: use overscroll-y-none instead of overscroll-contain overscroll-contain prevents propagation but still allows rubber-band bounce within the element. overscroll-y-none disables it entirely. --- src/app/select-org/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/select-org/page.tsx b/src/app/select-org/page.tsx index aa0e90a..d6d4b89 100644 --- a/src/app/select-org/page.tsx +++ b/src/app/select-org/page.tsx @@ -147,7 +147,7 @@ function SelectOrgContent(): React.ReactElement {
{(userMemberships?.data || user?.organizationMemberships) ?.sort((a, b) => { From 4b2ed20592b2f4e3135ec3378e5c8668e440fe23 Mon Sep 17 00:00:00 2001 From: masnwilliams <43387599+masnwilliams@users.noreply.github.com> Date: Wed, 15 Apr 2026 19:12:16 +0000 Subject: [PATCH 09/11] replace spinning logo with minimal bar loader swap the loading spinner from a rotating KernelIcon to a thin animated bar sliding under the KernelWordmark. removes the /loading-variants comparison page now that variant C was selected. Co-Authored-By: Claude Opus 4.6 --- src/app/loading-variants/page.tsx | 173 ----------------------- src/app/select-org/page.tsx | 10 +- src/components/spinner/loading-state.tsx | 31 ++-- 3 files changed, 27 insertions(+), 187 deletions(-) delete mode 100644 src/app/loading-variants/page.tsx diff --git a/src/app/loading-variants/page.tsx b/src/app/loading-variants/page.tsx deleted file mode 100644 index 1bc2cb1..0000000 --- a/src/app/loading-variants/page.tsx +++ /dev/null @@ -1,173 +0,0 @@ -'use client'; - -import { Col } from '@/components/col'; -import { Row } from '@/components/row'; -import { KernelIcon, KernelWordmark } from '@/components/icons'; - -// A: Current — spinning logo (for reference) -function VariantA(): React.ReactElement { - return ( - - -

loading your organizations...

- - ); -} - -// B: Pulsing logo — gentle opacity pulse instead of spin -function VariantB(): React.ReactElement { - return ( - - -

loading your organizations...

- - ); -} - -// C: Minimal bar loader — thin animated line under the wordmark -function VariantC(): React.ReactElement { - return ( - - -
-
-
-

loading your organizations...

- - - ); -} - -// D: Three dots — simple typing-style dots -function VariantD(): React.ReactElement { - return ( - - - - {[0, 1, 2].map((i) => ( -
- ))} - -

loading your organizations...

- - - ); -} - -// E: Border spinner — small square outline with one side animated -function VariantE(): React.ReactElement { - return ( - - -
-

loading your organizations...

- - - ); -} - -// F: Wordmark with pulsing green dot — static wordmark, small green dot pulses -function VariantF(): React.ReactElement { - return ( - - - -
- -

loading your organizations...

- - - ); -} - -// G: Progress blocks — three small squares filling sequentially -function VariantG(): React.ReactElement { - return ( - - - - {[0, 1, 2].map((i) => ( -
- ))} - -

loading your organizations...

- - - ); -} - -export default function LoadingVariants(): React.ReactElement { - const variants = [ - { label: 'a — spinning logo (current)', component: }, - { label: 'b — pulsing logo', component: }, - { label: 'c — minimal bar loader', component: }, - { label: 'd — three dots', component: }, - { label: 'e — square border spinner', component: }, - { label: 'f — wordmark + pulsing green dot', component: }, - { label: 'g — progress blocks', component: }, - ]; - - return ( - -

loading state variants

-
- {variants.map((v) => ( - - {v.component} -

{v.label}

- - ))} -
- - ); -} diff --git a/src/app/select-org/page.tsx b/src/app/select-org/page.tsx index d6d4b89..5699faf 100644 --- a/src/app/select-org/page.tsx +++ b/src/app/select-org/page.tsx @@ -89,10 +89,9 @@ function SelectOrgContent(): React.ReactElement { if (!isLoaded || userMemberships?.isLoading) { return ( - - +

loading your organizations...

- +
); } @@ -225,10 +224,9 @@ function SelectOrgContent(): React.ReactElement { function LoadingFallback(): React.ReactElement { return ( - - +

loading...

- +
); } diff --git a/src/components/spinner/loading-state.tsx b/src/components/spinner/loading-state.tsx index 5a46f99..237f343 100644 --- a/src/components/spinner/loading-state.tsx +++ b/src/components/spinner/loading-state.tsx @@ -1,7 +1,7 @@ 'use client'; -import { Row } from '@/components/row'; -import { KernelIcon } from '@/components/icons'; +import { Col } from '@/components/col'; +import { KernelWordmark } from '@/components/icons'; export interface LoadingStateProps { children?: React.ReactNode; @@ -9,16 +9,31 @@ export interface LoadingStateProps { } export const LoadingState = ({ children, fullscreen }: LoadingStateProps) => { - const spinner = ( - - + const loader = ( + + +
+
+
{children} - + + ); if (fullscreen) { - return {spinner}; + return {loader}; } - return spinner; + return loader; }; From eea78e7d473ea7c35831d55680f951fbccbcf32b Mon Sep 17 00:00:00 2001 From: masnwilliams <43387599+masnwilliams@users.noreply.github.com> Date: Wed, 15 Apr 2026 19:12:41 +0000 Subject: [PATCH 10/11] disable overscroll bounce globally on body --- src/app/layout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index c2c6e1e..12305ea 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -112,7 +112,7 @@ export default function RootLayout({ }} > - + Date: Wed, 15 Apr 2026 19:16:09 +0000 Subject: [PATCH 11/11] restore MCP metadata and code comments removed during rebrand --- src/app/layout.tsx | 12 ++++++++---- src/app/select-org/page.tsx | 10 +++++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 12305ea..16f5c6a 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -18,14 +18,18 @@ const ibmPlexMono = IBM_Plex_Mono({ }) export const metadata: Metadata = { - title: 'Kernel', - description: 'Authorize access to Kernel platform tools and browser automation capabilities.', + title: 'Kernel MCP Server', + description: 'A Model Context Protocol (MCP) server that provides AI assistants with secure access to Kernel platform tools and browser automation capabilities.', keywords: [ - 'Kernel', 'MCP', + 'Model Context Protocol', + 'Kernel', 'browser automation', 'AI assistants', - 'OAuth', + 'cloud deployment', + 'web automation', + 'Chromium', + 'headless browser', ], icons: { icon: [ diff --git a/src/app/select-org/page.tsx b/src/app/select-org/page.tsx index 5699faf..a5d7e1a 100644 --- a/src/app/select-org/page.tsx +++ b/src/app/select-org/page.tsx @@ -27,6 +27,7 @@ function SelectOrgContent(): React.ReactElement { // Check if we just returned from org creation and reload to get fresh data useEffect(() => { if (searchParams.get('org_created') === 'true') { + // Remove the flag from URL and reload to get fresh organization data const newUrl = new URL(window.location.href); newUrl.searchParams.delete('org_created'); window.location.href = newUrl.toString(); @@ -71,12 +72,15 @@ function SelectOrgContent(): React.ReactElement { try { await setActive({ organization: selectedOrgId }); + // After setting active org, redirect back to authorize const authorizeUrl = new URL('/authorize', window.location.origin); + // Add all original OAuth parameters Object.entries(originalParams).forEach(([key, value]) => { if (value) authorizeUrl.searchParams.set(key, value); }); + // Add the selected orgId as a parameter authorizeUrl.searchParams.set('org_id', selectedOrgId); router.push(authorizeUrl.toString()); @@ -96,10 +100,11 @@ function SelectOrgContent(): React.ReactElement { ); } - // No organizations — show create flow + // Check if user has any organizations (only after loaded) if (isLoaded && !userMemberships?.isLoading && (!userMemberships?.data || userMemberships.data.length === 0)) { return ( + {/* User button in top-right corner */}
+ {/* User button in top-right corner */}
{(userMemberships?.data || user?.organizationMemberships) ?.sort((a, b) => { + // Put the currently active org first if (a.organization.id === orgId) return -1; if (b.organization.id === orgId) return 1; return 0; @@ -196,6 +203,7 @@ function SelectOrgContent(): React.ReactElement { })}
+ {/* Fade overlays to indicate scrollability */} {canScrollUp && (
)}