II · Relationship
Inheritance and Composition
A button inside a modal is still a button
Real interfaces are never one element. A delete action is a sequence; the sequence holds a modal; the modal holds a button; the button holds a loading state. Each of those is its own element with its own promise, nested inside a larger one. So the question that decides whether complex things stay trustworthy is simple: when promises nest, what happens to each one?
The answer is the whole principle. Contracts compose. They don't override.
The button inside the modal is still a button — it still presses, still acknowledges, still reads as an action and not a link — and none of that dissolves because it's taking part in a delete. The modal is still a modal: it still suspends what's behind it and still demands resolution, because it sits inside a flow. The sequence has its own promise on top — confirm, undo window, the exit — but that promise is added to the components' promises. It never stands in for them.
This sounds obvious said plainly, and it's broken constantly, almost always for the same reason: the designer started thinking about the sequence as a whole and quietly stopped thinking about the parts. You see it the instant a component's own promise gets bent to fit its container. A button in a destructive modal styled so softly it no longer reads as pressable — its promise sacrificed to the mood of the warning. A modal launched from a panel but behaving like one — dismissible, no resolution required — looking like one promise and acting like another. A tab dropped inside a modal — tabs promise a persistent parent you move across, modals promise to be dismissed — two promises that can't both be kept, dressed to look like one. In every case the designer treated a component's contract as negotiable inside the sequence. It isn't.
And the reason that discipline matters isn't tidiness. It's that the person already learned what a button does, what a modal does — so when they meet a button inside a delete confirmation, they get to apply both pieces of knowledge at once. The sequence is new; the components are old friends. Familiarity inside novelty is how someone walks into a thing they've never seen and still moves with confidence. Let the components keep their promises and complexity stays legible. Bend them, and every nested screen becomes one more thing to decode from scratch.