From 4bda3bfe72e21ed96fda421bb34f3be2a0f1616c Mon Sep 17 00:00:00 2001
From: Danny White <3104761+dnywh@users.noreply.github.com>
Date: Tue, 28 Jul 2026 01:12:13 -0400
Subject: [PATCH 1/4] refactor(docs): unify homepage icon link tiles (#48317)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## 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?
Docs UI refactor.
## What is the current behavior?
Framework quickstarts and several other homepage grids used `IconPanel`
/ `IconPanelWithIconPicker`, which brought redundant tooltips
(duplicating the visible title), inconsistent hover treatment, and
circular icon tiles that didn't match the intended squarish look.
| Before |
| --- |
|
- Start with a framework quickstart and connect your project in minutes.
+ Start with a quickstart guide to connect your project in minutes.
|
## What is the new behavior?
Introduces a shared `IconLink` used across the docs homepage (and
reference index) so icon+label tiles share the same composition and
hover: icon tile fill matches the surrounding surface (`surface-100`),
with a stronger border on hover, and the row uses `hover:bg-accent`.
Framework quickstarts keep the larger tile size; other sections keep the
smaller size. Also aligns Explore more GlassPanels with Build your
backend by using the same bordered background treatment.
| After |
| --- |
|
|
## Additional context
Removes the unused `IconPanelWithIconPicker` wrapper now that
homepage/reference consumers go through `IconLink`.
## Summary by CodeRabbit
* **New Features**
* Added reusable `IconLink` UI for consistent docs tiles, including
`IconLinkList`, menu icon, and light/dark icon rendering.
* Introduced `FrameworkQuickstarts` to generate quickstart links based
on feature-flag-enabled SDKs.
* **UI / Improvements**
* Updated the docs home and API reference pages to use the new
list-based icon-link layout.
* Refreshed migration guides and “Explore more”/self-hosting sections
(including accessibility and updated CTA text).
* **Bug Fixes**
* Migration guide items now omit entries missing required details.
* **Chores / Cleanup**
* Removed the older icon panel picker-based UI component and its usage.
---
apps/docs/app/page.tsx | 130 +++++++++---------
apps/docs/app/reference/page.tsx | 72 +++++-----
apps/docs/components/FrameworkQuickstarts.tsx | 92 +++++++++++++
apps/docs/components/HomePageCover.tsx | 121 +---------------
apps/docs/features/ui/IconLink.tsx | 111 +++++++++++++++
.../features/ui/IconPanelWithIconPicker.tsx | 14 --
6 files changed, 301 insertions(+), 239 deletions(-)
create mode 100644 apps/docs/components/FrameworkQuickstarts.tsx
create mode 100644 apps/docs/features/ui/IconLink.tsx
delete mode 100644 apps/docs/features/ui/IconPanelWithIconPicker.tsx
diff --git a/apps/docs/app/page.tsx b/apps/docs/app/page.tsx
index 031a06a61a47b..76a6fb6b16aae 100644
--- a/apps/docs/app/page.tsx
+++ b/apps/docs/app/page.tsx
@@ -2,13 +2,12 @@ import { isFeatureEnabled } from 'common'
import { type Metadata, type ResolvingMetadata } from 'next'
import Link from 'next/link'
import { cn } from 'ui'
-import { IconPanel } from 'ui-patterns/IconPanel'
import { TextLink } from 'ui-patterns/TextLink'
-import { FrameworkQuickstarts } from '@/components/HomePageCover'
+import { FrameworkQuickstarts } from '@/components/FrameworkQuickstarts'
import { MIGRATION_PAGES } from '@/components/Navigation/NavigationMenu/NavigationMenu.constants'
import { GlassPanelWithIconPicker } from '@/features/ui/GlassPanelWithIconPicker'
-import { IconPanelWithIconPicker } from '@/features/ui/IconPanelWithIconPicker'
+import { IconLinkImage, IconLinkList, IconLinkMenuIcon } from '@/features/ui/IconLink'
import HomeLayout from '@/layouts/HomeLayout'
import { BASE_PATH } from '@/lib/constants'
@@ -88,31 +87,26 @@ const postgresIntegrations = [
title: 'AI & Vectors',
icon: 'ai',
href: '/guides/ai',
- description: 'AI toolkit to manage embeddings',
},
{
title: 'Cron',
icon: 'cron',
href: '/guides/cron',
- description: 'Schedule and monitor recurring Jobs',
},
{
title: 'Queues',
icon: 'queues',
href: '/guides/queues',
- description: 'Durable Message Queues with guaranteed delivery',
},
{
title: 'Data REST API',
icon: 'rest',
href: '/guides/api',
- description: 'Access your database through a RESTful API.',
},
{
title: 'GraphQL API',
icon: 'graphql',
href: '/guides/graphql',
- description: 'Access your database through a GraphQL API.',
},
]
@@ -224,6 +218,20 @@ const additionalResources = [
},
]
+const migrationGuides = [...MIGRATION_PAGES]
+ .sort((a, b) => (a.name || '').localeCompare(b.name || ''))
+ .flatMap((guide) => {
+ if (!guide.name || !guide.url || typeof guide.icon !== 'string') return []
+
+ return [
+ {
+ title: guide.name,
+ href: guide.url,
+ icon: