From 6430e373b6d923c4563b418bb94d57e7d15fbdf4 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Sat, 15 Aug 2026 12:06:20 +0700 Subject: [PATCH 1/2] fix(landing): let the type scale win, name the two card headings, and reach the reveals by keyboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Ninety-four elements were arguing with the type scale.** Eighty-seven of them put `leading-relaxed` on `text-sm`, which is the site's body copy rung — so almost every 14px paragraph overrode the 1.55 the curve suggested. The overrides were right and the scale was wrong: 14px prose wants more air than a 14px table cell. `--text-sm--line-height` is 1.625 now and the ninety-four are gone. A scale every paragraph has to argue with is not a scale. The seven on `text-base` and non-mono `text-xs` go too — 1.6 against 1.625 says nothing. Two survive, both on mono code blocks, where the extra leading is a real choice about reading code rather than a leftover. **The card heading forked three-to-twenty-three with no rule.** There genuinely are two roles: a heading that titles a cell which *is* the point of that cell — the download panel, a pricing tier — and one that titles a single entry in a list of like things, where a larger size would make every item shout. Both are now named, `PANEL_TITLE` and `ITEM_TITLE`, next to `CELL_DENSITY` where the other cell decisions live. The inconsistency was never that two sizes existed; it was that nothing recorded which was which. **Eight hover reveals had no keyboard equivalent.** Every one sits inside a `group` that is a link, so a keyboard user tabbing to it saw nothing change: the database tile's arrow, three sponsor marks, the engine monogram, and both blog list headings. They pair with `group-focus-within` now. Two of those additions landed outside their `className` on first attempt — a regex that matched across quote boundaries — which typecheck caught in one file and a per-line check caught in the other. Verified after repair that all three sponsor marks kept the parity they were given. --- resources/css/app.css | 9 ++- .../js/components/landing/agents-mcp.tsx | 6 +- .../js/components/landing/architecture.tsx | 6 +- .../js/components/landing/database-grid.tsx | 2 +- .../js/components/landing/depth-grid.tsx | 2 +- .../js/components/landing/footer-cta.tsx | 12 +-- .../js/components/landing/objection-row.tsx | 2 +- .../js/components/landing/open-source.tsx | 2 +- resources/js/components/landing/pricing.tsx | 5 +- resources/js/components/landing/safety.tsx | 2 +- resources/js/components/landing/sponsors.tsx | 8 +- resources/js/components/landing/workbench.tsx | 2 +- resources/js/components/ui/database-mark.tsx | 4 +- resources/js/components/ui/faq-list.tsx | 5 +- resources/js/components/ui/grid-cell.tsx | 15 ++++ resources/js/components/ui/ledger.tsx | 2 +- resources/js/pages/Blog/Index.tsx | 4 +- resources/js/pages/Blog/Post.tsx | 4 +- resources/js/pages/Compare.tsx | 15 ++-- resources/js/pages/DatabaseClient.tsx | 13 ++-- resources/js/pages/Download.tsx | 2 +- resources/js/pages/Privacy.tsx | 73 ++++++++++--------- resources/js/pages/RefundPolicy.tsx | 2 +- resources/js/pages/Terms.tsx | 60 +++++++-------- 24 files changed, 142 insertions(+), 115 deletions(-) diff --git a/resources/css/app.css b/resources/css/app.css index 352d534..e986823 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -44,7 +44,14 @@ --text-xs--line-height: 1.5; --text-xs--letter-spacing: 0.0005em; --text-sm: 0.875rem; - --text-sm--line-height: 1.55; + /* + * 1.625, not the 1.55 the curve suggests. Ninety-four elements overrode it + * with `leading-relaxed`, and the overrides were right: `text-sm` is the + * site's body copy rung, and 14px prose wants more air than a 14px table + * cell. A scale that every prose paragraph has to argue with is not a scale, + * so the scale changed rather than the ninety-four. + */ + --text-sm--line-height: 1.625; --text-sm--letter-spacing: -0.0062em; --text-base: 1rem; --text-base--line-height: 1.6; diff --git a/resources/js/components/landing/agents-mcp.tsx b/resources/js/components/landing/agents-mcp.tsx index 8dc35f0..663ee85 100644 --- a/resources/js/components/landing/agents-mcp.tsx +++ b/resources/js/components/landing/agents-mcp.tsx @@ -7,7 +7,7 @@ import { FullLine } from '@/components/ui/full-line'; import { Ledger, LedgerRow } from '@/components/ui/ledger'; import SectionShell from '@/components/ui/section-shell'; import { relocatedFaq } from '@/data/home-faqs'; -import { cellBorders, type ColumnMap } from '@/components/ui/grid-cell'; +import { ITEM_TITLE, cellBorders, type ColumnMap } from '@/components/ui/grid-cell'; /** Kept byte-identical to the tokenized block below, since this is what gets copied. */ const CONFIG_JSON = `{ @@ -229,8 +229,8 @@ export default function AgentsMcp() { */}
-

{aiSafetyFaq.question}

-

+

{aiSafetyFaq.question}

+

{aiSafetyFaq.answer}

diff --git a/resources/js/components/landing/architecture.tsx b/resources/js/components/landing/architecture.tsx index bc3aee5..49c5831 100644 --- a/resources/js/components/landing/architecture.tsx +++ b/resources/js/components/landing/architecture.tsx @@ -69,7 +69,7 @@ export default function Architecture() { > -

+

Native macOS database clients come in three shapes today. Single database and open source, like Sequel Ace and Postico. Multi database and closed source, like TablePlus. Multi database but not native, like DBeaver on the JVM or Beekeeper Studio and DBGate on Electron.{' '} @@ -95,7 +95,7 @@ export default function Architecture() {

{material.label}

-

+

{material.body}

@@ -116,7 +116,7 @@ export default function Architecture() { className={`${CELL_DENSITY.default} ${cellBorders(i, COLS, BEHAVIOURS.length)} border-rule`} >

{behaviour.title}

-

+

{behaviour.body}

diff --git a/resources/js/components/landing/database-grid.tsx b/resources/js/components/landing/database-grid.tsx index 4de2831..088941a 100644 --- a/resources/js/components/landing/database-grid.tsx +++ b/resources/js/components/landing/database-grid.tsx @@ -281,7 +281,7 @@ export default function DatabaseGrid() { >