Skip to content

Give the shell the desk-by-the-window personality - #12

Merged
XrxcGH merged 70 commits into
mainfrom
brand-personality
Oct 3, 2026
Merged

XrxcGH merged 70 commits into
mainfrom
brand-personality

Conversation

@XrxcGH

@XrxcGH XrxcGH commented Oct 3, 2026

Copy link
Copy Markdown
Owner

Gives the shell the "desk by the window" personality from the owner's direction: calm like before, but warm, with a few accents and small drawings that sit beside the work and never on it.

Changes

  • Tokens (brand/tokens.json 0.2.0): candle, dusk and night accents with subtle fills, and an ambient group (window light, evening sky, spark) in both themes and under forced colors. Every new pairing has a contrast pair. The brand-tokens check gets a max ceiling, so the ambient washes stay within 1.3:1 of the sunken canvas.
  • Drawings: window (sunset or stars), plant and vine, candle, books, open notebook, ink stroke, star field, desk scene, empty-state art and theme-card marks. Inline SVG, 1.5 px line, token colors only, under 3 KB, hidden from screen readers, one fade-in (none with reduced motion), plain outlines in forced colors.
  • Ambient canvas: window light by day, a dusk sky with twelve faint stars in the evening, behind the page card only.
  • Setup: the desk on the welcome step, an ink stroke under each step title, even color chips.
  • Chrome: candle sun and night moon on the theme toggle, a green saved cloud, and theme cards that share a row down to the compact size, with a sun or moon mark.
  • Panes: a bookshelf for "No notebooks yet", a small plant in the notebooks footer, and the notebook color as a dot in the palette, quick switcher and breadcrumb.
  • Pages: drawings for "No page open" and an empty Trash, which now sits on a page card; Settings > About gets the logo, a window and the ink stroke.
  • Docs: BRAND.md sections 1, 4, 7, 8, 9, 11 and 13.

Tests

  • Contrast, parity and forced-colors tests for the new tokens; max ceiling cases in the style-rule tests.
  • Component tests for each drawing and its placement, in both themes.
  • Playwright: new screen states (setup steps, empty Trash, Appearance) in the focus walk and axe; ambient.spec.ts checks no drawing meets text, no looping animation, no fade-in with reduced motion, and the canvas behind an opaque card; forced-colors checks for flat canvas and outlines.
  • Gates: tokens:check, typecheck, lint, format:check, npm test, test:components, test:ui and checks --base main (0 errors).

Screenshots

1280x800 (wide) and 820x620 (compact), light and dark, named <screen>-<theme>-<size>.png. The before and after sets are kept next to the proposal in the scratchpad (brand/before/ and brand/after/):

  • setup-welcome, setup-look, setup-storage
  • workspace, workspace-empty
  • palette, switcher
  • settings-appearance, settings-about
  • trash-empty
  • update-ready, update-popover

🤖 Generated with Claude Code

XrxcGH and others added 30 commits October 2, 2026 19:33
The shell is two colors, oat or walnut with moss, and it needs a few more
tones to feel like a desk by a window. Candle, dusk and night are small
accent families (a text-safe line color and a subtle fill each) for the
sun and moon icons and the drawings that follow. The ambient group holds
the window-light and evening-sky stops for the desk canvas, plus a spark
color for the sun disc and stars.

Every new pairing has a contrast pair in tokens.json: the accents on the
four surfaces and on their own fills, text on each fill and on both
ambient stops, and the focus ring. The ambient stops also get a ceiling
(at most 1.3:1 against the sunken canvas) so the wash stays quiet. To
express that, brand-tokens now accepts an optional max next to min.
Under forced colors the accents become CanvasText and the fills and
ambient tokens become Canvas, so gradients flatten and stars vanish.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The shell has no pictures, so it reads as flat. These inline SVG
components are the set the brand direction calls for: an arched window
(a sunset by day, stars and a crescent moon at night), a potted plant
with a trailing vine, a lit candle, a stack of books, an open notebook
with the logo's moss stroke, the signature ink stroke, a field of
twelve stars, a desk scene built from the parts, three empty-state
compositions, and a small sun and moon mark for the theme previews.

Each drawing is hidden from screen readers and cannot take focus, uses
only token colors through CSS classes, draws 1.5 px lines that stay that
wide at any size, and stays under 3 KB of markup. Glows are flat radial
gradients, never blur. Each fades in once over the fast duration, and
not at all with reduced motion. Under a Windows contrast theme every
drawing becomes plain outlines in the text color and the stars are
hidden. Component tests cover all of that in both themes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The page canvas was a flat sunken rectangle, which is the natural place
for the time of day to show. By day a warm wash falls from the top
corner, as if from a window. In the evening the canvas becomes a sky
that deepens from night through the canvas color to a dusk horizon, with
twelve faint stars pinned to its top, behind the page card.

The washes stay within 1.3:1 of the sunken canvas and only show around
the card, never behind text: the card is opaque and the star field sits
under it. The sky follows the theme on the root element, so it changes
with the crossfade and never lags a frame behind. Always paper white
lights the whole page area, so the stars are left out there, and a
Windows contrast theme gets a flat canvas.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The first-run setup was three plain cards on a flat backdrop, and the
welcome step left about 360 px of empty card between its text and the
button. The welcome step now shows the desk by the window between its
sentence and its note, with its text centered to match the title. Each
step title signs off with the ink stroke, and the backdrop carries the
window light by day or the evening sky at night, always around the card
and never behind text. The notebook color chips in step 3 share the width
evenly, so they are the same size.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The title bar toggle was a gray sun or moon. The sun is now candle
colored and the moon night colored, both well above the 3:1 an icon
needs on the app surface and on its hover and pressed fills. The three
theme cards share a row down to the compact size instead of wrapping two
and one at 820 px, and each preview carries a small mark in a bottom
corner: a low sun for Light, a moon and stars for Dark, and one of each
for Match Windows. The marks sit below the preview lines, are hidden
under a Windows contrast theme, and stay out of the screen reader and
Tab order like the rest of the preview.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
"No notebooks yet" was a bare sentence. It now has a small bookshelf with
a leaning book and a sprig above it, and the sentence is unchanged. With
notebooks present, the notebooks pane footer holds a small potted plant
opposite Trash. It sits in the fixed footer so it never covers a row, and
it hides when the footer is narrower than 200 px, in compact, and when
the pane has no notebooks (that pane has its own drawing). The Saved
cloud in the title bar is now the success green, the one good state,
while Saving, Offline and the error keep their quiet colors.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The tree gives every notebook a color chip, but the palette, the quick
switcher and the breadcrumb were all one color. A page or notebook result
now has a small 8 px dot in its notebook's color before the title, and the
breadcrumb's first crumb has the same dot. The dots reuse the pen colors
the tree already uses, are hidden from screen readers (the name is
unchanged, and the path still says which notebook), and keep their own
color under a Windows contrast theme. To carry the color, a
palette result can now name an ink.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
"No page open" and "Trash is empty" were bare text, and Trash was a 12 px
caption on the sunken canvas with no card and a focus ring the full width
of the pane. "No page open" now has an open notebook with a candle beside
it above its sentence. Trash moves onto a paper card like a page, shows a
lit candle beside a tidy stack of books when empty, sets its sentence at
body size, and fits the heading's focus ring to the heading text. The
sentences are unchanged and carry the meaning; the drawings are hidden
from screen readers.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
About was a list of facts under a heading. It now starts with the heading's
ink stroke, then the 48 px logo mark with a small window beside it (a
sunset by day, stars and a moon in the evening), then the facts. The
drawings are hidden from screen readers, and the text is unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
BRAND.md still said illustrations are only for empty states and drew
everything from two colors. Section 1 now says what the personality looks
like by day and in the evening. Section 4 gains a "Warm accents and
ambient light" subsection with each new token, its single job, the rule
that candle, dusk and night are never status colors or button fills, and
the 1.3:1 ceiling on the washes. Section 7 says glows are flat gradients,
section 8 replaces the illustration paragraph (where drawings go, the
size and weight limits, the motif set), section 9 says drawings fade in
once and never loop, and sections 11 and 13 add the empty-state and
ambient canvas rows and the new things to avoid.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The new look is only worth having if it never costs the writing surface
anything. Five new screen states (the three setup steps, the empty Trash,
and Appearance) join the focus walk and the axe run at every size and
theme. A new behavior spec checks, in both themes and at two sizes, that
no drawing's box meets a text box on eight screens, that nothing loops
once a page has settled, that the fade-in is gone with reduced motion,
that the canvas sits behind an opaque page card with the stars under it,
and that the plant stays out of the compact layout. The forced-colors
spec checks that a Windows contrast theme gets a flat canvas, no stars,
and plain outlines in the text color.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The shelf's third book was rotated 14 degrees about its bottom-right
corner, which swung its bottom-left corner 2.4 units below the shelf
line, so it drew through the shelf. It now pivots on its bottom-left
corner (48, 70.4) by 17.7 degrees, the angle at which its left edge
rests on the moss book's top-right corner (39, 41.4); its bottom-right
corner lifts 3 units and no point sits below the shelf.

The same audit found the welcome scene's book stack 0.7 units and its
notebook 0.2 units below the desk line, and the candle's saucer
floating just above its foot. They now sit on their lines.

New component tests trace each outline: the leaning book stands on its
lower corner, touches the moss book without entering it, and every
book, pot, notebook and candle stands on its shelf, desk or sill. The
guide records the rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In the welcome scene the plant on the sill covers the window's lower
left pane, and one star sat about a unit under a leaf, touching it
once the strokes were drawn; another sat close above the top leaf.
Both move into open sky. The day sun almost kissed the window's middle
bar, so it sits 1.5 units lower and sets a little further behind the
hills. The guide adds that nothing crowds another shape.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The empty-state drawings kept 6 units of blank paper at each end of
their shelf, so the shelf started 5 pixels right of the heading and
sentence it sits with. They are cropped to 110 pixels, and the shelf
now starts where the text starts.

The About logo sat inline in its span, so the text line under it made
the span taller and lifted the mark about 4 pixels above the middle of
the window beside it; it is a block now, and a test holds the two
level. The footer plant stood flush at the end of the footer, much
closer to the edge than the Trash icon is at the start; it is inset to
match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The notebook-color dot sat inline before a page's title, so the detail
line under it (the notebook and section) started under the dot rather
than under the title's text, and a wrapped title ran back under it.
The dot now hangs in front: the title's text, its wrapped lines and
the detail all start at the same place. A test measures the starts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The title bar had padding only at its start, so in the evening theme
the pressed toggle's fill ran into the window's right edge and lost its
rounded corners. The bar's end now keeps 4 pixels, the same inset the
toggle has from the top, and a test holds it there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The candle's body ended level with the dish's rim, about 4.4 units above
the dish floor, so it floated with clear rows of pixels underneath. Its
bottom now follows the saucer curve, 0.2 to 0.3 above it.

The vine's tail dipped 1.2 below the pot's foot, which in the desk scene
put it 0.74 units into the window sill. It now ends just above the sill.

The plant's left leaf touched the window's middle bar, so the two strokes
merged. It now joins the stem 4 units lower, about 4 px clear of the bar.

Tests now stand the whole plant on the sill, keep the left leaf more than
3 units from the bar, and seat the candle's body in its dish.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The star at (84, 37) sat inside the moon's disc, in the mouth of the
crescent, 1.4 px from the lower horn at the About size. It now sits at
(88, 47), 7.8 units outside the moon's outline.

At the About size the strokes are 2.4 units wide, so the sun's top left
only 0.68 px of sky under the middle bar. Its centre drops from 69.5 to
72, leaving about 2.3 px there and 3.9 px in the welcome scene; the
centre stays above the hills, so more than half the disc still shows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The breadcrumb's notebook dot sat 4 px from the Forward button and 9 px
from its own label, so it read as part of the button group. It now has
4 px on both sides, which puts it 8 px from the button and 5 px from the
name, the same dot-to-label gap the tree uses. The command palette's dot
gets the same 5 px gap, and its hanging indent follows so wrapped titles
and details still line up with the title text.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Centering the whole welcome block put its title 81 px lower than the
title on steps 2 and 3, so the header jumped on Get started, and the
block sat 9 px low because the content padding is uneven. The welcome
grid now keeps the header at the top, the note at the bottom, and
centers the desk scene in the room between them. A component test
checks that the title stays put when moving to the next step.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The sill's bottom line ends at y 101.5 in a 102-unit box. Lines keep
their 1.5 px width at any size, so at the 64 px About drawing the
stroke reached 102.7 units and lost 0.44 px, leaving a one-pixel sill.
The standalone window now uses a 100 x 103 box and defaults to 103 px
tall. WindowArt and the desk scene keep their own boxes. A component
test checks every window line, stroke included, stays inside the
drawing at 64 and 103 px.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The card starts 32 px down the canvas, and three top-band stars sat
within a few pixels of that edge: at 1280 wide the star at x 418
touched it and looked like a stray pixel on the card. Those three now
sit at y 22 to 24, at least 6 px above the edge. The field also scaled
up on canvases wider than 1280 px, which pushed stars down onto the
edge, so it is now drawn at 1:1 and centered instead. A component test
checks every star stays 5 px clear of the edge at 600 to 2560 px wide.
BRAND.md records both rules: lines stay inside their drawing's box,
stroke included, and stars stay clear of the card.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Vite links each chunk's style sheet before the entry's, so ui.css and
theme.css, which open with @layer components and @layer states, loaded
ahead of the order statement in styles/layers.css. The browser fixed the
order from first use, so base rules beat components, states and forced
colors: inset focus rings fell back to the base outside ring and got
clipped, and touch density left buttons at 32 px.

A small build plugin now starts every emitted style sheet with the order
statement from layers.css, so the order holds whichever file loads
first, including sheets lazy chunks add later. An inline style in
index.html could make Tauri add a style nonce, which would switch off
'unsafe-inline' for style attributes. Two Playwright checks pin the
fixed behavior: a focused tree row's -2px ring offset and 44 px title
bar buttons with touch density.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At 820x620 the shortcut tables' 55vh height pushed the Close button
below the dialog's visible area, and the dialog became a second scroller
around the table scroller. The scroller's height now also leaves room
for the dialog's title, filter and actions in the window's height.

The scroller is also positioned now. The visually hidden table heads are
absolutely positioned, and escaped the scroller, so the dialog had a
3261 px scroll height and could scroll into blank space.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
While a row listened for a new shortcut, the field sat in the keys
column and the actions cell beside it stood empty. At 820 px the field
was 161 px wide, so its "Waiting for a shortcut" placeholder was cut
and the hint wrapped to three lines.

The capturing row now spans the keys and actions columns with one cell.
A colgroup sets the column widths, so that row moves no other row even
when it is the first in its table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At 820x620 the palette's 60vh list carried its bottom edge onto the
window's, cutting its rounded corners and shadow, and any shorter window
pushed it past the edge. The list's height now also leaves room for the
palette's top line, input, chips and a 16 px margin below it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A control that Tab brought in below the fold of Settings, the setup
steps or the shortcut tables sat flush with the scroller's bottom edge,
so the bottom of its focus ring was cut. These scrollers now set an
8 px scroll padding, as the trees and the page already do.

Two controls sat against a scroller's edge with no room for their
outside ring: Settings' first section link and the notebooks drawer's
Trash button. The section list now pads its block ends, with the header
and main column adjusted so nothing moves, and the drawer's scroller
reaches 4 px into the drawer's padding and pads its content back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The shared disabled rule gave every disabled button a subtle border, so
a disabled icon button gained a box that the enabled one lacks. In the
title bar, Go back and Go forward read as a bare arrow beside a boxed
one, with the emphasis on the button that does nothing.

The subtle border now applies only to the secondary, primary and filled
danger buttons, which have a border when enabled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Step 3, "Where to keep things", scrolled inside the 600 px card at
1280x800: its notebook color chips were cut by the footer while 80 px of
empty window sat above and below the card. The card is now 672 px tall,
so step 3 fits. Every step keeps the same height and title position,
and in a short window the card is still capped by its maximum height.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The three theme cards stop at their full width, and the start-aligned
row left its 6 px of slack on the right only, so the cards sat 3 px left
of the card's center under a centered heading, ink stroke and subtitle.
The setup step now centers the row. Settings, Appearance keeps it
start-aligned with the text above it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
XrxcGH and others added 28 commits October 3, 2026 08:46
The visually hidden table heads are absolutely positioned, and on the
Settings page their container wasn't positioned, so they escaped the
Settings scroller and stretched the document by about 2,500 px. Wheeling
past the end of the list, or scrolling a far row into view, then
scrolled the whole window: title bar, nav and content left the screen.
The groups container is now positioned, as the dialog's scroller was.

The geometry spec now also fails when the document scrolls down, not
only sideways, on every registered screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The name column took half of each table and the actions column a fixed
11rem, which left the keys about 90 px at 820x620. Key caps ran under
the Change buttons ("Ctrl+Shift+DownChange"), and "Ctrl+Y or
Ctrl+Shift+Z" broke over two lines in the dialog while the actions
column beside it stood mostly empty.

The name column now takes a third and the actions column 10rem, which
still holds Change and Reset side by side. Names wrap more gracefully
than chords do. The cell rules that repeated the column widths are gone,
since the columns set them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At 820x620 the Settings column is 532 px, and the eight 80 px text size
cards wrapped six and two, leaving 175% and 200% alone on a second row.
The size groups are now inline-size containers, and when a group of
eight steps has less than the 696 px a single row needs, it becomes a
grid of four columns. That covers the medium size class and the narrow
end of expanded, where the same wrap would happen. The interface size
group, with five steps, still fits on one row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each radio card hugged its own label and description, so the two
shortcut set cards were 289 and 446 px wide and stacked with ragged
right edges at 820x620. The Appearance choices were ragged too: Page
color 146/160, Reduce motion 137/178, Size of buttons 101/93/72.

The shortcut sets now share two equal columns, at most 44rem together,
with the descriptions wrapping inside, and stack in compact. The
Appearance choices that aren't equal steps lay their cards out as
equal grid columns at the widest card's width, shrinking together when
the column is narrower.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One panel had three right edges. The Find by shortcut switch's track
stopped 9 px short of the table rules, inside its invisible 8 px hover
padding and 1 px border, and in the dialog the tables stopped 4 px short
of the Close button, held off by the scroller's end padding.

When the switch ends the toolbar row, its hover area now hangs out past
the end, as Settings hangs switches out at the start edge, and the
dialog's scroller has no end padding. The Change buttons sit 8 px inside
their cells, which leaves their focus rings room.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With no matches the palette showed the field and the filter chips, then
empty space: "No results" only went to the screen reader announcer. The
list area now shows it, in secondary text with an option's padding, once
every provider has answered. The ranking carries a settled flag for
that, so a slow provider's pending answer never flashes "No results."
first. The empty listbox takes no room, so the line sits where the first
result would.

The string gets a full stop, to match "No destinations match."

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The section nav sat inside the Settings scroller and scrolled away with
the content. Once a long section such as Shortcuts (3,255 px) or About
was scrolled, the 240 px nav column was an empty strip, and changing
section meant scrolling back to the top. The nav now sticks to the top
of the scroller.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A fixed 200 px minimum height left 27 px under the caption against 17 px
above the preview. At first run the Match Windows caption, "Preselected
because Windows is set to Light.", takes two lines and made the row
208 px; choosing another card swapped in "Follows Windows" and the row
jumped back to 200 px.

The cards now take their content's height, so the padding is even. In
setup, outside compact, every caption keeps room for two lines, so the
row keeps its height whichever card is chosen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The three 200 px cards and their gaps made a row 648 px wide, centered
in the 654 px column, so their outer edges sat 3 px inside the edges
the Back and Continue buttons and the fields use. In setup the cards
now have no maximum width, so they fill the column (202 px each) and
the edges meet. Settings keeps its 200 px cards.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A section's dot is 8 px and a section group's square 12 px, so in the
same level of the notebooks tree "Lectures" and "Labs" started their
names at x 64 and "Exam prep" at 68. The dot now takes 2 px of margin on
each side, the square's 12 px slot, so every name starts at 68.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restart to update, What's new, and Later sat 4 px apart, where the
dialogs and the setup footer use 12 px and BRAND.md asks for 12 to 16 px
between related items. The popover's action row now uses the 12 px gap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Command bar tools without a shortcut, such as New notebook, Reveal in
tree, and Pane widths, showed a tooltip with the same words as the
button, and the title bar's save status had a native title equal to its
visible "Saved". A tool and a bottom bar action now get a tooltip only
when it adds the shortcut, and the save status keeps its title only in
the icon presentation, where the text is hidden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A row with two chords broke after "or" when its keys didn't fit, so
"Ctrl+Shift+Right or" ended one line and "Ctrl+Alt+]" stood alone on
the next. Each chord after the first is now one unit with the "or"
before it, so a wrap reads "Ctrl+Shift+Right", then "or Ctrl+Alt+]".
At 820x620 that still happens for Make subpage and Promote, the two
longest pairs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In the medium size class the notebooks tree lives in a modal drawer,
and while a modal layer is open the dispatcher ran only commands that
allow it. So F2, Delete, Ctrl+Shift+M and Ctrl+N did nothing in the
drawer, though its context menus listed them and the same commands ran
from the menus. The focus zone also read "dialog" there, so a command
would have acted on the open page instead of the focused row.

A modal layer now runs the commands of the scopes it holds itself, with
the scopes they sit in short of global: the drawer holds the tree, which
sits in the workspace. A region inside a dialog keeps its focus zone.
Plain dialogs hold no scopes and block as before, and global commands
still need to allow the modal layer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The second polish review found defects the geometry spec had no check
for. On every registered screen it now also fails when a table cell's
contents run past the cell (the key caps under the Change buttons), a
wrapped choice leaves its last row less than half as full as its first
(175% and 200% alone), or the cards of one choice in the main content
differ in width (the shortcut sets at 289 and 446 px). The centering
check covers grid cards that center with justify-items.

New tests check that the setup theme cards meet the footer's edges and
keep their height when the choice changes, and that the Settings section
list stays in view while a long section scrolls. The geometry tests get
60 s, since the shortcut list's focus walk takes about 25.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This round's fixes follow three rules the brand guide didn't state yet:
the cards of one choice share one width and wrap evenly, a button that
shows its name gets a tooltip only to add its shortcut, and the palette
says "No results." where the results would be.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The repo checks warned about a 34-word sentence in the setup styles, a
91-word paragraph at the top of the geometry spec, and its measure
function at 51 lines. The sentence and paragraph are split, and measure
returns its result on one line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The drawings read as pale outlines because their fills were the
near-white subtle accents. Five new drawing tints (art.moss, clay,
candle, dusk, night) give them soft color in both themes: each book
has its own spine color, the pots and the candle dish are clay, each
flame has a warm candle glow, the notebook has warm paper pages, the
day window holds a sunset band from paper light to candle and dusk
behind the sun, and the evening window deepens from night to indigo
under the moon and stars. The tints flatten to the canvas under
Windows contrast themes, where the glow is hidden so no flame gets
an outlined circle.

BRAND.md gains a drawing tints table, splits section 8 into icon,
logo, illustration and geometry parts, and raises the markup budget
to 6 KB to fit the gradients. Tests check every tint, the sky stops,
the spines, the pot, the glow and the forced-colors halo.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The drawings were small enough to miss. The welcome desk is now shown
at one and a half times its drawn size (360 x 225), the three
empty-state drawings at 176 px wide instead of 110, the About window at
112 px tall instead of 64, and the notebooks pane plant at 42 x 50
instead of 28 x 38. The line stays 1.5 px at every size.

Each drawing also holds more of the desk-by-the-window vocabulary,
inside drawings that already existed: a moss vine twines along the
window frame, the book stack is four high, a second, shorter candle
stands on the desk, the shelf's potted plant trails a tendril down to
the shelf, the footer plant trails a short vine with three leaves, and
the open notebook has a moss cover and rests on its spine.

The geometry tests split into their own file with shared helpers and
now also check that each book rests on the one below, that both
candles stand on the desk without overlapping dishes, that the shelf
tendril lies on the shelf, that the vine keeps clear of the stars and
moon, and the new sizes. BRAND.md records the sizes in a table.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The canvas behind the page card was a near-flat wash. By day it now
has a warmer pool of window light from the top corner and, lower on
the desk, a soft patch of light crossed by the faint shadow of the
window's bars (two thin bars at 5 percent of the text color that fade
at their ends). In the evening the sky runs from night indigo through
dusk to a low sunset band at the horizon, and the star field grows
from 12 to 25 slightly brighter stars, three of them larger. The setup
backdrop gets the same light and sky.

A new ambient.glow token carries the warmest light: the patch by day
and the sunset band at night. The background-tone ceiling in the token
check rises from 1.3 to 1.5, just above the sunset band's 1.4959, and
every text pairing on the new tone keeps the canvas targets. The page
card stays plain paper, and Windows contrast themes still flatten the
canvas and hide the stars.

Tests cover the glow's pairings and ceiling, the canvas layers in both
themes around a plain card, and the stars' count, sizes and opacity.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
On review beside the earlier screenshots, the round patch of light
with its centered cross read as a plus sign, and it repeated on every
setup step beside the card. The patch on the page canvas is now wider
than it is tall, as light falls on a flat desk, and its cross-bar
shadows span the patch at 4 percent of the text color instead of 5.
The setup backdrop keeps only the warmer pool from the corner by day
and the dusk sky with its sunset band at night, so the steps stay calm.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The two bars formed a centered cross inside the round glow, so the
patch read as a plus sign or crosshair rather than window light, and
it competed with the page. Because the bars were sized in percent,
the cross grew with the window (about 647 by 359 px at 1920 wide), and
at narrower widths or with a tall page the card cut it so a bar seemed
to drop out of the card's edge.

Keep the patch and the corner pool, remove both bar layers and the
--pane-shadow token, and cap the patch at 420 by 300 px with min() so
it stays a patch of light on a wide window. BRAND.md and the ambient
spec now describe and expect two radial layers by day.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Four stars sat below the card's top edge on the assumption that the
card would cover them. The field is centered on the canvas, but the
card's side edges move with the canvas width (min(100% - 64px, 72ch)),
so at 1280 one star was 4.1 px from the left edge, and at 1290, 1308,
and from 1336 up, stars landed on a side edge and showed as specks on
the card.

Move those four into the band above the card (cy + r at most 27), each
at least 33 px from its neighbors, and tighten the geometry test so
every star must clear the top edge by 5 px from above at 600, 1280,
1920, and 2560 px. The header comment, the CSS comment (which still
said twelve stars), and BRAND.md now say the stars stay above the card.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
CommandPalette.test measured the notebook-color dot with a Range over its
empty contents. An empty element has no text to give a Range a size, and
browsers disagree on where to put it: here it is 0,0, so "dot left of
title" passed by accident, while on CI's Chrome it landed on the title and
failed with 0 < 0. The dot is now measured as the box it is: it has a
width and ends at or before the title text. The title and detail still
have to start at the same place.

The start-up CSS passed its 15 KB gzipped budget (15.6 KB measured) once
the brand fills, candles, vine, stars and ambient tokens landed, which
stopped ui-web at the bundle check since 29cb72c, before Playwright ran.
That growth is the brand work, so the budget moves to 16 KB, leaving
roughly 0.4 KB of headroom as a guard.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Two tests measured before their subject had settled, which a fast
machine hides and a slow runner does not.

The palette's dot test took the first Mitosis option that appeared. Each
letter searches again, so on a slow runner that option is listed for a
part of the word and then replaced when the list is rebuilt for all of it.
The test then measured a detached node, where every rectangle is zero (the
"0 is not less than 0" and "width 0" failures). It now waits for the count
announcement, which comes once every provider has answered for the whole
word, and measures the option the list kept.

The settings scroll test scrolled as soon as the Shortcuts heading had
focus, but a section loads on its own after its heading. With nothing
under the heading there was nothing to scroll, so the heading stayed in
view. It now waits for the section's first table.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Conflicts: app/bundle-budget.json kept both sides' limits; PageView.tsx and PageView.module.css combined main's page changes with the brand empty-page treatment; EmptyPageArt.tsx was removed in favour of the brand illustration.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Measured after merging main: start-up JavaScript 183.1 KB gzipped (limit 180 -> 185) and start-up CSS 17.5 KB (limit 16 -> 18).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
After merging main, the page in editing mode had no background, so the ambient spec found a transparent card. The editing sheet now uses the page surface colour.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@XrxcGH
XrxcGH merged commit b28bb59 into main Oct 3, 2026
25 of 27 checks passed
@XrxcGH
XrxcGH deleted the brand-personality branch October 3, 2026 21:56
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