input: Draw the NumberInput frame around the whole control (#2674)
## Summary The `-` and `+` buttons each drew a part of the frame around `NumberInput`, together with the `Input` in the middle. Draw it once, around the whole control, and leave the buttons transparent. - The `h_flex` gets the background, the border and the focus ring, `Input` is now `appearance(false)`. - The buttons drop `border_edges` / `border_color` and use a custom variant that is transparent, tinted to `input.opacity(0.4)` on hover. - Their corners are `radius - 1px`, since they sit inside the 1px frame, and only the outer two are rounded, so they follow the frame instead of painting over its inner curve. <img width="1056" height="838" alt="image" src="https://github.com/user-attachments/assets/5d54e3b9-53e0-427e-98f1-15ec611178d7" /> ## `ButtonCustomVariant` Three of its fields were never read, the states were all derived from `color` instead: | Field | Before | Now | |---|---|---| | `foreground` | unused, the foreground was `color` | the foreground | | `hover` | unused, hover was `color` mixed 30% | the hover background | | `active` | only used when selected, active was `color` mixed 40% | the active background | The custom buttons in the Button story set `color` and `foreground` to the same value, so their foreground is unchanged; their hover now uses the `magenta.opacity(0.1)` they already asked for. ## Test plan - [x] `cargo clippy -p gpui-component -p gpui-component-story --all-targets` - [ ] NumberInput story: the frame is one rounded box in every size, the focus ring is on the whole control, `-` / `+` hover fills the corner cleanly, and `Without appearance` has no frame. - [ ] Button story: the custom buttons still read the same, hover is the lighter magenta. ## AI Assistance Written with Claude. --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
J
Jason Lee committed
d4b3aee7801a0c56364f509e391a099251183d56
Parent: c73d77d
Committed by GitHub <noreply@github.com>
on 8/10/2026, 3:56:44 PM