Context
The org-wide CLAUDE.md mandates that every product app's visual primitives come from @ferrlabs/ui-react (and @ferrlabs/ui-astro for marketing sites). No local Button, Card, Sidebar, Modal when an equivalent ships upstream.
Today, 0 of 5 product apps consume @ferrlabs/ui-react. Each has its own primitive family:
| App |
Local family |
Files using it |
| FerrFleet-Cloud (FerrAgents) |
AgtCard, AgtChip, AgtChrome, AgtTabHeader |
12+ |
| FerrVault-Cloud |
VltCard, VltButton, VltChip, Vault.tsx |
8+ |
| FerrTrack-Cloud |
local primitives |
TBD |
| FerrGrowth-Cloud |
local primitives |
TBD |
| FerrLens-Cloud |
(Astro SSR — uses ui-astro?) |
TBD |
Why this matters
- Brand drift: each product diverges from the design tokens
- Bug fix multiplier: a a11y fix or RTL fix has to land N times
- Onboarding cost: every new contributor learns N primitive APIs
Sub-issues to spawn (1 per app)
Each migration is sizeable (~1 sprint per app). Recommend doing them in dependency order: FerrFleet first (fewest screens), then FerrVault, then FerrTrack/FerrGrowth.
Pre-work
- For each missing primitive in the lib, add it upstream first (in
FerrLabs/UI), release, then consume.
Context
The org-wide CLAUDE.md mandates that every product app's visual primitives come from
@ferrlabs/ui-react(and@ferrlabs/ui-astrofor marketing sites). No localButton,Card,Sidebar,Modalwhen an equivalent ships upstream.Today, 0 of 5 product apps consume
@ferrlabs/ui-react. Each has its own primitive family:AgtCard,AgtChip,AgtChrome,AgtTabHeaderVltCard,VltButton,VltChip,Vault.tsxWhy this matters
Sub-issues to spawn (1 per app)
app/fromAgtChrome.*to@ferrlabs/ui-reactapp/fromVault.*to@ferrlabs/ui-reactapp/to@ferrlabs/ui-reactapp/to@ferrlabs/ui-react@ferrlabs/ui-astrousage onsite/Each migration is sizeable (~1 sprint per app). Recommend doing them in dependency order: FerrFleet first (fewest screens), then FerrVault, then FerrTrack/FerrGrowth.
Pre-work
FerrLabs/UI), release, then consume.