Surfaces
panel on canvas measures 1.140:1Buttons — four states
default · hover · active · disabledDisabled is a muted fill, not opacity. The old wash put a primary's label at 1.70:1 against its own pill; this reads 4.79:1. Shadow is dropped too — a pill that keeps its lit edge still looks pressable however pale it is.
State inspector
React island · hydrates when scrolled into view- fill
- #2a523c
- label
- #ffffff
- contrast
- 8.86:1 — passes AA (4.5 floor)
Set variant to primary and state to disabled: that is the fix. The same control under the old opacity-50 measured 1.70:1.
Filters, badges, table
| Job # | Title | Status | Contract | Margin |
|---|---|---|---|---|
| JOB-1006 | Full Backyard Redesign | In Progress | $36,690.00 | 50.32% |
| JOB-1005 | Tasting Room Patio | Completed | $60,600.00 | 28.02% |
| JOB-1004 | Backyard Patio & Fire Pit | Closed | $21,400.00 | 40.86% |
Form and validation
Quarter hours, as the crew clocks them.
Enter a plain number like 1250 or 1,250.00 — nothing was recorded.
Empty
Nothing here yet
No on hold jobs
Jobs move here when work pauses.
Loading
Skeletons match the final layout, so nothing shifts when data lands.
Error
Something went wrong
That didn't go through
Nothing was saved. The session may have ended.