/* === 9. Buttons ======================================================== Canonical: .button (+ .button--primary, .button--secondary, .button--success, .button--danger, .button--icon, .button--text, .button--link; size .button--sm; state .button--loading). Charter target: collapse remaining one-off *-btn classes onto this family. ========================================================================== */ /* The fill and the bevel are gone from here, along with the whole :active rule: .button, .button:hover and .button:active come from makeover-webview, which emits the fill and the edge together so they cannot disagree. What stays is everything that is not depth -- box model, type, cursor -- plus the disabled overrides below. Two visible consequences, both the description's answer rather than this file's: hover reads as --hover-surface instead of --surface-sunken, and pressing reads as a well. */ .button { padding: var(--gap-peer) var(--gap-group); border: var(--border-width) solid var(--border); border-radius: var(--radius-sm); color: var(--content); cursor: pointer; font-weight: 600; font-size: var(--font-size-base); } .button:hover { border-color: var(--border-strong); } /* Disabled keeps its bevel. The object is still there; greying the content is what says the action is unavailable -- and the greying is the generated sheet's, along with the cursor. Only the edge is this app's. */ .button:disabled { border-color: var(--content-muted); } /* The `.button:disabled:hover, .button:disabled:active` pair that used to sit here is gone. It existed to out-specify the generated hover and pressed rules, in those words, and makeover-webview 0.10.0 emits disabled after both and restates the rest depth, so source order settles it at equal specificity. Nothing has to reach (0,3,0) to win any more, which matters because raising a selector is what the cascade layer would have had to unpick. The colour, border colour and cursor above stay, and are not a candidate for the same deletion. Layers resolve before specificity, so the generated `.button:disabled` in `makeover` loses to `.button` in this file whatever its specificity. An app has to state the disabled variant of every property it sets at rest; makeover can only supply what the app is silent about. */ .button--primary { background-color: var(--action); border-color: var(--action); color: var(--content-on-action); } .button--primary:hover { background-color: var(--action-hover); border-color: var(--action-hover); } .button--success { background-color: var(--category-four); border-color: var(--category-four); color: var(--content-on-action); } .button--success:hover { background-color: var(--accent-yellow-light); border-color: var(--accent-yellow-light); } /* .button--sm: canonical small-button size (see wiki note `bb-design-system`). */ .button--sm { padding: var(--gap-bound) var(--gap-peer); font-size: var(--font-size-md); } .button--sm.active { background: var(--category-four); color: var(--content-on-action); border-color: var(--category-four); } /* .button--danger: destructive action. Consumes the previously-unused --accent-red-hover token. Replaces .hp-action-danger in F5. */ .button--danger { background-color: var(--danger); border-color: var(--danger); color: var(--content-on-action); } .button--danger:hover { background-color: var(--accent-red-hover); border-color: var(--accent-red-hover); } /* === N. Row primitive (F2-sub addition, 2026-06-02) =================== Canonical slot layout: [icon] [primary ยท badges] [meta] [actions]. Used via BB.ui.renderRow(model). Per-surface classes (.plugin-item, .source-item, .item, .bookmark-item, etc.) sit alongside .row on the outer element and add their own padding / border / hover treatment. F5 retires per-surface name/desc classes (.plugin-name, .plugin-desc) that duplicate .row-primary / .row-secondary. ========================================================================== */ .row { display: flex; align-items: flex-start; gap: var(--gap-bound); min-width: 0; } .row-icon { flex-shrink: 0; display: flex; align-items: center; justify-content: center; } .row-content { flex: 1; min-width: 0; } /* The three row text colours come from makeover-webview, which derives them from the same content ramp this file used to spell out by hand. Identical values, so nothing moves; what changes is that there is one place to change them. */ .row-primary { font-weight: 600; font-size: var(--font-size-base); line-height: 1.3; display: flex; align-items: center; gap: var(--gap-bound); flex-wrap: wrap; } .row-secondary { font-size: var(--font-size-md); line-height: 1.4; margin-top: var(--step-hair); } .row-meta { flex-shrink: 0; font-size: var(--font-size-sm); align-self: center; } .row-actions { flex-shrink: 0; display: flex; align-items: center; gap: var(--gap-peer); } /* The hover-reveal comes from makeover-webview now. It also toggles pointer-events, which the hand-written pair did not: a hidden action used to be invisible and still clickable, so the row carried dead targets a cursor could find. The `.always` escape hatch went with the rules it was written against; nothing ever set it. */ /* F2-sub addition: form-hint error variant (used by renderFormField when passed a `field.error`). */ .form-hint--error { color: var(--danger); font-weight: 600; } /* === 10. Forms ========================================================= Canonical: .form-group + .field. One class for every field kind, with the kind riding on the element (`select.field`, `textarea.field`) rather than on a second class. The F2 split into .form-input / .form-select / .form-textarea is retired: all twenty-odd call sites had .form-input on an , .form-select on a