Skip to content

Compare pages: premium redesign#5229

Open
NicholasKissel wants to merge 2 commits into
NicholasKissel/cookbook-classical-coversfrom
NicholasKissel/compare-page-premium
Open

Compare pages: premium redesign#5229
NicholasKissel wants to merge 2 commits into
NicholasKissel/cookbook-classical-coversfrom
NicholasKissel/compare-page-premium

Conversation

@NicholasKissel

@NicholasKissel NicholasKissel commented Jun 12, 2026

Copy link
Copy Markdown
Member

Redesigns the /compare pages with the same premium treatment applied to the cookbook: generous whitespace, a consistent eyebrow + heading rhythm, hairline-only chrome, and restrained color.

Changes

Detail pages (/compare/<slug>/)

  • Hero: larger tracked title, text-lg subtitle, primary + ghost CTA pair, and "Last updated" demoted to quiet metadata. Drops the min-h-[60vh] block that left the hero feeling empty.
  • Sections no longer carry full-width border-t separators; rhythm comes from spacing and a shared heading lockup.
  • Overview is now two bordered panels with the Rivet side subtly highlighted (bg-white/[0.03]), refined "When to choose" lists, and a quiet text-link CTA instead of a second button.
  • Feature table: colored icon chips replaced with small status dots (emerald / amber / violet / zinc for yes / partial / coming soon / no), quiet uppercase group headers instead of full-width gray bars, fixed column proportions, edge-aligned first and last columns, and more row breathing room.
  • Verdict gets a lead-paragraph treatment; FAQ aligns left under the same heading system; "Other comparisons" cards match the site card language with arrow affordances.

Hub (/compare/)

  • Masthead matches the detail hero (tracked title + text-lg lede), cards restyled to the same rounded-xl hairline pattern.

No data or copy changes; the page remains a zero-JS server render.

Verification

  • Both detail pages and the hub verified in the browser at desktop width: hero, overview panels, table groups/dots, verdict, FAQ toggles, other-comparisons cards, CTA.
  • No console errors (GitHub stars API 403s are pre-existing rate limiting).

🤖 Generated with Claude Code

NicholasKissel commented Jun 12, 2026

Copy link
Copy Markdown
Member Author

Warning

This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
Learn more

This stack of pull requests is managed by Graphite. Learn more about stacking.

@railway-app

railway-app Bot commented Jun 12, 2026

Copy link
Copy Markdown

🚅 Deployed to the rivet-pr-5229 environment in rivet-frontend

Service Status Web Updated (UTC)
website 😴 Sleeping (View Logs) Web Jun 16, 2026 at 12:39 pm
kitchen-sink ❌ Build Failed (View Logs) Web Jun 14, 2026 at 4:05 am
mcp-hub ✅ Success (View Logs) Web Jun 14, 2026 at 3:56 am
ladle ❌ Build Failed (View Logs) Web Jun 12, 2026 at 8:11 am
frontend-inspector ❌ Build Failed (View Logs) Web Jun 12, 2026 at 8:11 am
frontend-cloud ❌ Build Failed (View Logs) Web Jun 12, 2026 at 8:11 am

@NicholasKissel NicholasKissel changed the title [SLOP(claude-fable-5)] feat(website): premium compare page redesign Compare pages: premium redesign Jun 12, 2026
@NicholasKissel NicholasKissel force-pushed the NicholasKissel/compare-page-premium branch from 4292df7 to e84e4c7 Compare June 12, 2026 08:22
@claude

claude Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Code Review: Compare Pages Premium Redesign

Overview

This PR applies a consistent premium visual treatment to the /compare pages: eyebrow labels, tighter tracking, hairline borders, and a simplified status-dot system. Purely presentational — no data, routing, or business logic changes.


What looks good

  • Component extraction is solid. SectionHeading, ChoiceList, and OverviewPanel reduce duplication well with clear minimal props.
  • STATUS_STYLES record pattern is cleaner than the previous switch statement. Typed as Record<ComparisonStatus, ...> it is exhaustive at compile time — adding a new status value surfaces as a type error. Good replacement for the icon-based switch.
  • align-top on table cells is a meaningful improvement. Multi-line cells in the old design would center-align awkwardly.
  • Column widths sum correctly (18% + 28% + 28% + 26% = 100%).
  • aria-hidden="true" on the arrow span in compare/index.astro is correct.
  • import type { ReactNode } correctly uses type-only import.

Issues

1. Arrow icon inconsistency

compare/index.astro uses a raw HTML arrow character for the card arrow, while OtherComparisonsSection in ComparePage.tsx uses the Icon component. Both animate with transition-transform group-hover:translate-x-0.5 but render differently. Prefer one approach consistently across the two pages.

2. Status dot accessibility

The status dot uses title={label} for labeling. The title attribute is unreliable for screen readers on non-interactive elements. aria-label or role="img" aria-label={label} would be more robust, especially since the old icon-based design provided visible per-status labeling.

3. Row hover state removed from comparison table

The old rows had hover:bg-white/5 transition-colors; the new rows drop it entirely. This is the main table users scan, and removing the hover affordance makes it harder to track across wide rows on desktop. Consider restoring a subtle version such as hover:bg-white/[0.03] to match the overview panel highlight.

4. Magic vertical offset on dot (mt-[7px])

The mt-[7px] value aligns the dot with the first text baseline. This breaks if the surrounding text size or line-height changes. Switching the parent container to items-baseline would be more maintainable.

5. paragraph as React key in VerdictSection (pre-existing)

Using full paragraph text as a key works for static content but breaks silently if two identical paragraphs appear. Switching to index is safe here since the list is never reordered or filtered.


Nits

  • The center boolean prop on SectionHeading works but a className prop giving callsites layout control would be more flexible for future variations.
  • FaqSectionDark is now the only section without a centered heading. Intentional per the description, just worth noting.

Summary

Clean redesign with solid component extraction. The two actionable items before merge are the status dot accessibility (title to aria-label) and the arrow icon inconsistency between the Astro hub and TSX detail pages. The removed hover state on table rows is worth a quick design check. Everything else is correct or a minor nit.

@claude

claude Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Compare Pages: Premium Redesign — Code Review

Overview

This PR redesigns the /compare pages with a refined visual treatment: tighter typography, hairline-only chrome, status-dot indicators in the feature table, and a new light/dark inspector toggle in ObservabilitySection. No data or copy changes. The diff is clean and the component decomposition improves maintainability.


Positives

  • Good component extraction: SectionHeading, OverviewPanel, and ChoiceList replace inline repetition cleanly.
  • FeatureStatus simplification: replacing the switch + mutable variables with a Record<ComparisonStatus, ...> lookup table is the right move. Exhaustive keying means adding a new ComparisonStatus variant will be a TS compile error.
  • Toggle accessibility: the light/dark buttons in ObservabilitySection correctly use aria-label and aria-pressed.
  • Column layout: the four table columns now sum to exactly 100% (18+28+28+26), and edge alignment via pl-0/pr-0 is cleaner than symmetric px-4 on edge cells.

Issues

1. Accessibility regression in FeatureStatus dots (medium)

The status dot only carries meaning through color and a title tooltip:

<span className={`mt-[7px] h-1.5 w-1.5 flex-shrink-0 rounded-full ${dot}`} title={label} />

title is not reliably announced by screen readers and is invisible to keyboard-only users who cannot hover. The old icon-based implementation was also imperfect, but status information is load-bearing on a comparison page. A visually-hidden label fixes this at zero visual cost:

<span className={`mt-[7px] h-1.5 w-1.5 flex-shrink-0 rounded-full ${dot}`} aria-hidden="true" />
<span className="sr-only">{label}</span>

2. PR scope includes an unrelated change (minor)

ObservabilitySection.tsx (Inspector light/dark toggle) is unrelated to the compare-page redesign. Bundling it here makes the diff harder to bisect or revert independently if one part regresses.

3. Arrow affordance inconsistency (minor)

compare/index.astro uses a raw Unicode arrow:

<span aria-hidden="true" class="transition-transform group-hover:translate-x-0.5"></span>

ComparePage.tsx (the "Other comparisons" cards) uses the icon component:

<Icon icon={faArrowRight} className="transition-transform group-hover:translate-x-0.5" />

The hub and detail-page cards are visually identical use-cases and should use the same implementation.

4. Row hover feedback removed from comparison table (low)

The previous hover:bg-white/5 transition-colors on <tr> has been dropped. The table can be very long; row-level hover feedback helps users track which row they are reading. A subtle hover:bg-white/[0.02] would preserve the hairline aesthetic while restoring that affordance.


Nits

  • key={paragraph} in VerdictSection: using the paragraph text as a React key is fragile if two paragraphs share identical content. key={index} (with index as the second .map() argument) is safer for static ordered lists.
  • FAQ heading alignment: the section previously centered its heading; it now renders left-aligned via SectionHeading without center. This looks intentional (left-aligned heading + left-aligned accordion is coherent), but worth confirming.
  • ObservabilitySection.tsx indentation: new lines use 2-space indentation — confirm this matches the file's pre-existing style so Biome does not reformat on the next format pass.

…#5230)

* [SLOP(claude-fable-5)] style(website): align marketing heading weights with cookbook and compare pages

* [SLOP(claude-opus-4-8)] feat(website): swap observability inspector screenshot for light/dark variants with animated toggle

* [SLOP(claude-fable-5)] fix(website): lead marketing copy with agents and run-anywhere positioning

* [SLOP(claude-fable-5)] style(website): unify marketing typography and card system on compare-page primitives

* [SLOP(claude-fable-5)] style(website): remove dated decoration and align blog and timeline with dark design language

* [SLOP(claude-fable-5)] feat(website): enterprise page, self-hosted compare entry, and on-prem cookbook guide

* [SLOP(claude-fable-5)] chore(website): delete dead legacy marketing components

* [SLOP(claude-fable-5)] fix(website): replace custom-runtime framing with standard-stack positioning and drop landing-page Cloudflare callout

* [SLOP(claude-fable-5)] style(website): differentiate landing deploy sections and add visual texture to enterprise page

* [SLOP(claude-fable-5)] refactor(website): fold agent solution page into actors with use-case grid and redirect

* [SLOP(claude-fable-5)] chore(website): remove self-hosted vs managed platforms compare entry

* [SLOP(claude-fable-5)] feat(website): porcelain editorial design system foundation

* [SLOP(claude-fable-5)] feat(website): redesign landing page on porcelain editorial system

* [SLOP(claude-fable-5)] feat(website): porcelain editorial restyle for blog, changelog, cookbook, and legal templates

* [SLOP(claude-fable-5)] feat(website): porcelain restyle for support, oss-friends, 404, startups, and contact forms

* [SLOP(claude-fable-5)] feat(website): porcelain redesign for actors, enterprise, and cloud pricing pages

* [SLOP(claude-fable-5)] feat(website): porcelain redesign for agentOS family and compare pages

* [SLOP(claude-fable-5)] chore(website): final porcelain sweep, retint shared FAQ and copy components, delete dead dark-era components

* [SLOP(claude-fable-5)] fix(website): rebalance hosting section composition with paper command chips and aligned columns

* [SLOP(claude-fable-5)] fix(website): pill treatment for works-with-your-stack links to match deploy row

* [SLOP(claude-opus-4-8-high)] feat(website): documentary-style Ken Burns drift on cookbook covers

* [SLOP(claude-opus-4-8-high)] feat(website): tune cookbook Ken Burns slide per artwork toward each subject

* [SLOP(claude-opus-4-8)] feat(website): porcelain header/docs polish and Rivet Compute pricing calculator

* [SLOP(claude-opus-4-8)] feat(website): actors hero scroll dissolve and marketing polish

* [SLOP(claude-opus-4-8)] fix(website): mobile CTA/menu polish and lag-free actors hero scroll
NicholasKissel added a commit that referenced this pull request Jun 14, 2026
…eting polish (#5257)

Collapses the former stacked PRs (#5219 seo-content-plays, #5228 cookbook-classical-covers, #5229 compare-page-premium, #5230 marketing-heading-weights) into a single PR off `main`, rebased onto the latest trunk. `#5230` was already merged down into `compare-page-premium`; this brings the full body of work straight to `main`.

## What's included
- **Porcelain redesign** — light cool-porcelain theme across marketing pages and docs (header light theme, docs subnav/tabs, prose, selection states), warm-black `ink` text, classical oil-paint imagery.
- **Rivet Compute pricing + calculator** — the `/cloud` pricing page integrates the compute calculator (vCPU / memory / active-hours sliders, live estimate on an ink data-plate), restyled to the porcelain system.
- **Compare page redesign**, **classical-art cookbook covers**, and **SEO content** from the lower stack.
- **Actors hero** — lag-free scroll dissolve (static gradient + opacity animation, no per-frame blur/mask).
- **Mobile polish** — CTA painting fills with full-width contained buttons; mobile menu + docs section headers no longer render white-on-light.

## Merge notes
- Branched off latest `main`; the only content conflict was `PricingPageClient.tsx` (main's standalone calculator vs the redesigned page that already integrated it) — resolved to the redesigned version.
- `main`'s own website changes (e.g. `environment-variables.mdx`) are preserved.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
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