Skip to content

Add Ecosystem Partners directory page#594

Merged
JoaquinBN merged 1 commit intodevfrom
JoaquinBN/ecosystem-partners
May 4, 2026
Merged

Add Ecosystem Partners directory page#594
JoaquinBN merged 1 commit intodevfrom
JoaquinBN/ecosystem-partners

Conversation

@JoaquinBN
Copy link
Copy Markdown
Collaborator

Summary

  • New public Ecosystem Partners page (/ecosystem-partners) that aggregates three audiences in a single grid: organisations from a new partners directory, graduated validators (existing API), and projects (Featured Builds).
  • New partners Django app with a public read-only API and an initial migration that seeds 22 founding partners with Cloudinary-hosted logos.
  • New Discover group in the sidebar (desktop + mobile) and a View all deep-link from Featured Builds → Projects tab.

What's in the UI

  • Tinted hero card, three stat hexagons (counts rounded down to the nearest 10), category-tinted tab pills (Partners black / Validators blue / Projects orange), uniform square logo grid, soft gradient footer banner.
  • Cards: partners on a black logo circle, validators/projects on a white circle with a deterministic per-name gradient fallback when no image is available. External links open in a new tab; validator profile links navigate in-app.
  • All-tab uses a stable hash-based shuffle so the same item always appears in the same slot across renders and Load more.

What's NOT in this PR

Gen TV is intentionally out of scope and will follow in a separate PR.

Test plan

  • `python manage.py migrate partners` on a fresh DB and confirm 22 partners exist
  • `python manage.py test partners` passes
  • `GET /api/v1/partners/` returns the seeded partners
  • `GET /api/v1/partners/zksync/` returns the partner detail
  • Visit `/ecosystem-partners`, switch tabs, hit Load more, verify all three categories render
  • On the home page, click `View all` in Featured Builds → lands on `/ecosystem-partners?tab=project` with the Projects tab pre-selected
  • Sidebar `Ecosystem Partners` entry is highlighted when on the page (desktop + mobile)

Introduces a public Ecosystem Partners surface that aggregates three
audiences in one grid: organisations from the new partners directory,
graduated validators pulled from the existing validators API, and
projects pulled from Featured Builds. The page ships with a tinted
hero, a three-stat row (with rounded "20+" counts), tinted category
tabs (Partners / Validators / Projects), a uniform square logo grid
that opens external links in a new tab and validator profile pages
in-app, and a soft gradient footer banner that blends with the page
background. Adds a "View all" link in the home page Featured Builds
section that deep-links into the Projects tab.

Backend ships a small `partners` Django app: a `Partner` model
(name/slug/description/logo_url/website_url/url/display_order/is_active)
exposed via a public `ReadOnlyModelViewSet` with slug lookup. The
initial migration also seeds the 22 founding partners with their
Cloudinary-hosted logos so fresh databases come up populated.

Frontend introduces a new `Discover` group in the sidebar (desktop +
mobile) and a `PartnerCard` component under `components/portal/partners`.
Cards render partner logos on a black circle, validator/project items
on a white circle that falls back to a deterministic gradient when no
image is available. The "All" tab interleaves the three categories
with a stable shuffle so the same item always appears in the same
slot across renders and Load more.

- backend/partners/: New Django app with Partner model, light/full serializers, public ReadOnlyModelViewSet (slug lookup, search + ordering filters), admin config, and tests/test_partners.py covering ordering and slug-based detail lookup.
- backend/partners/migrations/0001_initial.py: Creates Partner table and seeds 22 founding partners via RunPython using update_or_create keyed by slug; also deletes legacy example/second placeholder rows.
- backend/api/urls.py: Registers PartnerViewSet on the router under `partners`.
- backend/tally/settings.py: Adds `partners` to INSTALLED_APPS.
- backend/CLAUDE.md: Adds Partners section, partners endpoints to the summary, and the new app to the project tree.
- frontend/src/lib/api.js: Adds `partnersAPI` with `list` and `get(slug)`.
- frontend/src/routes/EcosystemPartners.svelte: New page that fetches from `partnersAPI.list()`, `validatorsAPI.getNewestValidators(200)`, and `featuredAPI.getBuilds()` in parallel, normalises into a uniform `{ id, slug, name, logo_url, href, isExternal, category }` shape, and renders the hero/stats/tabs/grid/footer described above. Reads `?tab=` from the URL via svelte-spa-router `querystring` so deep links to a category work.
- frontend/src/components/portal/partners/PartnerCard.svelte: Reusable square card with rounded logo container, hover frosted name strip, per-category badge color, and per-name gradient fallback for missing images.
- frontend/src/components/portal/FeaturedBuilds.svelte: Adds a `View all` link in the section header pointing at `#/ecosystem-partners?tab=project`.
- frontend/src/components/Sidebar.svelte: Adds a `Discover` section header and an `Ecosystem Partners` entry in both the desktop and mobile sidebars, using a connected-nodes SVG icon and the `#6D5DD3` accent.
- frontend/src/stores/category.js: `detectCategoryFromRoute` now recognises `/ecosystem-partners` (returns `global`).
- frontend/src/App.svelte: Imports `EcosystemPartners` and mounts it at `/ecosystem-partners`.
- frontend/CLAUDE.md: Documents the new route, the `partnersAPI` entry, and the partners components directory.
@JoaquinBN JoaquinBN force-pushed the JoaquinBN/ecosystem-partners branch from 406d450 to 4d917a6 Compare May 4, 2026 15:37
@JoaquinBN JoaquinBN merged commit 788b664 into dev May 4, 2026
@JoaquinBN JoaquinBN deleted the JoaquinBN/ecosystem-partners branch May 4, 2026 15:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant