You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Generated: 2026-01-08Part: mainType: React Router v7 Web Application
Component Overview
The OCOBO website implements a comprehensive component library built on Ark UI primitives with custom styling via Panda CSS. Components are organized by function and reusability, following atomic design principles.
Base UI Components (app/components/ui/)
Form Components
Component
File
Purpose
Dependencies
Button
Button.tsx
Primary action buttons with variants
Ark UI factory, Panda recipes
IconButton
IconButton.tsx
Icon-only buttons
Button component, Lucide icons
Input
Input.tsx
Text input fields with validation
Panda styling
Label
Label.tsx
Form field labels
Accessibility support
Select
Select.tsx
Dropdown selection component
Ark UI Select
Layout Components
Component
File
Purpose
Dependencies
Container
Container.tsx
Content width container
Panda patterns
Card
Card.tsx
Content cards and panels
Panda styling
Carousel
Carousel.tsx
Image/content carousel
react-snap-carousel
Navigation Components
Component
File
Purpose
Dependencies
NavigationMenu
NavigationMenu.tsx
Main navigation menu
Radix NavigationMenu (not yet migrated)
Breadcrumb
Breadcrumb.tsx
Navigation breadcrumbs
Custom implementation
Interactive Components
Component
File
Purpose
Dependencies
Accordion
Accordion.tsx
Expandable content sections
Ark UI Accordion
ScrollArea
ScrollArea.tsx
Custom scrollable areas
Ark UI ScrollArea
DotButton
DotButton.tsx
Carousel navigation dots
Custom styling
DotPagination
DotPagination.tsx
Pagination indicator
Custom implementation
FlipCard
flip-card.tsx
Fixed-height card that turns over with its button, a tap or a mouse hover; the hidden face is inert
flipCard slot recipe
Display Components
Component
File
Purpose
Dependencies
Avatar
Avatar.tsx
User profile images
Image handling
Tag
Tag.tsx
Content tags and labels (blog chip, keeps its own style)
Panda styling
Eyebrow
eyebrow.tsx
label text variant, optional 7px coloured dot (dotColor)
text recipe
headlineAccent
headline-accent.ts
Class per tone for the italic second line of page headlines, colours from the headlineAccent semantic tokens; ai is gradient text
css() map, no recipe
Illustration
Illustration.tsx
SVG illustrations
Custom wrapper
Logocobo
Logocobo.tsx
Company logo component
SVG assets
Feedback Components
Component
File
Purpose
Dependencies
Loader
Loader.tsx
Loading states
SVG animations
Spinner
Spinner.tsx
Inline loading indicator
CSS animations
ScrollProgressBar
ScrollProgressBar.tsx
Reading progress indicator
Scroll events
Feature-Specific Components
Homepage Components (app/components/home/)
Component
File
Purpose
Reusability
HeroSection
hero-section.tsx
Homepage hero section
Homepage-specific
SocialProofSection
social-proof-section.tsx
Client marquee + testimonial
Homepage-specific
PainPointSection
pain-point-section.tsx
RevOps pain point + mission
Homepage-specific
TransformationSection
transformation-section.tsx
System vs tools + method summary
Homepage-specific
InterventionsSection
interventions-section.tsx
Interventions cards
Homepage-specific
ComparatifSection
comparatif-section.tsx
Ocobo vs others comparison
Homepage-specific
StackSection
stack-section.tsx
Partner stack grid
Homepage-specific
CtaSection
cta-section.tsx
Bottom CTA
Reusable with props
ClientMarquee
client-marquee.tsx
Animated client list
Homepage-specific
TestimonialCard
testimonial-card.tsx
Testimonial block
Homepage-specific
FeatureCard
feature-card.tsx
Icon + label cards
Reusable
HeroSplit
hero-split.tsx
Hero layout split
Reusable
FlexPair
flex-pair.tsx
Icon + content rows
Reusable
ModularStackGrid
modular-stack-grid.tsx
Tech stack grid
Reusable
DashboardIllustration
dashboard-illustration.tsx
Hero illustration
Homepage-specific
Offer Components (app/components/offer/)
Component
File
Purpose
Reusability
HeroSection
hero-section.tsx
Offer hero section
Offer-specific
ArchitecturalGrid
architectural-grid.tsx
Hero illustration grid
Offer-specific
SymptomsSection
symptoms-section.tsx
Growth symptoms + pyramid
Offer-specific
PyramidSection
pyramid-section.tsx
Symptoms pyramid graphic
Offer-specific
TransitionSection
transition-section.tsx
RevOps transition highlights
Offer-specific
OffersDetailSection
offers-detail-section.tsx
Offer phases + deliverables
Offer-specific
LeviersSection
leviers-section.tsx
Growth levers cards
Offer-specific
MethodeSection
methode-section.tsx
4-step method overview
Offer-specific
ImplicationsSection
implications-section.tsx
Concrete RevOps actions
Offer-specific
WhyOcoboSection
why-ocobo-section.tsx
Reasons to choose Ocobo
Offer-specific
CtaSection
cta-section.tsx
Offer CTA
Reusable with props
SectionHeader
section-header.tsx
Offer section header
Reusable
Method Components (app/components/method/)
Component
File
Purpose
Reusability
HeroSection
hero-section.tsx
Method hero section
Method-specific
AttioPillarsIllustration
attio-pillars-illustration.tsx
Method hero illustration
Method-specific
PillarsSection
pillars-section.tsx
4 pillars overview
Method-specific
PillarCard
pillar-card.tsx
Pillar detail card
Reusable
ScopeSection
scope-section.tsx
Scope + diagram
Method-specific
UnifiedBowtie
unified-bowtie.tsx
Revenue scope diagram
Method-specific
ScopeCard
scope-card.tsx
Scope detail card
Reusable
About Components (app/components/about/)
Component
File
Purpose
Reusability
HeroSection
hero-section.tsx
About hero section
About-specific
DataIllustration
data-illustration.tsx
About hero illustration
About-specific
ManifestoSection
manifesto-section.tsx
Manifesto content
About-specific
TeamSection
team-section.tsx
Founding team section
About-specific
TeamMemberCard
team-member-card.tsx
Team profile card
Reusable
ValuesSection
values-section.tsx
Values grid
About-specific
ValueCard
value-card.tsx
Values card
Reusable
Member Components (app/components/member/)
Component
File
Purpose
Reusability
MemberCard
member-card.tsx
Profile card: avatar, role, bio, LinkedIn (jobs, blog author)
Reusable
PersonCard
person-card.tsx
Person variant of FlipCard: photo, role and challenge label, then contribution or bio, tools (with a limit) and previous companies
Sections of the challenge page (app/routes/_main.($lang).challenges.$slug.tsx). The route builds the view model with buildChallengePage (app/modules/challenge-page.ts), which drops mockup placeholders ([...], rule in docs/architecture/two-repo-content-pipeline.md) and returns null for a section with no content. The page root sets colorPalette to the challenge colour (challenge-palette.ts); the sections read colorPalette and colorPalette.light.
The sections fed by cross-references (client case, experts) get their view models from buildChallengeReferenceSections (app/modules/challenge-reference-sections.ts). The loader returns only that output, plus the resolved partner for the partner block. "Other challenges" reads the navbar list of the _main layout through useOtherChallenges (app/hooks/use-challenge-menu.ts), with no fetch of its own.
Shared pieces:
challenge-pill.ts: the challenge pill class per key, used by the hero and the other challenges.
challengeFill in challenge-palette.ts: the solid fill per challenge (white text on Revenue Systems, coral for Revenue AI, as ADR 0002 sets). The pill and PersonCard (app/components/member/person-card.tsx) use it.
challengeHeadlineAccent in challenge-palette.ts: the headlineAccent class per challenge (gradient for Revenue AI). The hero uses it on the second line of the title.
Component
File
Purpose
Reusability
ChallengeHero
challenge-hero.tsx
Colour pill, title, quote, lead, CTA to the diagnostic, bow tie with the active stages
Challenge-specific
ChallengeSymptoms
challenge-symptoms.tsx
Symptom cards with coral bullets
Challenge-specific
ChallengeAudience
challenge-audience.tsx
Teams, roles and benefit, on the light challenge colour
Challenge-specific
ChallengeClientCase
challenge-client-case.tsx
Case headline, summary, metric cards and the link to the Story; one column without metrics
Challenge-specific
ChallengeExperts
challenge-experts.tsx
Expert cards (PersonCard) of the Team members on the challenge
Challenge-specific
ChallengeStack
challenge-stack.tsx
Revenue Systems only (key sy): heading, CTA to the technology page and StackDiagram; copy in the challenges namespace
Challenge-specific
ChallengeDiagnostic
challenge-diagnostic.tsx
Yellow closing block with the contact CTA (#diagnostic)
Challenge-specific
ChallengeOtherChallenges
challenge-other-challenges.tsx
Pills to the other challenges, from the navbar list
Challenge-specific
Stack diagram (app/components/stack/)
Ocobo's Revenue Systems stack: the CRM at the centre, four numbered layers around it (01 signals, 02 context, 03 interface, 04 execution). The data has one source, revenueStack in app/modules/revenue-stack.ts. The copy lives in the stack locale namespace. The figure is a size container: from 1024px of its own width (@/5xl) it takes the 5-column layout, below that one column in number order.
Component
File
Purpose
Reusability
StackDiagram
stack-diagram.tsx
The whole figure: layer cards, CRM core, animated connectors; entrance on scroll, animations off under reduced motion
Reusable (challenge page, technology page, home)
StackLabel, ToolChips, ToolList, ToolIcon
stack-parts.tsx
Layer label with its dot, tool chips, tool rows with their role, logo or monogram
Stack-specific
Design system showcase (app/components/design-system/)
One *-section.tsx module per /design-system section, each wrapped in ShowcaseSection (showcase-section.tsx), whose heading carries an anchor id derived from its title. The registry designSystemGroups in subpages.ts lists the pages in three groups (foundations, components, patterns) and each page's section titles. It feeds the sidebar (design-system-sidebar.tsx) and the grouped index (design-system._index.tsx). The sidebar lists the current page's sections under its link when the page has more than one, from lg. app/routes/design-system.tsx is the layout: one sidebar, then the page title and Outlet. Each page is a route design-system.<slug>.tsx that only composes its section modules. A new showcase section is a new module, its title in the registry and one line in its page route.
Layout Components (Root Level)
Application Layout
Component
File
Purpose
Usage
LayoutMain
LayoutMain.tsx
Main application layout
All public pages
LayoutPost
LayoutPost.tsx
Blog/story layout
Content pages
Header
Header.tsx
Global site header
All pages
Footer
Footer.tsx
Global site footer
All pages
Navigation Components
Component
File
Purpose
Usage
MainMenu
MainMenu.tsx
Desktop navigation
Header component
MainMobileMenu
MainMobileMenu.tsx
Mobile navigation
Header component
MobileMenu
MobileMenu.tsx
Mobile menu wrapper
Mobile layouts
SubMenu
SubMenu.tsx
Secondary navigation
Contextual
LanguageSwitcher
LanguageSwitcher.tsx
Language toggle
Header component
Content Components
Content Processing
Component
File
Purpose
Usage
MarkdowContainer
MarkdowContainer.tsx
Markdown content wrapper
Blog posts
PageMarkdownContainer
PageMarkdownContainer.tsx
Page content wrapper
Static pages
Media Components
Component
File
Purpose
Usage
PlayerYoutube
PlayerYoutube.tsx
YouTube video player
Content embeds
ClientCarousel
ClientCarousel.tsx
Client showcase carousel
Homepage, stories
ToolCarousel
ToolCarousel.tsx
Tools/integrations carousel
Homepage
Form Components
Contact Forms
Component
File
Purpose
Usage
ContactForm
ContactForm.tsx
Main contact form
Contact page
IntContactForm
IntContactForm.tsx
International contact form
Localized contact
NewsletterForm
NewsletterForm.tsx
Newsletter subscription
Footer, CTAs
Form Support
Component
File
Purpose
Usage
ErrorMessage
ErrorMessage.tsx
Form error display
All forms
Icon Components
Custom Icons
Component
File
Purpose
Usage
Arrow
icons/Arrow.tsx
Directional arrows
Navigation, CTAs
Component Categories by Reusability
Highly Reusable (Design System)
All ui/ components
Layout components (LayoutMain, Header, Footer)
Content wrappers (MarkdownContainer, etc.)
Form components (ContactForm patterns)
Moderately Reusable (Feature Components)
Card components (BlogItem, StoryItem)
Hero variations (can be templated)
Team showcase components
Contact CTA sections
Page-Specific (Limited Reusability)
Homepage value proposition components
Strategy methodology components
Specific levers components
Page-specific hero components
Design System Recipes
Active Panda CSS recipes - use these before reaching for inline css().
v2 type scale (ADR 0002). Use the six kept names: display-xl (Display), display-lg (H2), display-md-bold (H3), body, small, label. The other names (display-2xl, display-lg-bold, display-section, display-sm, display-heading, display-md, display-card, subtitle, display-label) are aliases with the same values, deleted in J6. Colour variants unchanged
Design system v2 tokens
Defined in preset/tokens/ and preset/semantic-tokens.ts, shown on /design-system/tokens, /design-system/colours and /design-system/typography. ADR 0002 has the full mapping from older names.
Group
Tokens to use
Greys
gray (#71717A, muted text), gray.light, gray.50 to gray.700 (zinc), line (#ECECEE hairline)
Challenge colours
challenge.rp, challenge.se, challenge.sc, challenge.cx, challenge.sy, challenge.ai, each with .light tint
Gradients
gradients.ai (decoration, bgGradient), gradients.ai-text (textGradient, display and H2 only). AI content only
Radii
lg (S 8px), 2xl (M 16px), 3xl (L 24px), full
Shadows
rest, hover, window; offset is the one named exception
Font sizes
display, h2, h3 (24px), body (17px), sm (14px), caption (13px), label (11px), micro (10px)
Letter spacings
label (.3em), tag (.16em), chip (.08em)
Line heights
heading (1.05), body (1.6)
Easing
smooth (cubic-bezier(.2,.8,.2,1))
Section composition pattern
The canonical pattern for page sections: section() recipe on the <section> element + <Container> inside for max-width and horizontal padding.
<Container> handles maxW: '70rem', mx: 'auto', px: '8'. Use narrow prop for narrower content columns (maxW: '56rem').
Card usage pattern
All bordered card surfaces use the card() recipe. Do not write inline rounded + border + shadow combinations.
// Default card (white, line border, rest shadow, padding md 28px, radius md 16px)<divclassName={card()}>...</div>// Tinted background<divclassName={card({tone: 'tinted'})}>...</div>// No border, shadow only<divclassName={card({border: false})}>...</div>// Large padding and radius<divclassName={card({padding: 'lg',radius: 'lg'})}>...</div>
Recipes vs inline css() - decision rules
Use a recipe when the component already has a matching recipe (check the table above). Don't reinvent what the DS owns.
Use css() for overrides only - extra properties beyond what the recipe covers (e.g. shadow, _groupHover, transition).
Never duplicate recipe props inline - if iconBox({ size: 'xl' }) already sets w, h, and rounded, don't repeat them in a sibling css() call.
Static values only in css() - Panda CSS extracts classes at build time; dynamic values won't generate. Pre-compute per-variant class strings with css() and combine at runtime with cx().
Propose a recipe addition when you see the same three-or-more css() properties repeated across two or more unrelated components.
Design System Integration
Panda CSS Recipes Used
Six live recipes (see table above): badge, button, card, iconBox, section, text. Their values follow ADR 0002 (design system v2) since J1 (#216). The _legacy/ folder (icon, link, subtitle, button) was deleted in issue #94. See docs/adr/0001-design-system-adoption-policy.md.
Ark UI Components
Accordion: Expandable content sections
Select: Form dropdowns
ScrollArea: Custom scrollbars
Button: Via ark.button factory
Radix UI (remaining)
NavigationMenu: Main site navigation (not yet migrated)
react-context: Context utility used by Card, MobileMenu
Clear distinction between layout and content components
Accessibility Features
Ark UI provides accessible primitives
Proper ARIA labels and roles
Keyboard navigation support
Screen reader compatibility
Semantic HTML structure
This component inventory provides a comprehensive overview of the OCOBO website's component architecture, supporting maintainable development and consistent user experience across all pages.