diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock index 9515844d..c19b7653 100644 --- a/.claude/scheduled_tasks.lock +++ b/.claude/scheduled_tasks.lock @@ -1 +1 @@ -{"sessionId":"6a9a5167-b0ff-4343-bb2f-c351be2b9d80","pid":26550,"acquiredAt":1778248347508} \ No newline at end of file +{"sessionId":"5394fd24-2c0e-4283-be73-5c2f3db6eb97","pid":28223,"acquiredAt":1783688629894} \ No newline at end of file diff --git a/Aster.svg b/Aster.svg new file mode 100644 index 00000000..13845d55 --- /dev/null +++ b/Aster.svg @@ -0,0 +1,25 @@ + diff --git a/drift.png b/drift.png new file mode 100644 index 00000000..a9c57c05 Binary files /dev/null and b/drift.png differ diff --git a/gem_wallet.jpeg b/gem_wallet.jpeg new file mode 100644 index 00000000..10ed9e5e Binary files /dev/null and b/gem_wallet.jpeg differ diff --git a/public/logos/paradex.jpg b/paradex.jpg similarity index 100% rename from public/logos/paradex.jpg rename to paradex.jpg diff --git a/senpi.png b/senpi.png new file mode 100644 index 00000000..13cb380d Binary files /dev/null and b/senpi.png differ diff --git a/src/app/products/[slug]/page.tsx b/src/app/products/[slug]/page.tsx index ce9957c7..0c802edb 100644 --- a/src/app/products/[slug]/page.tsx +++ b/src/app/products/[slug]/page.tsx @@ -566,9 +566,9 @@ export default async function ProviderPage({ // KPI domain sections. A product can belong to up to five KPI // domains (perp venue, PM venue, PM data feed, HL builder, RPC // provider). Every domain with data joins ONE pill bar so all - // stay reachable on the same page; with a single domain the - // section renders directly, no toggle bar (VenueKpiToggle - // handles both cases). Availability is resolved before render: + // stay reachable on the same page; the bar renders even for a + // single domain so the section is always labeled with its KPI + // family. Availability is resolved before render: // perpContext / pmContext / hlStats above, hasRpcData for the // rpc-hub snapshot. const sections: { id: string; label: string; content: React.ReactNode }[] = []; diff --git a/src/components/venue-kpi-toggle.tsx b/src/components/venue-kpi-toggle.tsx index 5e8c5d4d..5d7aa6f2 100644 --- a/src/components/venue-kpi-toggle.tsx +++ b/src/components/venue-kpi-toggle.tsx @@ -9,10 +9,12 @@ import { useState } from "react"; * components rendered by the page and passed in as ReactNode content, * so switching tabs costs zero network round trips. * - * With a single section the content renders directly (a one-button - * toggle bar would be noise); with none, nothing. Inactive sections - * stay in the DOM under `hidden` so tab switches are instant and - * anchors keep working. + * The bar renders whenever at least one section exists, so a single + * domain still shows its labeled pill: the label tells the reader which + * KPI family they are looking at, and additional pills appear the day + * the product gains data in another domain. Inactive sections stay in + * the DOM under `hidden` so tab switches are instant and anchors keep + * working. * * Pill styling mirrors PmHubTabs / PerpHubTabs. */ @@ -31,7 +33,6 @@ export function VenueKpiToggle({ const [active, setActive] = useState(sections[0]?.id ?? ""); if (sections.length === 0) return null; - if (sections.length === 1) return <>{sections[0].content}>; return (