Repository navigation
Refresh the default look: inset panel, slate greys, quieter headings, and per-screen fixes - #912
Open
guidovizoso wants to merge 14 commits into
Open
guidovizoso wants to merge 14 commits into
guidovizoso wants to merge 14 commits into
Conversation
Every grey token in the default theme moves to the matching slate step, in light and dark. The three greys that sat between palette steps keep their lightness and take slate's tint from the steps either side, so contrast does not shift. The onboarding illustration and the component preview's neutral-* classes become slate-* to match. Skins set their own colours and are unchanged.
The sidebar and the window's edge now share one tint, and the page sits in a panel inset 8px with rounded corners and a hairline, using the sidebar's own inset variant. Light mode runs darkest to lightest the way Linear does: the frame, a slate-50 panel, then white cards on it; dark mode was already in that order once the frame became its darkest surface. Admin and settings now scroll inside the panel like the app does, so its corners stay on screen; the audit table and the playground fill the panel instead of the window. Fields fill with the card's white so they read as fields on a card or the panel, and row icon tiles take the panel's grey with a hairline so they still show on a white card.
guidovizoso
requested review from
MikeRyanDev,
davidmckayv,
dustywusty,
mxmzb,
samjulien and
tylerslaton
as code owners
October 30, 2026 20:49
The conversation's main line was 14.4px, sized by hand; it is now text-sm like the rest of the sidebar. The tests that named the old size class follow.
Page titles are semibold with slightly tighter tracking instead of bold. Section titles drop from 18px bold to 15px semibold, close to body size, so a long page reads as one title and its parts rather than a row of titles competing with each other.
Plugins showed one plug icon on every row, so the icons told one vendor from another no better than none. Rows now show the app's logo, its brand icon, or its initial; Connections and the app directory fall back to the initial too. The More apps row, a directory rather than a vendor, gets an apps icon. In the admin sidebar Skills and Automatic learning shared a file icon; they are now a slash and a bulb.
The small uppercase OPENBOT over "Start a conversation" repeated what the sidebar already says and gave the page two headings where one does the job. The greeting is now the page's only title, in the same semibold as other page titles.
The carousel's tall cards left about 50px of nothing between each avatar and its name, and its arrows showed even when every card fit. Bots are now rows (avatar beside name and one line of what the Bot is for) two to a line, up to four, with an All Bots link when there are more. The skeleton, empty and error states reserve the same two rows so the composer does not move.
"Review this Bot's activity and settings." could head any page. The description under the title is now the Bot's own one-liner, which used to sit just below in the avatar block; that block keeps the avatar and the Bot's title.
With nothing running or scheduled, Activity was a whole section holding one row, "All activity · Nothing yet". That row now sits at the end of For you, titled Activity. The section still shows, with its rows to running and scheduled work, whenever there is any.
…button
GitHub's tile line was a full sentence cut off mid-word; tiles now carry a short version that fits
("Repository events can start Bots."), and the full sentence stays on GitHub's own page. An app
with no summary of its own no longer shows "Connect your Todoist account.", which only repeated
the Connect button beside it; the tile shows just its name.
… its count
The full directory takes a couple of seconds to arrive, and until then the page was a search box
over blank space. It now shows placeholder rows while loading, then how many apps there are
("1,605 apps. Search by name to narrow them.") or how many match a search.
guidovizoso
force-pushed
the
guido/inset-panel
branch
from
October 30, 2026 20:52
aaa8839 to
7f5af13
Compare
Sam's square-dot matrix (from the design-uplift branch) now sits faintly behind every PageEmpty, fading out from the top-right corner. It is built to be changed without touching a component: - the tile is app/src/assets/patterns/dot-matrix.svg, used as a mask, so replacing the file changes the pattern; - --empty-pattern, --empty-pattern-color and --empty-pattern-opacity in theme.css point at the file and set its colour and strength, per theme; - --empty-pattern-opacity: 0 turns it off. Skins start with it off, since it is drawn for OpenBot's own palette.
The sidebar draws Bots as a lightning bolt, but empty states about Bots (no Bots yet, no other Bots to hand off to, Bot not found) drew a robot. They now use the same bolt, so the two read as one thing.
guidovizoso
force-pushed
the
guido/inset-panel
branch
from
October 30, 2026 20:52
7f5af13 to
12a20dd
Compare
samjulien
added a commit
that referenced
this pull request
Oct 30, 2026
Conflicts: - page-parts.tsx: PageEmpty takes Guido's empty-state pattern. - Home: Guido's layout and Bot cards. The default skin keeps its subheader above the composer and the rotating examples. The composer keeps its stock frame.
samjulien
added a commit
that referenced
this pull request
Oct 31, 2026
Conflict in CHANGELOG.md: both entries kept, main's refunds entry first. The default look's entry now describes what this branch ships rather than #912 alone.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes
A design pass over the default look. Each change is its own commit, so any one can be dropped without touching the others:
7621aa48aeb0e2e5insetvariant. Light mode goes darkest to lightest: the frame, then a slate-50 panel, then white cards. Admin and settings now scroll inside the panel; the audit table and playground fill it.930be425text-sminstead of a hand-set 14.4px.05d8d1e48858947461749987fde726ab2d2bb006cee648839ec4bfd8068f108bad839d6ddesign-upliftappears behind everyPageEmpty, fading from the top-right. It's built to be swapped (see below).8fd1af15aaa88391Customising the empty-state pattern
app/src/assets/patterns/dot-matrix.svg. It's used as a mask, so only each shape's opacity matters.--empty-pattern-colorintheme.css, per theme--empty-pattern-opacity(0.25 light, 0.15 dark)--empty-pattern-opacity: 0Skins start with the pattern off. A skin can turn it on in its own
skin.css.Where it runs
Boundary and audit
Changelog
Unreleased.Proof
bunx tsc --noEmitinapp/passes.bun test app/tests: 2128 pass and 1 fails. The failure isserve.test.ts› "a stalled handshake times out…", which also fails onmain.h-dvh.carousel-keyboard.test.ts.Overlap with #906: both PRs touch the page scroll area in
page-parts.tsx, so whichever merges second needs a small rebase.