From e78e808195381a3d0491572c07d8e216a037a976 Mon Sep 17 00:00:00 2001 From: Mohamed Tayeb Mokni Date: Mon, 25 May 2026 15:48:20 +0200 Subject: [PATCH 1/4] feat(admin/marketplace): restyle catalogue to "Living systems" brand MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply paper-and-forest brand tokens to the catalogue browse page: the headline lands as "Marketplace catalogue." with the italic-serif accent on "catalogue", an emerald eyebrow, and a Geist lead. Filter chips toggle to emerald-soft when active; sort chips swap to a solid ink fill so the two chip rows read distinctly. MarketplaceCard sits on paper-2 with a paper-3 thumb glyph well, Archivo display title, Geist tagline, monospace slug, and a lavender-soft capability chip. Rating stars are emerald-deep on cream — the alive green that runs across the marketplace surface. Tokens used: --paper, --paper-2, --paper-3, --border, --emerald-deep, --emerald-soft, --lavender-soft, --lavender-deep, --fg-muted, --fg-subtle, --r-md, --r-lg, --r-pill, --sh-xs, --sh-md, --sh-focus, --font-display, --font-sans, --font-mono, --t-lg, --t-sm, --t-xs. Signed-off-by: Mohamed Tayeb Mokni --- .../marketplace/MarketplaceClient.tsx | 88 ++++++--- .../components/MarketplaceCard.tsx | 174 ++++++++++++------ .../marketplace/components/RatingStars.tsx | 32 +++- .../app/(authenticated)/marketplace/page.tsx | 58 ++++-- 4 files changed, 248 insertions(+), 104 deletions(-) diff --git a/apps/admin/src/app/(authenticated)/marketplace/MarketplaceClient.tsx b/apps/admin/src/app/(authenticated)/marketplace/MarketplaceClient.tsx index 1503e31d..b9c0915d 100644 --- a/apps/admin/src/app/(authenticated)/marketplace/MarketplaceClient.tsx +++ b/apps/admin/src/app/(authenticated)/marketplace/MarketplaceClient.tsx @@ -11,6 +11,14 @@ * We intentionally don't fan out to the API client-side: keeping the * fetch on the server keeps cookie forwarding straightforward and * lets server data take precedence over stale client state. + * + * Brand + * ===== + * Search lives inside a cream `--paper-2` shell with an emerald focus + * halo (`--sh-focus`). Category chips toggle to emerald when active — + * the "alive" affordance for an applied filter. Sort chips swap to a + * solid ink fill (the "primary" accent) so the two chip rows don't + * fight each other for emphasis. */ import { useRouter, useSearchParams } from 'next/navigation'; @@ -30,45 +38,73 @@ const styles: Record = { gap: 12, alignItems: 'center', flexWrap: 'wrap', - marginBottom: 16, + marginBottom: 24, }, search: { flex: '1 1 240px', - padding: '8px 10px', - border: '1px solid var(--color-border, #e4e6ea)', - borderRadius: 6, - fontSize: 14, + padding: '10px 12px', + background: 'var(--paper-2)', + border: '1px solid var(--border)', + borderRadius: 'var(--r-md)', + fontFamily: 'var(--font-sans)', + fontSize: 'var(--t-sm)', + color: 'var(--ink)', + outline: 'none', + transition: + 'background var(--dur) var(--ease), border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease)', + }, + chipsLabel: { + fontFamily: 'var(--font-sans)', + fontSize: 'var(--t-xs)', + color: 'var(--fg-subtle)', + fontWeight: 500, + letterSpacing: '0.04em', + textTransform: 'uppercase', + marginRight: 4, }, chips: { display: 'inline-flex', gap: 6, flexWrap: 'wrap', + alignItems: 'center', }, chip: { - padding: '4px 10px', - border: '1px solid var(--color-border, #e4e6ea)', - borderRadius: 999, - background: '#ffffff', - fontSize: 12, + padding: '5px 12px', + background: 'var(--paper-2)', + border: '1px solid var(--border)', + borderRadius: 'var(--r-pill)', + fontFamily: 'var(--font-sans)', + fontSize: 'var(--t-xs)', + fontWeight: 500, + color: 'var(--fg-muted)', cursor: 'pointer', - color: 'var(--color-text, #1c2024)', + transition: + 'background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease)', + }, + chipActiveEmerald: { + background: 'var(--emerald-soft)', + color: 'var(--emerald-deep)', + borderColor: 'var(--emerald-soft)', }, - chipActive: { - background: '#3730a3', - color: '#ffffff', - borderColor: '#3730a3', + chipActiveInk: { + background: 'var(--ink)', + color: 'var(--paper)', + borderColor: 'var(--ink)', }, grid: { display: 'grid', - gridTemplateColumns: 'repeat(auto-fill, minmax(260px, 1fr))', - gap: 16, + gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))', + gap: 18, }, empty: { - padding: 32, - border: '1px dashed var(--color-border, #e4e6ea)', - borderRadius: 8, + padding: 48, + background: 'var(--paper-2)', + border: '1px dashed var(--border)', + borderRadius: 'var(--r-lg)', textAlign: 'center', - color: 'var(--color-text-muted, #6b7280)', + color: 'var(--fg-muted)', + fontFamily: 'var(--font-sans)', + fontSize: 'var(--t-sm)', }, }; @@ -147,16 +183,17 @@ export function MarketplaceClient({ type="search" value={q} onChange={onSearch} - placeholder="Search plugins…" + placeholder="Search 1,240+ themes & extensions" aria-label="Search the marketplace" style={styles.search} />
+ Category