How to use the generator

  1. Start from one of the layouts, or add tiles one by one. New tiles land at the bottom of every breakpoint.
  2. Pick a breakpoint and set its column count. Drag a tile to move it and pull its corner to resize it. On a touch screen, drag by the grip in the tile's corner so the page can still scroll.
  3. Without a mouse, Tab to a tile, then use the arrow keys to move it and Shift with the arrow keys to resize it. Delete removes it, and Ctrl or Cmd with Z undoes the last change.
  4. Check the reading order panel, then copy the HTML and CSS, the Tailwind classes or the React component.

Why it checks reading order

CSS Grid can put any tile anywhere, but the HTML keeps its own order, and that is the order people using a keyboard or a screen reader go through. When a big tile is moved to the top on desktop but stays last in the markup, a sighted reader starts with it and a screen reader user hears it at the end. WCAG 2.2 treats that as a failure of success criterion 1.3.2, Meaningful Sequence (opens in a new tab), and of 2.4.3, Focus Order (opens in a new tab) when the tiles are links or buttons.

The generator reads each layout the way a sighted reader would, row by row and left to right, and compares that with the source order. The numbered path on the canvas is the order the Tab key will follow. If it doubles back, the panel names the tiles involved and can reorder the source to match the layout you are looking at. Because one HTML order serves every breakpoint, fixing desktop can break the phone layout, so all three are checked at once.

What the code does

  • The HTML and CSS output gives every tile one grid-area name and redraws grid-template-areas at each breakpoint, so the CSS reads like a map of the layout.
  • The Tailwind output is mobile first and only adds a class where a breakpoint changes something. When a layout is exactly what CSS auto-placement would produce, it gets spans only and no start lines.
  • Tiles get min-width: 0, so long words and code can shrink inside their track instead of stretching the grid.
  • The optional entrance animation staggers in reading order and sits inside @media (prefers-reduced-motion: no-preference), so it never plays for people who have asked for less motion.