/* Shared component styles — the house recipes, in one place. * =========================================================================== * * WHY THIS FILE EXISTS * * A recipe copied into several scoped stylesheets drifts — paddings, font * sizes, disabled states — and nothing detects it, because a scoped duplicate * is invisible to every tool: it isn't a rule violation, isn't a broken * reference, and isn't a recorded snippet. Shared recipes live here instead. * * GEOMETRY LIVES HERE. Every value is a design-system token, so a palette or * scale change moves the buttons rather than stranding a copy that no longer * matches. * * A button is `variant + size`, composed in the template: * btn-primary a page action * btn-primary btn-compact a row action * btn-ghost btn-inline an affordance inside a card * btn-primary btn-block a form's single submitting action * Semantic per-view names (.btn-save, .btn-delete-task, …) were the thing that * drifted, because a name says what a button is FOR and nothing about what it * should look like — so two buttons doing the same job in two views had no * reason to match, and didn't. * * MIGRATION NOTE — this file is deliberately safe to land ahead of the removals. * These are plain selectors (specificity 0,1,0); a Vue `