In my eyes, a Design System contains four crucial layers:
- Design building blocks (components, styles, variables, etc.)
- Code building blocks,
- Documentation
- Governance (including version management).
Now, when organizing a DS, approaches will differ depending on the tools used. Figma, for example, doesn't support hierarchical styling, so this part needs to be pushed towards documentation.
The following three methods help me a lot when setting the "gravity" of some elements; maybe you will find them helpful, too. Note that I use the atomic design approach, which is great for organizing hierarchical design elements, even though the border between these elements is often blurry.
At the atomic level: For action-related components, I create primary/secondary/tertiary/subtle variants of them. The subtle ones are all those that don't need to propagate their clickability because if someone wants to use them, they will actively search for them and will only need confirmation in the cursor change and a hover color that such an element of the interface is clickable. An example would be the "Share, Edit, Follow, Flag" items for this very interface of StackExchange.
At the subatomic level: I define the base, subdued, and prominent versions of styles and fills. This lets me use, for example, a glyphs-base color for all the normal texts and icons and glyphs-subdued along with a less prominent text style for the secondary information. Whenever some portion of text needs some special exaggeration, I use glyphs-prominent for that, on rare occasions, though.
At the organism level: I use a special library containing all the reusable organisms that can be used as templates for any instances they need to be used within. This allows me to build an initial, semi-carved-in-stone structure and alter it only when necessary.
These three help me create a good balance between coherency and flexibility while not using overrides too much.