Categories across columns
The grid has always been a set of columns, and a category has always lived in exactly one of them. That works until one category is much longer than the rest — your dev links, or whatever your equivalent is — at which point you either accept a page with one very tall block and a lot of white space beside it, or you accept that most of that category lives behind a “+ N more” link. Spreading is the third answer: the bookmarks run across the grid instead of down it.
Go straight to Github: github.com/jordibrouwer/nextdash — release notes: v1.1.0 on GitHub
- A long category can spread across columns. Right-click a category header and pick Spread across columns, or press Shift + W while you are on it. Its bookmarks flow across the columns it is allowed and the block stays the height of its neighbours.
- You never pick the number of columns. This is the part that changed most between the first draft and what shipped. It started as a number you chose; it became a switch, because the number is already implied by two settings you have set — Items per category and how many bookmarks the category actually holds — and because a number you store goes stale the moment you add a bookmark. The width is worked out each time instead: enough columns to hold what is there, never wider than the grid, and never more than twelve. Add bookmarks and the category takes the next column with it; delete some and it gives one back. Change the grid’s column count and every spread category settles into what it can have.
- The item limit is applied per column. A spread category shows its limit once for each column it occupies, which is what keeps it level with the single-column blocks beside it rather than three times shorter than them.
- The way in is the way out. Once a category spreads, the same menu entry reads Back to one column. A rule under the header runs the full width of the block and a small ↔ beside the title says how many columns it takes — so two blocks side by side never read as two categories that happen to be next to each other.
- Switch it from wherever you are. Pages & tags → Categories has a ↔ button on every row, for going through a whole page in one sitting; :width on and :width off do it from the command palette, with :width all putting every category back to one column at once; and Appearance → Layout → Categories across columns holds what applies to all of them — what a newly created category starts at, and a button that switches spreading off everywhere at once.
- Spreading and unlimited items rule each other out, and each says so where you ask for it. With Items per category set to unlimited there is no per-column figure to work from, so the menu entry explains that rather than doing nothing; and while any category is spread, Unlimited is disabled in the settings rather than silently breaking the layout.
Underneath, the alignment was the hard part. The grid’s rows share their column tracks across every category, which is what keeps shortcuts and icons lined up down the whole page — a wide category has to repeat that track pattern once per column and still line up with the single-column blocks on either side. It also needed its own inner gap: a run of ordinary categories pads every column on both sides, while one wide box only pads its outer edges, so without correcting for that the inner columns sat sixteen pixels to the left of where they belonged.
Packed columns
The packed layout — the one that fills columns tightly rather than in neat rows — needed a different approach again, because a wide block in a set of independently flowing columns leaves a hole beside it the height of the tallest column. That was the first attempt and it was thrown away.
Packed now keeps its existing behaviour while nothing on the page is spread, and switches to a dense grid the moment something is. Two long-standing packed-mode bugs went with it:
- Dragging a category no longer scrambles the page. The renderer filled the columns round-robin, while the code that read the order back read them straight down the page — and those two are not each other’s inverse. Every category drag therefore rewrote the order into one that redistributed differently, so the page you got was not the page you arranged. There is one reader now, keyed on what is actually in the page.
- A settings change no longer flattens the layout. Rebuilding the grid’s classes dropped the packed layout’s own class, so any settings refresh — including the one behind a plain window resize — left the categories as bare children of a row with no columns in it.
Config
- The Bookmarks settings are one click away. The settings added in 1.0.3 sat underneath the list — fifty rows down by default, and up to five hundred as the infinite scroll loads more. Jumping to the bottom was not an option either, since the bottom moves as you approach it. Bookmarks now has the sub-tab strip that the other config sections already had: it opens on List, with Settings beside it. Deep links, the remembered location and the arrow-key walk across the tabs all work there without anything extra.
- Config brings you back to where you were — properly this time. 1.0.3 taught Config to remember your place, but only for the exits Config itself knew about; the health, inbox and page buttons in the header switch the view around it, so leaving that way still lost your place and reopening dropped you on Overview. Every route out is now remembered, and the timer is five minutes counted from the moment you leave rather than from your last click inside. Read one panel for half an hour, step away for ten seconds, and you land back on it.
- The category menu fits its own text. It had been borrowing the width cap from the move, tag and delete pickers, which is too narrow for it: the widest row needed 274px and got 237, so the Shift + W chip was quietly trimmed off the end — and the French label for it is half again as long.
One card, three views
Health, the Inbox and Config → Bookmarks all draw the same card, and until now each of them drew it from its own stylesheet. The three copies had drifted into being byte-identical, which is the worst of both worlds: one design, three places to change it, and no way to tell whether a difference between them was intentional or just an edit that never got copied across. They now share one definition, with the genuine differences expressed as modifiers — Health’s checkbox column, and the coloured left edge each view uses for its own state.
Two things fell out of that. The classic layout gains the row focus ring that only the modern layout had. And the disagreement about shape is settled: the Inbox rounded its filter pills and buttons where Health squared them off, and rounded won. Config → Bookmarks now reads as a view rather than a settings panel — a header with a count, a search box sized like Health’s, and matching tiles.
Finding your way in
- A card in the corner offers a walkthrough of the spreading feature: four steps with a picture each — the shape it makes, where the switch is, what decides the column count, and where the rest of the settings live. It is in Help → Pages & bookmarks as well, for after you have waved the card away.
- “No thanks” works on the side-rail invitation. The button did nothing — only the × beside it closed the card. The cause is worth naming because it is the sort of thing that hides for months: the card looks for its action button by name, and the × carries the same name, and the × comes first. It had been taking the handler ever since the notice cards were unified.
Source and downloads: github.com/jordibrouwer/nextdash — release notes: v1.1.0 on GitHub