The obvious way to run several websites is a shared component library. Fix a bug once, publish, every site picks it up. It works until the first client needs their navigation to behave differently from everyone else's.
What goes wrong with a shared library
Each exception becomes an option. A component that started as a navigation bar acquires a variant, then a toggle, then a toggle that only makes sense alongside another toggle. Eventually nobody wants to touch it, because the blast radius of any change is every site at once.
There is a second failure that has nothing to do with code. A published library has an owner, and if that owner becomes unavailable, every site depending on it is stuck. That is not hypothetical. It is the specific problem that made this approach worth rethinking.
What copying changes
Components ship as source, into your repository. They are yours to edit. A site that needs something unusual gets it, in its own codebase, without a special case being threaded through everyone else's.
The reuse that actually matters moves down a layer, into design tokens. Colour, spacing, corner radius, typeface and motion all resolve through a single file, so changing a brand is one edit rather than a hunt through markup. That is the part worth sharing, because it is the part that genuinely is the same everywhere.
The rule that keeps it honest
Something becomes a shared pattern the third time it gets built. Twice is coincidence. Abstracting on the second occurrence is how a library fills up with things that fit nobody in particular.