The five layers
Atoms
Smallest reusable primitives: buttons, inputs, labels, the loading screen, and the typewriter effect.
Molecules
Simple composites that combine atoms: guru cards, countdown timers, phone inputs, and date pickers.
Organisms
Complex sections that compose molecules and atoms: navigation, forms, galleries, video players, and the shader background.
Templates
Page-level layouts. Currently minimal — add skeletons and page shells here as the project grows.
UI (shadcn/ui)
Third-party primitives in
components/ui/. Maintained separately so updates from upstream are straightforward.Directory structure
Import conventions
Always import from the layer’s index file, not directly from the component file. This keeps imports clean and makes it easy to refactor internal file names without touching consumers.The
@/components path alias is configured in tsconfig.json. Never use relative imports like ../../components/atoms — always use the @/ prefix.Path aliases
| Alias | Resolves to |
|---|---|
@/components | /components |
@/lib | /lib |
@/hooks | /hooks |
@/contexts | /contexts |
@/utils | /utils |
shadcn/ui configuration
The project uses shadcn/ui New York style with RSC enabled. Components live incomponents/ui/shadcn-io/ and are imported from there. Do not modify these files directly — instead extend or wrap them in the appropriate atomic layer.
To add a new shadcn/ui component:
Custom component registries
Three additional registries are configured alongside shadcn/ui:@magicui — magicui.design
@magicui — magicui.design
Animated and interactive UI components. Used for visual effects and motion-rich elements. Install via:
@aceternity — ui.aceternity.com
@aceternity — ui.aceternity.com
Unique, design-heavy components. Used for special visual sections. Install via:
@skiper-ui — skiper-ui.com
@skiper-ui — skiper-ui.com
Premium animated components. The landing page uses
Skiper53 from this registry for the hero image carousel on desktop.Adding a new component
Identify the correct layer
Ask: does this component stand alone with no children components? → atom. Does it compose two or more atoms? → molecule. Does it represent a full page section? → organism.
Create the file
Use kebab-case file names. Client components must include the
"use client" directive at the top.