Ghost button or filled, when does each fit the hierarchy?
On this page
Fill the primary action and ghost the secondary, because a filled button carries visual weight that signals importance while a ghost or outline button reads as the lower-commitment, supporting choice. The styles are a language for hierarchy, and the rule is that weight should follow priority. When one action matters more than the others around it, its styling should say so, and two actions of unequal importance should never sit at equal visual weight. The choice between ghost and filled is not a matter of taste, it is how the interface tells the user which path is the main one.
The reasoning is that users read visual prominence as a recommendation. A solid fill of color advances toward the eye, looks substantial, and reads as “this is the thing to do,” which is exactly the signal a primary action wants. A ghost button, all outline or faint background, recedes, presents itself as available but not urged, and so suits a secondary or cautious choice the user might take but is not being pushed toward. The “use ghost buttons everywhere because they look sleek” habit throws this language away, flattening every action to the same quiet weight, and the cost is that the user can no longer tell the main action from the alternatives at a glance. A page where everything whispers gives no more guidance than a page where everything shouts.
Consider a dialog with two choices side by side. “Save changes” and “Cancel” are not peers: saving is the action the user came to take, canceling is the escape hatch. Filling “Save changes” and ghosting “Cancel” instantly communicates which is which, so the eye lands on the primary path and the secondary one stays clearly available without competing for the same glance. Style both as identical ghost buttons and the user has to stop and read carefully to find the action they want, every time, because the styling has refused to do any of the sorting for them. The weight difference does the wayfinding that matching styles refuse to do, and it does it before a single word is read, which is why a well-built form lets a returning user act on muscle memory rather than re-reading the buttons on every visit.
Where this breaks down is that the pairing only carries meaning when actions genuinely differ in priority, and not every screen has a single dominant action. A choice between two truly equal options, where neither is the recommended path, can legitimately present them at matching weight, because forcing a fake hierarchy onto equal choices steers the user toward a preference you do not actually hold and is its own distortion. There is also a limit on how many filled buttons a view can carry, since filling several actions at once recreates the flat-weight problem from the other direction, so a screen with one clear primary fills exactly one and ghosts the rest. The point is that weight should encode real priority, so when priority exists you express it, and when it genuinely does not, you do not manufacture it. Contrast and accessibility still apply to both styles, since a ghost button too faint to perceive fails regardless of its place in the hierarchy, and a faint outline that disappears against the background is a usability defect no amount of correct hierarchy can excuse.
When you place two or more buttons together, decide which action is primary and fill it, then ghost the supporting ones so their weight matches their lower priority. Avoid styling everything as ghosts for the sleek look, because erasing the difference erases the guidance. Reserve equal weight for genuinely equal choices. Let weight follow priority, and the buttons themselves will tell the user where to go.