From e4ea619251c1e6eaa4ac23483ef896c6e772a6ef Mon Sep 17 00:00:00 2001
From: Danny White <3104761+dnywh@users.noreply.github.com>
Date: Thu, 3 Sep 2026 15:22:55 +1000
Subject: [PATCH 1/7] fix(www): prevent State of Startups banner collision
(#49932)
## What kind of change does this PR introduce?
Bug fix.
## What is the current behavior?
The Supabase Select 2026 announcement is rendered outside the fixed
navigation stack on `/state-of-startups`, so the navigation overlaps the
banner. At shorter viewport heights, the hero's viewport-based minimum
height also lets its headline sit beneath the fixed banner and
navigation.
## What is the new behavior?
On State of Startups routes, the announcement is rendered inside the
fixed navigation stack. The hero content also reserves the stack's
responsive height as its minimum top inset, keeping the headline clear
when the viewport is short without shifting it at normal heights.
Dismissing the banner moves the navigation back to the top without a
hard-coded navigation offset. Other routes keep the existing
announcement and sticky navigation layout.
| Before | After |
| --- | --- |
|
|
|
## To test
1. Open `/state-of-startups` on the deploy preview with the Supabase
Select 2026 announcement visible.
2. Confirm the announcement sits above the navigation without overlap at
desktop and mobile widths.
3. Reduce the viewport height to around 500px and confirm the State of
Startups headline remains below the navigation.
4. Dismiss the announcement and confirm the navigation moves to the top
of the viewport without leaving a gap.
5. Open another www route and confirm the announcement remains above the
sticky navigation.
## Summary by CodeRabbit
* **Bug Fixes**
* Updated the announcement banner placement on State of Startups pages
so it appears within the sticky navigation area.
* Preserved the existing announcement banner placement on other pages.
* Increased top spacing above the State of Startups header content
across mobile and desktop layouts.
---
.../components/StateOfStartupsAuroraHeader.tsx | 2 +-
apps/www/components/Nav/index.tsx | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/apps/www/app/state-of-startups/components/StateOfStartupsAuroraHeader.tsx b/apps/www/app/state-of-startups/components/StateOfStartupsAuroraHeader.tsx
index 0d624038a3cdd..b63bd89fce7c9 100644
--- a/apps/www/app/state-of-startups/components/StateOfStartupsAuroraHeader.tsx
+++ b/apps/www/app/state-of-startups/components/StateOfStartupsAuroraHeader.tsx
@@ -49,7 +49,7 @@ export function StateOfStartupsAuroraHeader() {
/>
{/* Content — constrained to default container */}
-
+
Supabase Presents
diff --git a/apps/www/components/Nav/index.tsx b/apps/www/components/Nav/index.tsx
index 1f45ce23f2e3d..8464a96d02ed3 100644
--- a/apps/www/components/Nav/index.tsx
+++ b/apps/www/components/Nav/index.tsx
@@ -81,7 +81,7 @@ const Nav = ({ hideNavbar, stickyNavbar = true }: Props) => {
return (
<>
-
+ {!isStateOfStartupsPage &&
}
{
style={{ transform: 'translate3d(0,0,999px)' }}
data-nav-transparent={isTransparent ? '' : undefined}
>
+ {isStateOfStartupsPage &&
}
Date: Thu, 3 Sep 2026 11:59:36 +0530
Subject: [PATCH 2/7] fix(ui-patterns): prevent duplicate horizontal scrollbar
in MultipleCodeBlock (#49940)
## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.
YES
## What kind of change does this PR introduce?
Bug fix
## What is the current behavior?
Fixes #49903
In `ConnectSheet` (e.g., Next.js -> Step 2 "Add files"), multi-file
instructions render using `MultipleCodeBlock`.
The `TabsContent` container in
`packages/ui-patterns/src/MultipleCodeBlock/index.tsx` was styled with
`className="... overflow-scroll ..."`.
The CSS property `overflow-scroll` forces both horizontal and vertical
scrollbar tracks to be rendered regardless of whether horizontal content
overflows.
Because the child `
` already manages its own horizontal
overflow (`overflow-auto`) and fills the container width, `TabsContent`
displayed a frozen/disabled horizontal scrollbar at the top level. When
scrolling down vertically to the bottom of the code snippet,
``'s real horizontal scrollbar came into view, resulting in
inconsistent and duplicate scrollbars.
## What is the new behavior?
- Replaced `overflow-scroll` with `overflow-y-auto` on `TabsContent` in
`MultipleCodeBlock`.
- `TabsContent` cleanly scrolls vertically when content height exceeds
`max-h-72`.
- Eliminates the duplicate/disabled top-level horizontal scrollbar.
- Horizontal code scrolling is cleanly delegated to `` only
when lines exceed the available width.
- Added a unit test in
`packages/ui-patterns/src/MultipleCodeBlock/index.test.tsx` verifying
`TabsContent` applies `overflow-y-auto` rather than `overflow-scroll`.
## Additional context
Verified locally:
- `vitest run src/MultipleCodeBlock/index.test.tsx` (all tests passing)
- `tsc --noEmit` in `packages/ui-patterns` (0 type errors)
- `prettier --check` against modified files (passed)
## Summary by CodeRabbit
* **Bug Fixes**
* Improved code block scrolling to use vertical scrolling only.
* Prevented unnecessary horizontal scrollbars in multi-file code
examples.
* Added coverage to verify the updated scrolling behavior.
---
.../src/MultipleCodeBlock/index.test.tsx | 18 ++++++++++++++++++
.../src/MultipleCodeBlock/index.tsx | 2 +-
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/packages/ui-patterns/src/MultipleCodeBlock/index.test.tsx b/packages/ui-patterns/src/MultipleCodeBlock/index.test.tsx
index fa9025fa192d4..a4d272671d5c7 100644
--- a/packages/ui-patterns/src/MultipleCodeBlock/index.test.tsx
+++ b/packages/ui-patterns/src/MultipleCodeBlock/index.test.tsx
@@ -35,4 +35,22 @@ describe('MultipleCodeBlock', () => {
expect(screen.getByRole('tab', { selected: true })).toHaveTextContent('.env')
expect(screen.getByText('VITE_SUPABASE_URL=https://react.example')).toBeVisible()
})
+
+ it('renders tab content with vertical auto-scrolling instead of forced overflow scrollbars', () => {
+ const { container } = render(
+
+ )
+
+ const tabContent = container.querySelector('[data-connect-tab-content]')
+ expect(tabContent).toHaveClass('overflow-y-auto')
+ expect(tabContent).not.toHaveClass('overflow-scroll')
+ })
})
diff --git a/packages/ui-patterns/src/MultipleCodeBlock/index.tsx b/packages/ui-patterns/src/MultipleCodeBlock/index.tsx
index 901be3a7f865b..59ca1098aeb5c 100644
--- a/packages/ui-patterns/src/MultipleCodeBlock/index.tsx
+++ b/packages/ui-patterns/src/MultipleCodeBlock/index.tsx
@@ -153,7 +153,7 @@ export const MultipleCodeBlock = ({
key={file.name}
value={file.name}
forceMount
- className="p-0 max-h-72 overflow-scroll data-[state=inactive]:hidden"
+ className="p-0 max-h-72 overflow-y-auto data-[state=inactive]:hidden"
data-connect-tab-content
data-tab-label={file.name}
>
From cde5383e94b5ed3e5449f1538f3f982f415302ed Mon Sep 17 00:00:00 2001
From: Jeremias Menichelli
Date: Thu, 3 Sep 2026 10:53:37 +0200
Subject: [PATCH 3/7] feat: Add Guides layout support, schema, and sample page
(#49930)
## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.
YES
## What kind of change does this PR introduce?
In this PR we cover the basics for a simple guide page:
- Set up _guides_ content collection, with schema definition.
- Specific guides layout to be applied to all `content/guides` files.
- Added support for multiple topics display on page.
- Small fix to prevent menu navigation flash on theme change.
_To test_
- Open the `kb` preview
- Go to `/kb/guides/sample-guide` ([link
here](https://kb-git-jeremiasmenichelli-docs-1350-build-guide-df55d1-supabase.vercel.app/kb/guides/sample-guide))
- Check the main content appears correctly
_Sample page_
## Summary by CodeRabbit
- **New Features**
- Added a documentation guides section with Markdown-based guide pages.
- Guides now support titles, descriptions, topic badges, GitHub
discussion links, images, code blocks, tables, lists, and other rich
Markdown content.
- Added page-specific titles and meta descriptions for improved
navigation and sharing.
- **Style**
- Updated navigation trigger styling for a transparent appearance.
- Improved spacing and presentation of code blocks within guide content.
---
apps/kb/package.json | 1 +
apps/kb/src/components/Nav.tsx | 2 +-
apps/kb/src/content.config.ts | 18 +++++
apps/kb/src/content/guides/sample-guide.md | 81 ++++++++++++++++++++++
apps/kb/src/layouts/GuideLayout.astro | 39 +++++++++++
apps/kb/src/layouts/Layout.astro | 10 ++-
apps/kb/src/pages/guides/[...slug].astro | 21 ++++++
apps/kb/src/pages/index.astro | 2 +-
apps/kb/src/styles/globals.css | 6 ++
pnpm-lock.yaml | 52 ++++++--------
10 files changed, 198 insertions(+), 34 deletions(-)
create mode 100644 apps/kb/src/content.config.ts
create mode 100644 apps/kb/src/content/guides/sample-guide.md
create mode 100644 apps/kb/src/layouts/GuideLayout.astro
create mode 100644 apps/kb/src/pages/guides/[...slug].astro
diff --git a/apps/kb/package.json b/apps/kb/package.json
index 109857da3d7f4..4e440f7e8bbe1 100644
--- a/apps/kb/package.json
+++ b/apps/kb/package.json
@@ -14,6 +14,7 @@
"dependencies": {
"@astrojs/react": "^6.0.4",
"astro": "^7.2.6",
+ "lucide-react": "*",
"react": "catalog:",
"react-dom": "catalog:",
"ui": "workspace:*"
diff --git a/apps/kb/src/components/Nav.tsx b/apps/kb/src/components/Nav.tsx
index 268a5953a1e87..d28f765a059c4 100644
--- a/apps/kb/src/components/Nav.tsx
+++ b/apps/kb/src/components/Nav.tsx
@@ -30,7 +30,7 @@ const menus = [
]
const triggerClass =
- 'h-(--header-height) p-2 border-transparent font-normal rounded-none text-foreground-light hover:text-foreground data-open:text-foreground! border-0 focus-ring focus-visible:text-foreground h-full focus-visible:rounded-sm shadow-none!'
+ 'h-(--header-height) p-2 bg-transparent border-transparent font-normal rounded-none text-foreground-light hover:text-foreground data-open:text-foreground! border-0 focus-ring focus-visible:text-foreground h-full focus-visible:rounded-sm shadow-none!'
// docs gates this at `md:absolute` (its own base component class) because its
// nav is hidden entirely below `lg` in favor of a separate mobile menu. kb
// doesn't have that split — the nav is always visible — so `absolute` is
diff --git a/apps/kb/src/content.config.ts b/apps/kb/src/content.config.ts
new file mode 100644
index 0000000000000..92612a16b7949
--- /dev/null
+++ b/apps/kb/src/content.config.ts
@@ -0,0 +1,18 @@
+import { defineCollection } from 'astro:content'
+import { glob } from 'astro/loaders'
+import { z } from 'astro/zod'
+
+// Every entry here is rendered through GuideLayout by
+// src/pages/guides/[...slug].astro — dropping a new file in
+// src/content/guides doesn't need any per-file layout wiring.
+const guides = defineCollection({
+ loader: glob({ pattern: '**/*.md', base: './src/content/guides' }),
+ schema: z.object({
+ title: z.string(),
+ description: z.string().optional(),
+ topics: z.array(z.string()).optional(),
+ github_url: z.string().optional(),
+ }),
+})
+
+export const collections = { guides }
diff --git a/apps/kb/src/content/guides/sample-guide.md b/apps/kb/src/content/guides/sample-guide.md
new file mode 100644
index 0000000000000..6a69b4987bc2c
--- /dev/null
+++ b/apps/kb/src/content/guides/sample-guide.md
@@ -0,0 +1,81 @@
+---
+title: 'Markdown elements sample'
+description: 'A lorem ipsum sample guide exercising every base Markdown element supported by the guide layout.'
+topics: ['example', 'markdown']
+github_url: 'https://github.com/supabase/supabase/discussions/0000000'
+---
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor
+incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
+nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+
+## Heading level 2
+
+Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
+eu fugiat nulla pariatur. This paragraph mixes **bold text**, _italic text_,
+**_bold italic text_**, ~~strikethrough text~~, and `inline code`.
+
+### Heading level 3
+
+Here's a [link to the Astro docs](https://docs.astro.build/en/basics/layouts/),
+followed by an unordered list with a nested list:
+
+- Excepteur sint occaecat cupidatat non proident
+- Sunt in culpa qui officia deserunt mollit anim id est laborum
+ - Nested item one
+ - Nested item two
+- Curabitur blandit tempus porttitor
+
+#### Heading level 4
+
+And an ordered list with a nested list:
+
+1. Lorem ipsum dolor sit amet
+2. Consectetur adipiscing elit
+ 1. Nested step one
+ 2. Nested step two
+3. Sed do eiusmod tempor incididunt
+
+##### Heading level 5
+
+> Neque porro quisquam est qui dolorem ipsum quia dolor sit amet,
+> consectetur, adipisci velit.
+>
+> > Nested blockquote: at vero eos et accusamus et iusto odio dignissimos.
+
+###### Heading level 6
+
+A fenced code block with a language tag:
+
+```js
+function add(a, b) {
+ return a + b
+}
+
+console.log(add(2, 3))
+```
+
+And another in a different language:
+
+```bash
+npm install
+npm run dev
+```
+
+A table:
+
+| Element | Supported | Notes |
+| -------- | --------- | ---------------------------- |
+| Headings | Yes | h2 through h6 |
+| Tables | Yes | via GitHub-flavored Markdown |
+| Images | Yes | see below |
+
+An image:
+
+
+
+---
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium
+doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore
+veritatis et quasi architecto beatae vitae dicta sunt explicabo.
diff --git a/apps/kb/src/layouts/GuideLayout.astro b/apps/kb/src/layouts/GuideLayout.astro
new file mode 100644
index 0000000000000..49b82d04b1cf3
--- /dev/null
+++ b/apps/kb/src/layouts/GuideLayout.astro
@@ -0,0 +1,39 @@
+---
+import { Github } from 'lucide-react'
+import { Badge } from 'ui'
+
+import Layout from './Layout.astro'
+
+interface Props {
+ title: string
+ description?: string
+ topics?: string[]
+ github_url?: string
+}
+
+const { title, description, topics = [], github_url } = Astro.props
+---
+
+
+
+ {title}
+ {description && {description}
}
+ {
+ topics.length > 0 && (
+
+ {topics.map((topic) => {topic})}
+
+ )
+ }
+
+ {
+ github_url && (
+
+
+ Go to the GitHub discussion
+
+
+ )
+ }
+
+
diff --git a/apps/kb/src/layouts/Layout.astro b/apps/kb/src/layouts/Layout.astro
index fc04f9e14e599..b49bd21652003 100644
--- a/apps/kb/src/layouts/Layout.astro
+++ b/apps/kb/src/layouts/Layout.astro
@@ -1,6 +1,13 @@
---
import { Header } from '../components/Header'
import '../styles/globals.css'
+
+interface Props {
+ title: string
+ description?: string
+}
+
+const { title, description } = Astro.props
---
@@ -9,6 +16,7 @@ import '../styles/globals.css'
+ {description && }