Skip to content

feat(frame): draw the page as a grid with rails, joins and cells - #50

Open
datlechin wants to merge 1 commit into
mainfrom
feat/grid-lines
Open

datlechin wants to merge 1 commit into
mainfrom
feat/grid-lines

Conversation

@datlechin

@datlechin datlechin commented Oct 5, 2026 •

Copy link
Copy Markdown
Member

Brings the grid-line look of Laravel, Vercel and Tailwind to tablepro.app, as the owner decided on 2026-10-06 (design-system §4.7). It reverses the rebuild's "gutter rails" removal, in a form built so the old frame's defects cannot come back: the rails are drawn on the Container's own box, so they cannot detach; nothing uses vw; nothing clips overflow.

What changes

  • Rails (FrameRails): two 1px --rule lines on the wide Container's outer edge, from 1280px. At 1280 they sit on the screen edges. Drawn over the page, and again inside the sticky header because the header is opaque. Below 1280 there are no rails.

  • Joins: a full-bleed hairline between every two blocks of <main>, drawn in app.css by position. Every block pads half the section rhythm on each side, which replaces the data-rhythm collapse. Top-level Containers now sit inside full-width blocks, so every join reaches the screen edge. Anchor jumps land behind the header's rule, so /#pricing shows one line.

  • Marks: an 11px neutral cross where the frame starts and where it ends, plus the homepage's #pricing join. At most six per page, shown from 82rem, and hidden in forced colours and in print.

  • Cells (CellGrid): shared 1px lines that reach the rails. Cells are used for:

    • on the homepage: the actions, engines, sponsors, workflow rows, safety, platforms, plans and closing actions;
    • the /pricing plans;
    • the feature pages' docs/related row.

    #ai, #switch and articles stay unlined.

  • A list that ends a block drops its last rule, so two lines never stack just above a join. A list inside a card keeps its rule.

  • design-system.md gains §4.7 Page frame and updates the decisions table, §4.3, §4.5, §4.6, §5.1, §5.3.18, §8.1, §10 and §11.

Verification

  • php artisan test: 1556 passed, 1 skipped.

  • npm run test:js: 185/185 passed.

  • tsc clean, and the shared files are unchanged.

  • New PageFrameTest covers 15 templates: the rails, a full-width block for every join, no doubled rule, the mark count, cell grids only in wide sections, and the CSS.

  • Browser measurement (Chrome) on 20 templates at 390, 768, 1024, 1280, 1366, 1440 and 1920px:

    • no horizontal scroll;
    • rails on the Container edge, and the header's stretch on the same columns;
    • every cell grid's outer lines on the rails from 1280, and at the screen edge below;
    • one join per block boundary;
    • at most six marks.

    The only rules still sitting just above a join are boxes with their own edge: callouts, placeholders, the database facts card and form inputs.

Not checked:

  • Safari and Firefox: not run.
  • Crisp launcher: it does not load headless. By arithmetic, the right rail passes behind the launcher at about 1326–1446px.

Screenshots

Each image puts the live site today (left) beside this PR's build (right). Light theme at 1440px unless noted. Click an image for full size.

Hero: the two download actions become a row of cells; rails appear from 1280px.
Homepage hero, before and after

Databases: the featured engines become a wall of cells, and the list by type runs from rail to rail. The marks show where the frame starts.
Databases section, before and after

Sponsors and workflows: the logos become a wall of cells that closes on the next join, and each workflow row is a cell.
Sponsors and workflows, before and after

Safety: the detail row becomes two cells, split 5 / 7.
Safety section, before and after

Platforms: the Mac and iPhone cards become cells on the band.
Platforms band, before and after

Pricing: three joined cells, with a marked join. The prices are unchanged.
Pricing section, before and after

Closing actions and footer: the actions close on the footer's rule, where the frame's end marks sit.
Closing section and footer, before and after

Dark theme
Workflows in the dark theme, before and after

/pricing: a join under the page header, and the plans as cells.
Pricing page, before and after

Phone, 390px: no rails. Cells run to the screen edge, so only horizontal lines remain.
Phone at 390px: databases and safety, before and after

The owner asked for the grid-line look of Laravel, Vercel and Tailwind
(design-system §4.7, decided 2026-10-06). It reverses the rebuild's
"gutter rails" removal in a form that cannot repeat the old defects.

- Rails: FrameRails draws two 1px --rule verticals on the wide
  Container's outer edge from 1280px, over the page and again inside the
  opaque sticky header. Each rail is its own 1px element. Below 1280
  there are no rails, only horizontals.
- Joins: app.css draws a full-bleed rule between every two blocks of
  <main> by position, so no template can leave one out. Section,
  PageHeader and the hero pad half the rhythm on each side, replacing
  the data-rhythm collapse. Top-level Containers now sit in full-width
  blocks so their joins reach the screen edge. Anchors land behind the
  header's rule, so /#pricing shows one line, not two.
- Marks: an 11px --rule-strong cross where the frame starts and ends,
  plus the homepage's #pricing; six at most, from 82rem, hidden in
  forced colours and print.
- Cells: CellGrid draws shared 1px lines with spread shadows and reaches
  the rails. The homepage's actions, engines, sponsors, workflow rows,
  safety row, platform block, plans and closing actions, the pricing
  page's plans and the feature pages' docs row are cells. Prose stays
  unlined.
- A list that ends a block drops its last rule, so it never stacks a
  second line above the join; a list inside a card keeps it.

PageFrameTest holds the markup and CSS on fifteen templates. The
geometry was measured in a browser at 390 to 1920px: no horizontal
scroll, rails on the Container edge, cell lines on the rails, one join
per block boundary, at most six marks.

This branch has not been deployed

No deployments
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