Commit Graph
280 Commits
Author SHA1 Message Date
ZacharyZhang-NYandClaude Opus 5.5 cddbd150e6 Misc · Export and import: reasons wrap; every way out tested
feedback::InlineMessage lays its words in a block that wraps, so the
importer's reason for unread text no longer runs past the dialog. The
reader skips a leading byte order mark, names the line an unclosed
quote opened on, and logs once per reading. Tests press each Cancel,
the scrim, Export with the first format, see focus return to the
opener, read new text under an open importer, and see a field with no
column come empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 05:50:28 -04:00
ZacharyZhang-NYandClaude Opus 5.5 9912638fa7 Misc · Export and import: export, field mapping and a CSV importer
misc::ExportDialog offers the owner's formats as cards and hands the
chosen one over for the owner to write. misc::ImportDialog maps the
file's columns to the app's fields, matched by name to start, over a
preview, and asks for each required field's column. misc::CsvImporter
reads CSV as RFC 4180, lets the first row name the columns or not, and
maps it through the ImportDialog into records; text that does not read
says why.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 05:20:03 -04:00
ZacharyZhang-NYandClaude Opus 5.5 b7c8629ea7 T42f Misc · Web passes review
in_view names its types in place and the non-macOS branch reads its fields, so builds off macOS stay free of warnings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 05:07:35 -04:00
ZacharyZhang-NYandClaude Opus 5.5 1b04dc07a4 Misc · Web: the web view hands the keyboard back
WKWebView takes AppKit's first responder on a press and gpui's view
never asks for it back, so typed text went to the page for good. The
web view now hands it back through wry's focus_parent on every press
gpui gets and when its page drops. The gallery proves it with a native
key after a press on the page. in_view builds only where it is used,
its test covers a box that straddles the view's top, and the embed's
frame takes the card's bottom corners.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 04:59:11 -04:00
ZacharyZhang-NYandClaude Opus 5.5 529394e57b Misc · Web: a web view proven with wry, and an iframe embed
misc::WebView lays wry 0.57's child WKWebView over the window at its
box, following it from a canvas in prepaint and hiding it out of view;
it loads an address or the owner's HTML, which makes it the HTML
preview. misc::IframeEmbed frames a page under its address with Open
in browser. EmbedCard points to chat::LinkPreviewCard, ShareSheet to
buttons::ShareButton; PrintButton is blocked, gpui 0.2.2 has no print
API.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 04:32:26 -04:00
ZacharyZhang-NYandClaude Opus 5.5 45e128e069 T42e Misc · Terms and notices passes review
A test walks Shift-Tab round the cookie banner past the resting Necessary switch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 04:25:31 -04:00
ZacharyZhang-NYandClaude Opus 5.5 067ef3f122 Misc · Terms and notices: tests for every way out; switch labels wrap
Tests now press Decline and the scrim, see focus return to the opener
after Accept, see necessary cookies stay on and off the Tab path, and
see the license list mark its row and read each version and license.
lists::ListItem marks its description and selected state for tests.
forms::Switch's label wraps in its own block, as Checkbox's does.
Ely's own row in the gallery shows both of its license texts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 04:09:49 -04:00
ZacharyZhang-NYandClaude Opus 5.5 6c589c3115 Misc · Terms and notices: licenses, consent and a cookie banner
misc::LicenseViewer lists what a product ships with each license beside
the chosen one's text. misc::ConsentDialog asks for a box before Accept
and answers each way out once, accept or decline. misc::CookieBanner
takes Accept all, Reject all, or a switch per kind through Choose, which
turns into Save choices on its focus. ChangeLog Viewer points to
data_display::Changelog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 03:36:03 -04:00
ZacharyZhang-NYandClaude Opus 5.5 4d21b15219 T42d Misc · Asking and learning passes review
The poll's mark and its row's selector share one binding.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 03:24:15 -04:00
ZacharyZhang-NYandClaude Opus 5.5 8f85e4fe04 Misc · Asking and learning: Submit never rests; radio labels wrap
Survey's Submit asks for any missing answer instead of resting, so no
untick takes its focus handle out of the tree. Flashcards turn and go
round, and a quiz pick clears its ask, through methods the tests reach;
the poll's rows show which one holds the vote. forms::Radio's label
wraps in its own block, as Checkbox's does, so a long one stays in a
narrow box.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 03:11:52 -04:00
ZacharyZhang-NYandClaude Opus 5.5 6e02a0cce3 Misc · Asking and learning: a poll, a survey, a quiz and flashcards
misc::Poll turns to results once the owner holds the vote, with Change
vote on Vote's stop. misc::Survey asks on one page and sends when each
question is answered, thanking in Submit's place and focus. misc::Quiz
checks, goes on, scores and starts again on one button. misc::Flashcards
turn on a press and go round the deck, each face fading in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 02:38:33 -04:00
ZacharyZhang-NYandClaude Opus 5.5 19a5295ed8 T42c Misc · Codes and checks passes review
Tests now hold focus in the field after an answer and a passed captcha with no Tab stop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 02:22:34 -04:00
ZacharyZhang-NYandClaude Opus 5.5 fa72f2521d Misc · Codes and checks: the captcha keeps focus through every verdict
Verify never rests, so no verdict or new ask takes its focus handle out
of the tree; with nothing typed it sends focus to the field. Enter hands
nothing over while the owner checks. A pass moves focus from the resting
field to the Verified mark, so the field shows no ring and no caret.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 02:05:44 -04:00
ZacharyZhang-NYandClaude Opus 5.5 8648f5eed1 Tasks: the website's home page, components page and Cloudflare deploy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 01:40:15 -04:00
ZacharyZhang-NYandClaude Opus 5.5 621c8406bb Misc · Codes and checks: a QR code scanner and a captcha
misc::QrCodeScanner reads QR codes with rqrr 0.11 from the frames the
host hands in, one at a time off the main thread, and hands each code
to the owner once. misc::Captcha shows the owner's picture over an
answer field that empties and keeps focus with each answer; the owner
says how it stood. BarcodeDisplay, Signature and Rating Widget point
to their homes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 01:40:15 -04:00
ZacharyZhang-NYandClaude Opus 5.5 854f44ed6c T42b Misc · Numbers passes review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 01:14:17 -04:00
ZacharyZhang-NYandClaude Opus 5.5 d0bf6ee5e3 Misc · Numbers: a result goes on whole; long readings wrap
A calculator result stays in the sum as `a`, handed to evaluate with
its whole value, so 1 ÷ 3 = × 3 = gives 1; sign turns it and delete
takes it. Equals waits on a dangling operator. The converter's reading
wraps in its box rather than ending in an ellipsis, and tests hold
Control, the = key, a point after a result and the six digits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 01:06:32 -04:00
ZacharyZhang-NYandClaude Opus 5.5 fc10b64303 Misc · Numbers: a calculator and a unit converter
misc::Calculator works a typed sum in forms::evaluate's precedence,
from a pad or the keyboard; Enter is equals while the calculator
itself has focus, and Escape clears or passes on. misc::UnitConverter
reads an amount in another unit across seven kinds, with a swap.
Both show numbers through format::significant, which rounds through
Rust's exponent form.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 00:41:49 -04:00
ZacharyZhang-NYandClaude Opus 5.5 87b0effafb T42a Misc · Time passes review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 00:30:00 -04:00
ZacharyZhang-NYandClaude Opus 5.5 977ba4c335 Misc · Time: Lap turns Reset, laps and tickers tested
The stopwatch's second button reads Lap while running and Reset once
paused, on one focus handle, and Reset hands focus to Start, so no
press leaves focus stranded. Lap rows carry selectors; tests hold
their order and times, count the tickers' wakes, and a WorldClock
without places fails.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 00:21:23 -04:00
ZacharyZhang-NYandClaude Opus 5.5 6918370b08 Misc · Time: clocks and a stopwatch
misc::Clock shows the time in a zone, the system's unless told, as an
analog face with hour marks and three hands over its digits and a
label; it wakes its view at each whole second of the wall clock, and
only while the owner passes no moment. misc::WorldClock lays places in
rows: a small face, the place, how its day and hour stand against home,
and its time. misc::Stopwatch runs on the executor's clock in tenths,
holds while paused, marks laps while running and clears once paused;
Start and Pause share one button and its focus.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 23:51:58 -04:00
ZacharyZhang-NYandClaude Opus 5.5 7cce4ab3fc Tasks: split T42 into seven
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 23:44:24 -04:00
ZacharyZhang-NYandClaude Opus 5.5 52a98bf676 T41c Maps · World passes review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 23:42:16 -04:00
ZacharyZhang-NYandClaude Opus 5.5 8a3f8d152e Maps · World: marks in their wash, the legend clear of the credit
A choropleth's points and lines now draw in their wash, as its doc
says, while its areas keep the page's color at their edges. The legend
moves to the top left, so the attribution a license asks for stays clear
at any width. A key given twice fails. WorldMap's keying by ISO code,
its Natural Earth credit and its acceptance of the bundle's codes, as
Kosovo's XK, each have a test; so does an endless value.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 23:35:04 -04:00
ZacharyZhang-NYandClaude Opus 5.5 752266c36d Maps · World: choropleths and the world's countries
ChoroplethLayer washes each area by its value, keyed by its id or a
property's text or number, on one hue's scale from its faintest at the
least value to its strongest at the most; an area without a value reads
as no data. ChoroplethMap lays it on the owner's map, with or without
tiles, and puts a legend of the scale and of no data in the corner; a
value that matches no area is logged once. WorldMap washes Natural
Earth's 110m countries, bundled trimmed by scripts/countries.py, by ISO
3166 alpha-2 code, and fails on a key that is no code. A shape now
paints as one fill and one edge path per world in view.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 23:12:27 -04:00
ZacharyZhang-NYandClaude Opus 5.5 811a187a3e T41b Maps · Layers passes review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 23:01:43 -04:00
ZacharyZhang-NYandClaude Opus 5.5 11fbb07ff8 Maps · Layers: tests hold what clusters promise
Tests hold that a pan keeps a focused cluster, that a cluster away from
the view takes no Tab, that a zoom out folding a focused pin hands its
focus to the map, and that a press shows members far apart whole. The
heat test pins the quartic kernel's value halfway out; a ring of fewer
than four positions fails with its own reason, and has a test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 22:57:05 -04:00
ZacharyZhang-NYandClaude Opus 5.5 a3115b8126 Maps · Layers: routes, GeoJSON, heat and clusters
MapView takes layers over its tiles and under its pins. RouteLine runs
along places the short way across the date line. read_geojson reads RFC
7946 to features, strictly: a position past the globe, a line of one
position or a ring that does not close fails with its reason, and a
feature placed nowhere keeps no geometry. GeoJsonLayer washes areas as
one path per polygon, so holes stay open, outlines them, strokes lines
and dots points. GeoHeatmap spreads weighted places in a quartic kernel
over small cells, scaled to the densest spot in view. Lines and areas
unwrap across the date line and repeat on every world in view.
cluster_markers gathers pins by squares of the world, so a pan keeps
each group; a cluster shows its count, and its press shows its members
whole, never farther out. A zoom that may regroup them hands a focused
pin's or cluster's focus to the map.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 22:35:40 -04:00
ZacharyZhang-NYandClaude Opus 5.5 f5909f6e43 T41a Maps · View passes review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 22:20:08 -04:00
ZacharyZhang-NYandClaude Opus 5.5 e84fbb9a61 Maps · View: a focused pin keeps focus off view
Each pin holds a keyed focus handle of its own, a Tab stop and pressable
while its place is in view, so a focused pin that pans out of view keeps
focus and the arrows go on panning, and a popup that scrolls away hands
focus back to its pin wherever it lies. A popup whose place is off view
takes no focus. Tests hold the tall card's cap and scrolling body, the
map staying under its wheel, and markers refuse a repeated key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 22:14:42 -04:00
ZacharyZhang-NYandClaude Opus 5.5 bbba5ee04b Maps · View: pins in view take presses, the popup hands focus back
A pin whose place lies outside the view takes no press or Tab, as its
popup would not show. The popup takes focus when it shows and, the
frame it stops showing by its button, Escape, the owner or a pan, hands
focus back to what held it, so focus stays in the map. Its body scrolls
past the room on its side and it paints over the zoom buttons. Tiles
load through gpui's logging loader, so a tile that fails says so. A
drag's owner check has a test, and the per-move viewport logs at debug.
The maps tests split into the map's and the popup's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 21:57:27 -04:00
ZacharyZhang-NYandClaude Opus 5.5 d6a56f3964 Maps · View: host tiles, pins and a popup, a picker, coordinates
maps::MapView lays the host's tile for each zoom, column and row in Web
Mercator, the nearest cut scaled past the zooms it serves, on whole
pixels. gpui packs pictures in its atlas without padding and samples
them linearly, so each tile draws with a one-pixel rim copied from its
own edge, one of its pixels larger each side and clipped, and no seam
shows. A drag, the wheel or the arrows pan; Command-wheel, + and - or
its buttons zoom about the pointer or the center; the owner keeps the
viewport. MapMarker pins take a press and Enter when the map hears
them; MapPopup opens toward the map's larger half and stays inside it,
closing by its button or Escape. LocationPicker picks the place under a
center crosshair; CoordinateDisplay writes degrees or degrees, minutes
and seconds with tabular figures and a copy button. The gallery's tiles
are Natural Earth's countries, cut z0 to z3 by scripts/tiles.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 21:22:50 -04:00
ZacharyZhang-NYandClaude Opus 5.5 8da3edbeda Tasks: split T41 into view, layers and world
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 20:57:30 -04:00
ZacharyZhang-NYandClaude Opus 5.5 7e32d2c294 T40b a11y passes review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 20:52:32 -04:00
ZacharyZhang-NYandClaude Opus 5.5 bb59ae845f Gallery: a blocked note wraps beside its dot
blocked() laid its text as a flex item beside the dot, and gpui measures
a text item's least width unwrapped, so a long note ran past its column
and the dot shrank to nothing. The text now sits in a flex_1 block with
no least width beside a dot that never shrinks, which rests on the first
line, as Alert holds its icon. The a11y note and the motion page's
Lottie note wrap inside their columns. A failed hue check names both
charts in hex.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 20:42:19 -04:00
ZacharyZhang-NYandClaude Opus 5.5 6265afbb01 a11y: a skip link, color-blind safe charts
i18n::SkipLink holds a Tab stop in flow at zero size, first where it
sits, and while focused raises a pill over the page; Enter, Space or a
press hands focus to its target. gpui orders stops by tab_index before
paint and registers none for an invisible element, so the stop stays in
flow and only the pill is raised. Theme::set_color_blind_safe swaps Ely's
chart hues for a set fitted to stay apart under Machado's protanopia,
deuteranopia and tritanopia; a test holds every pair 0.10 apart in Oklab
and each hue 3:1 on its page, and red against green shows the measure
bites. KeyboardNavigationHelper points to interaction::RovingFocus. The
announcer, labels and screen-reader text stay blocked: gpui 0.2.2 has no
accessibility tree, and nothing here is trusted to observe VoiceOver.
The i18n tests move under src/i18n/tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 20:00:26 -04:00
ZacharyZhang-NYandClaude Opus 5.5 ff8f4ba84f T40a i18n passes review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 19:40:34 -04:00
ZacharyZhang-NYandClaude Opus 5.5 928da801fb i18n: a right-to-left message leads with its mark
gpui sets no paragraph direction, so CoreText took a Hebrew line whose
first strong character was Latin, or the left-to-right mark of a signed
number, as left to right and swapped its parts. I18n::text now leads a
right-to-left message with U+200F; the number keeps CLDR's U+200E, so
its sign stays at the digits' left. The demo adds a change that opens
with a signed number, in every catalog; under Hebrew it lies at the
line's right end. A test holds the marks on a message that starts with
a number and one that starts with a Latin name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 19:36:12 -04:00
ZacharyZhang-NYandClaude Opus 5.5 219e4744c0 i18n: Hebrew on one line, its sign held left, CLDR's short years
gpui 0.2.2 wraps shaped glyphs in the order they are drawn, so a
right-to-left line that wraps comes out garbled. The demo's Hebrew
lines are Ellipses, which cut by characters, and an Ellipsis now sits
by its text's alignment, so a short line under text_right lies at the
right; the editor's completion details take the side they ask for. A
right-to-left locale leads a minus with a left-to-right mark, as CLDR
does, so the sign stays at the digits' left inside Hebrew. en-US and
de-DE write CLDR's two-digit year. The repeated-key and second-catalog
guards have tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 19:20:13 -04:00
ZacharyZhang-NYandClaude Opus 5.5 2a91218fd8 i18n: a locale per app, catalogs of messages, mirrored stacks
i18n::I18n is a gpui global holding the shown locale and one catalog of
messages per locale. text fills each {name} from its arguments; a
missing key, argument or catalog fails, and every catalog holds the
first one's keys. Locale writes numbers with its separators and dates
in CLDR's short numeric form; Hebrew replaces Arabic, whose Egyptian
digits Ely does not write. Direction::row mirrors a stack and
Direction::align sets text against the reading side. The gallery's
chapter 40 shows the messages in seven locales, every locale's number
and date, and a file list that mirrors under Hebrew.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:59:45 -04:00
ZacharyZhang-NYandClaude Opus 5.5 8c3ff2c584 Tasks: split T40 into i18n and a11y
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:26:52 -04:00
ZacharyZhang-NYandClaude Opus 5.5 215b1d49ae T39c Theme · Platform passes review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:25:40 -04:00
ZacharyZhang-NYandClaude Opus 5.5 ba865710a7 Theme · Platform: a title bar in three parts, buttons at the window's rem
A title bar lays out a start, a title and an end. In the centered styles
the start and end grow alike from nothing, their padding inside them, so
a short title sits at the bar's center and a long one gives way before
whatever stands at either end; on Windows the title, or a spacer when
there is none, takes the free width before the buttons. Caption buttons
take the bar's height at the window's own rem. Tests keep an untitled
Windows bar's buttons at its end, a long Linux title before the round
buttons, a short title centered, and the buttons inside a bar at rem 8.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:20:20 -04:00
ZacharyZhang-NYandClaude Opus 5.5 815aed304d Theme · Platform: caption buttons of their own height, titles that give way
Windows caption buttons take the bar's height less its hairline, a new
token, instead of their row's, so they keep their height beside caps
that wrap below them. A title bar's title is an Ellipsis: on Windows it
takes the free width before the buttons and gives way; a centered title
sits inset past the lights on both sides. The controls never shrink.
Tests hold a long Windows title's close button inside a 280px bar and
wrapped caps inside their row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:04:05 -04:00
ZacharyZhang-NYandClaude Opus 5.5 f3c8cca4c9 Theme · Platform: one platform for buttons and caps, icon themes, frosted panes
theme::Platform moves out of typography and shell's ControlsStyle folds
into it; the theme's platform starts as the system's. Window buttons Ely
draws, the title bar's layout and every key cap follow it, secondary
included, through typography::keys::keystroke; a title bar whose buttons
the OS draws follows the OS. primitives::IconTheme lays an owner's rules
by file name and extension over Ely's map, for every file icon.
shell::Vibrancy fills a pane with the palette's new glass, translucent
so a window opened Blurred shows its backdrop, solid under high contrast.
gpui 0.2.2 has no Mica; that line stays blocked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:41:15 -04:00
ZacharyZhang-NYandClaude Opus 5.5 53578e0525 T39b Theme · Importing passes review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:34:16 -04:00
ZacharyZhang-NYandClaude Opus 5.5 106faca970 Theme · Importing: a long name gives way, four-digit colors read
A read theme's name is an Ellipsis that gives way beside its mode badge,
so a long name keeps the badge inside a 280px box. parse_hex reads #rgba
as VS Code does, each digit doubled, so a theme with a four-digit color
reads. Tests hold the badge inside the box and read #0008 as black at
0x88 alpha.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:32:21 -04:00
ZacharyZhang-NYandClaude Opus 5.5 d5cfaeb19c Theme · Importing: VS Code themes read into Ely's palette, code palettes to choose
settings::read_vscode_theme reads a VS Code color theme, comments and
trailing commas and all: its type picks the mode, its colors and token
scopes name what they give, and the rest keep Ely's palette of that mode.
settings::ThemeImporter takes one dropped or browsed for, shows its name,
mode and count, and hands it over on Apply; a file that does not read
says why. theme::syntax_themes offers Ely's code colors, Quiet and Paper,
chosen through settings::SyntaxThemePicker, radio cards with a line of
code in each palette. A card's words now shrink as a plain block, so a
preview wraps inside the card at 280px.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:11:55 -04:00
ZacharyZhang-NYandClaude Opus 5.5 38ee858b27 T39a Theme · Editing passes review
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:02:23 -04:00
ZacharyZhang-NYandClaude Opus 5.5 d49e02ceee Theme · Editing: segments sized by their labels, a thumb that covers its segment
A segmented control's segments now take their labels' widths first and
share the spare room, so a label ends in an ellipsis only when the whole
strip lacks room. The thumb's insets meet the strip's padding again, and
each segment is measured from its borderless wrapper, so the thumb covers
the chosen segment exactly. Tests hold Comfortable whole at 280px and the
thumb to the chosen segment's bounds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 16:58:23 -04:00