SIGN IN SIGN UP

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