feat(www): partners landing page (#47874)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Added a redesigned Partners page with partnership options, benefits,
application steps, FAQs, integration resources, and featured partners.
- Added an on-page partner application form with questions tailored to
the selected partnership type.
- Added a confirmation message with next steps and a link to the OAuth
integration guide.
- **Bug Fixes**
- Updated partner application links to open the form on the Partners
page.
  - Added support for checkbox-group fields in forms.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Alan Daniel <stylesshjs@gmail.com>
Co-authored-by: Alex Hall <alex.hall@supabase.io>
Co-authored-by: Dion Zeneli <101271736+Dionysos288@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-09-25 15:53:32 +02:00
1 parent 0e6fff6760
commit 51a167d910
28 files changed
+2133 -414

No files matched your search

@@ -0,0 +1,60 @@
name: Partner intake form / HubSpot sync check
# Deliberately its own workflow, path-filtered to only the files this check
# actually concerns — NOT part of www-tests.yml's `pnpm test` run, which
# gates every apps/www PR. A HubSpot-side change surfaced by the scheduled
# www-partner-form-sync.yml bot PR (which touches only the generated
# snapshot) should fail *this* check, not block unrelated apps/www work.
on:
pull_request:
branches: ['master']
paths:
- 'apps/www/components/Partners/PartnerIntakeForm.fields.ts'
- 'apps/www/components/Partners/PartnerIntakeForm.sync.test.ts'
- 'apps/www/components/Partners/__generated__/partner-intake-form.hubspot.json'
- 'apps/www/lib/staticFormCrm.ts'
- 'apps/www/vitest.sync.config.ts'
- 'apps/www/package.json'
- '.github/workflows/www-partner-form-sync-check.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
contents: read
env:
CI: true
jobs:
check:
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
sparse-checkout: |
apps/www
packages
supabase
patches
- uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
name: Install pnpm
with:
run_install: false
- name: Use Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
- name: Install deps
run: pnpm install --frozen-lockfile
- name: Run partner intake form / HubSpot sync check
run: pnpm run test:partner-form-sync
working-directory: ./apps/www
@@ -0,0 +1,78 @@
name: Sync partner intake form from HubSpot
on:
schedule:
# Run at 00:00 UTC every Monday
- cron: '0 0 * * 1'
workflow_dispatch:
permissions:
pull-requests: write
contents: write
jobs:
sync-partner-form:
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
ref: ${{ github.ref }}
sparse-checkout: |
apps/www
packages
patches
- uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
name: Install pnpm
with:
run_install: false
- name: Use Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
- name: Install deps
run: pnpm install --frozen-lockfile
- name: Fetch the live HubSpot form and regenerate the snapshot
run: pnpm run sync:partner-form
working-directory: ./apps/www
- name: Generate token
id: app-token
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.GH_AUTOFIX_APP_CLIENT_ID }}
private-key: ${{ secrets.GH_AUTOFIX_PRIVATE_KEY }}
permission-pull-requests: write
permission-contents: write
# Only opens/updates a PR when the regenerated snapshot actually
# differs from what's committed — i.e. only when the live HubSpot form
# has changed since the last sync. The PR's existence is the drift
# alert: PartnerIntakeForm.sync.test.ts (run by the normal
# www-tests.yml suite on this PR) fails until a human reconciles
# PartnerIntakeForm.tsx / staticFormCrm.ts with the new snapshot.
- name: Create pull request
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0
with:
token: ${{ steps.app-token.outputs.token }}
commit-message: 'chore(www): sync partner intake form snapshot from HubSpot'
title: 'chore(www): partner intake form has changed in HubSpot'
body: |
The live "Become a Partner" HubSpot form no longer matches the
checked-in snapshot at
`apps/www/components/Partners/__generated__/partner-intake-form.hubspot.json`.
`PartnerIntakeForm.sync.test.ts` will fail on this PR until
`apps/www/components/Partners/PartnerIntakeForm.fields.ts` and
`apps/www/lib/staticFormCrm.ts` are updated by hand to match —
see the comment at the top of that test for what it checks.
branch: 'gha/auto-sync-partner-intake-form'
base: 'master'
add-paths: |
apps/www/components/Partners/__generated__/partner-intake-form.hubspot.json