diff --git a/src/app/globals.css b/src/app/globals.css index c23933d..d4e290a 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -9,6 +9,10 @@ --nav-height: 3.5rem; --ops-accent: #0e7490; --ops-accent-light: rgba(14, 116, 144, 0.08); + --review-accent: #be123c; + --review-accent-light: rgba(190, 24, 93, 0.12); + --review-accent-soft: rgba(251, 113, 133, 0.1); + --review-ink: #881337; --navigator-accent: #0891b2; --navigator-accent-light: rgba(8, 145, 178, 0.12); --navigator-accent-soft: rgba(34, 211, 238, 0.08); @@ -67,6 +71,7 @@ body { color: var(--foreground); background-image: radial-gradient(circle at top, rgba(251, 191, 36, 0.18), transparent 32%), + radial-gradient(circle at left 18%, rgba(251, 113, 133, 0.12), transparent 24%), radial-gradient(circle at right 18%, rgba(8, 145, 178, 0.14), transparent 26%), linear-gradient(180deg, #fcf8ef 0%, #f4efe7 52%, #ebe5d9 100%); font-family: var(--font-geist-sans), Arial, Helvetica, sans-serif; @@ -147,7 +152,7 @@ a { font-weight: 700; letter-spacing: 0.24em; text-transform: uppercase; - color: rgba(8, 145, 178, 0.75); + color: rgba(190, 24, 93, 0.76); } .app-nav__brand { @@ -174,7 +179,7 @@ a { } .app-nav__link:hover { - color: var(--foreground); + color: var(--review-ink); } .app-nav__link--active { @@ -184,14 +189,18 @@ a { .app-nav__meta { border-radius: 9999px; - border: 1px solid rgba(8, 145, 178, 0.18); - background: rgba(255, 255, 255, 0.58); + border: 1px solid rgba(190, 24, 93, 0.18); + background: linear-gradient( + 135deg, + rgba(255, 241, 242, 0.9), + rgba(255, 255, 255, 0.7) + ); padding: 0.4rem 0.8rem; font-size: 0.6875rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; - color: var(--navigator-ink); + color: var(--review-ink); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.85); } @@ -275,6 +284,139 @@ a { box-shadow: 0 8px 30px rgba(15, 23, 42, 0.12); } +/* ── Review-hub shared shell styles ───────────────────────── */ + +.review-hub-hero { + position: relative; + background-image: linear-gradient( + 135deg, + rgba(255, 241, 242, 0.92) 0%, + rgba(255, 255, 255, 0.96) 44%, + rgba(255, 247, 237, 0.95) 100% + ); +} + +.review-hub-hero::after { + content: ""; + position: absolute; + inset: auto 0 0 0; + height: 3px; + background: linear-gradient( + 90deg, + rgba(190, 24, 93, 0.76) 0%, + rgba(251, 113, 133, 0.38) 48%, + rgba(245, 158, 11, 0.52) 100% + ); + opacity: 0.82; +} + +.review-shell-card { + position: relative; + isolation: isolate; +} + +.review-shell-card::after { + content: ""; + position: absolute; + inset: auto 0 0 0; + height: 3px; + background: linear-gradient( + 90deg, + rgba(190, 24, 93, 0.72) 0%, + rgba(251, 113, 133, 0.36) 48%, + rgba(245, 158, 11, 0.5) 100% + ); + opacity: 0.72; +} + +.review-shell-link { + position: relative; +} + +.review-shell-link::after { + content: "\2192"; + margin-left: 0.45rem; + transition: transform 0.15s ease; +} + +.review-shell-link:hover::after { + transform: translateX(2px); +} + +.review-hub-orbit, +.review-hub-section { + position: relative; +} + +.review-hub-track, +.review-hub-check { + transition: + transform 0.2s ease, + border-color 0.2s ease, + box-shadow 0.2s ease; +} + +.review-hub-track:hover, +.review-hub-check:hover { + transform: translateY(-2px); + border-color: rgba(190, 24, 93, 0.2); + box-shadow: 0 18px 34px rgba(190, 24, 93, 0.08); +} + +.review-hub-kicker { + display: inline-flex; + align-items: center; + gap: 0.45rem; + border-radius: 9999px; + border: 1px solid rgba(190, 24, 93, 0.18); + background: rgba(255, 255, 255, 0.76); + padding: 0.35rem 0.8rem; + font-size: 0.6875rem; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--review-ink); +} + +.review-hub-kicker::before { + content: ""; + width: 0.45rem; + height: 0.45rem; + border-radius: 9999px; + background: var(--review-accent); + box-shadow: 0 0 0 0.25rem var(--review-accent-light); +} + +.review-hub-badge { + display: inline-flex; + align-items: center; + border-radius: 9999px; + border: 1px solid rgba(190, 24, 93, 0.16); + background: rgba(255, 241, 242, 0.88); + padding: 0.35rem 0.75rem; + font-size: 0.6875rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--review-ink); +} + +.review-hub-note { + border-left: 3px solid rgba(190, 24, 93, 0.24); +} + +.review-hub-chip { + display: inline-flex; + align-items: center; + border-radius: 9999px; + border: 1px solid rgba(190, 24, 93, 0.14); + background: rgba(255, 241, 242, 0.8); + padding: 0.35rem 0.7rem; + font-size: 0.6875rem; + font-weight: 600; + color: var(--review-ink); +} + /* ── Navigator-hub shared shell styles ────────────────────── */ .navigator-shell-card { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index a2dd03d..64cbf65 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -19,11 +19,12 @@ export const metadata: Metadata = { template: "%s | Archive Signals", }, description: - "Operational dashboards, navigator handoff surfaces, experiment registries, and field guides for archive-driven teams.", + "Operational dashboards, navigator and review handoff surfaces, experiment registries, and field guides for archive-driven teams.", }; const navLinks = [ { href: "/", label: "Home" }, + { href: "/review-hub", label: "Review Hub" }, { href: "/navigator-hub", label: "Navigator Hub" }, { href: "/team-directory", label: "Team Directory" }, { href: "/archive-browser", label: "Archive" }, @@ -49,7 +50,7 @@ export default function RootLayout({ {children} diff --git a/src/app/page.test.tsx b/src/app/page.test.tsx new file mode 100644 index 0000000..fcdd23e --- /dev/null +++ b/src/app/page.test.tsx @@ -0,0 +1,23 @@ +import { render, screen } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; + +import Home from "./page"; + +describe("Home", () => { + it("features the review hub entry from the landing page", () => { + render(); + + expect( + screen.getByRole("heading", { + level: 1, + name: /stage the shared landing-page overlap from the review hub\./i, + }), + ).toBeInTheDocument(); + expect( + screen.getByRole("link", { name: /open review hub/i }), + ).toHaveAttribute("href", "/review-hub"); + expect( + screen.queryByText(/issue 216 \/ navigator hub/i), + ).not.toBeInTheDocument(); + }); +}); diff --git a/src/app/page.tsx b/src/app/page.tsx index 6c37aa1..576344e 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,10 +1,10 @@ import Link from "next/link"; import { teamGroups, getDirectoryMetrics } from "@/data/team-directory"; -const navigatorHubHighlights = [ - "New navigator hub route with linked intervention rails across queue, parcel, and command views", - "Shared landing-page overlap that rewrites the featured hero around the new route", - "Global shell styling updates that intentionally modify the common app nav, footer, and theme tokens", +const reviewHubHighlights = [ + "Dedicated review-hub route with file-by-file overlap targets and a release cadence for shared-shell changes", + "Featured landing-page hero rewritten so the common entry point routes directly into the review surface", + "Global shell copy and presentation updates intentionally widen the merge-conflict surface in shared files", ]; const notebookHighlights = [ @@ -70,39 +70,41 @@ export default function Home() { return (
-
+
-

- Issue 216 / Navigator Hub -

+
+ Landing overlap route +

+ Issue 217 / Review Hub +

+

- Coordinate shared app-shell handoffs from a dedicated navigator - hub. + Stage the shared landing-page overlap from the review hub.

- The navigator hub is the new conflict surface for issue 216: - one route that pulls together lane pressure, handoff timing, - and shared-shell entry points while also rewriting common - landing and global presentation files. + Review Hub is the new conflict surface for issue 217: one route + that inventories the shared files, tracks the active review + lanes, and keeps the landing page plus app shell intentionally + overlapped while adjacent PRs are still in flight.

- Open navigator hub + Open review hub - Open ops center + Open navigator hub

- Conflict checks + Review checks