# Primitives are Atoms — thin wrappers around dk.*
├── __init__.py
├── text.py            # Label, Heading, Paragraph, Caption
├── image.py           # Avatar, Icon, CoverImage
├── spacer.py          # HSpacer, VSpacer
├── divider.py         # HDivider
└── button.py          # PrimaryButton, SecondaryButton, IconButton, TextButton



## Building Atoms (Primitives)
Each file in primitives/ should export 1–4 closely related factory functions. Keep the API surface small. Examples:
| File       | Exports                                              | Notes                                                    |
|------------|------------------------------------------------------|----------------------------------------------------------|
| text.py    | label, heading, paragraph, caption                   | All return dk.DivText with different defaults            |
| image.py   | icon, avatar, cover_image                            | All return dk.DivImage with different sizing/cropping    |
| button.py  | primary_button, secondary_button, icon_button, text_button | Return dk.DivContainer with action, background, text |
| spacer.py  | h_spacer, v_spacer                                   | Return dk.DivSeparator or fixed-size dk.DivContainer     |
| divider.py | divider                                              | Thin horizontal line                                     |


## Rules for atoms:
- Every atom accepts a theme: Theme kwarg with a sensible default.
- Every atom returns a single dk.Div* object (never a list).
- Atoms should be pure — no side effects, no state, no randomness.
- Use keyword-only arguments (*) after the first 1–2 positional params to avoid positional confusion.