Packages

@prood/ui

The Prood design system and shared React components, from shadcn/Radix primitives to commerce and product UI.

@prood/ui is the Prood design system and the shared UI layer for every Prood application. It holds the tokens, the logo, shadcn/ui primitives (Radix + Tailwind) and the components for catalog, cart, checkout, account and product UI. Photography and film live next door in @prood/media.

Design system

One system runs every surface: marketing, dashboard, admin, docs, storefront and hosted checkout. The rules live in packages/ui/DESIGN.md, positioning and voice in _docs/BRAND.md, and the living reference is prood.com/design.

It hangs on three physical things from a shop on a Portuguese street:

  • Receipt paper: Paper, the warm canvas, and the Receipt component.
  • The roof tile: Telha, the one signal color, and TileEdge and TileField, filled tiles from the wordmark's ring that always hang downward.
  • The people behind the counter: real hands and faces in natural light, with one shared photo grade.
ConceptWhat to use
Colorsbackground, foreground, primary (Ink) and brand (Telha). Fixed ink, paper and telha inside components. Never hardcode a color in an app
Surfacessurface-ink and surface-telha restyle every token inside them, so components need no variants. Add surface-photo when text sits on a photograph
TypeBricolage Grotesque for headings, Instrument Sans for UI, Geist Mono for code. text-display-xl to text-display-sm, text-lead and text-eyebrow on marketing; PageHeader in product UI
ShapeControls rounded-lg, panels rounded-xl, large frames rounded-3xl. Borders over shadows
Merchant surfacesStorefront and hosted checkout use the same system on the neutral theme: no Telha, no Prood logo

Installation

Already a workspace dependency. Import directly:

tsx
import { Button } from '@prood/ui/components/button'
import { ProductGrid } from '@prood/ui/components/product-grid'
import { CartDrawer } from '@prood/ui/components/cart-drawer'

Import global styles in your app's root layout:

tsx
import '@prood/ui/globals.css'
import '@prood/ui/themes/prood.css'

Import exactly one theme next to globals.css: prood.css for Prood's own apps, neutral.css for merchant surfaces.

Component categories

Product

ComponentImportDescription
ProductCard@prood/ui/components/product-cardProduct thumbnail with price and add-to-cart
ProductGrid@prood/ui/components/product-gridResponsive product grid layout
ProductGallery@prood/ui/components/product-galleryImage gallery with zoom
ProductPrice@prood/ui/components/product-priceFormatted price with compare-at

Cart

ComponentImportDescription
CartDrawer@prood/ui/components/cart-drawerSlide-out cart panel
CartItem@prood/ui/components/cart-itemSingle cart line item
CartSummary@prood/ui/components/cart-summaryTotals breakdown
QuantitySelector@prood/ui/components/quantity-selector+/- quantity control

Order

ComponentImportDescription
OrderCard@prood/ui/components/order-cardOrder summary card
OrderTimeline@prood/ui/components/order-timelineStatus timeline
ComponentImportDescription
SearchPalette@prood/ui/components/search-paletteCommand-k style search

Product UI

Every dashboard and admin page is built from these.

ComponentImportDescription
PageHeader@prood/ui/components/page-headerPage title, a sentence of context and one primary action
StatGrid, Stat@prood/ui/components/stat-gridA row of headline numbers, joined by hairlines
StatusBadge@prood/ui/components/status-badgeStatus of an order, domain or provider. Tones: neutral, brand, success, warning, danger, info
Panel@prood/ui/components/panelTitled, bordered block around a table, list or form. Pass flush for tables
AuthShell@prood/ui/components/auth-shellSign-in, sign-up and onboarding: the form beside a MediaImage passed as aside
tsx
import { PageHeader } from '@prood/ui/components/page-header'
import { Panel } from '@prood/ui/components/panel'
import { StatusBadge } from '@prood/ui/components/status-badge'

<PageHeader title="Orders" description="Everything your customers have bought." />
<Panel title="Recent orders" flush>
  <StatusBadge tone="success">Paid</StatusBadge>
</Panel>

Marketing

ComponentImportDescription
HeroBanner@prood/ui/components/hero-bannerFull-width hero section
Receipt@prood/ui/components/receiptThe signature fragment: a torn till receipt for a sale or order moment. Sample data only
TileEdge, TileField@prood/ui/components/tileThe hanging tile motif. TileEdge at section seams, with awning under a photograph, TileField behind Ink and Telha panels
BrowserFrame, PhoneFrame@prood/ui/components/device-frameDevice chrome around real components, never drawings of a screen

Reviews

ComponentImportDescription
ReviewStars@prood/ui/components/review-starsStar rating display

Common

ComponentImportDescription
EmptyState@prood/ui/components/empty-stateEmpty list placeholder
ProductTypeBadge@prood/ui/components/product-type-badgeProduct type indicator

shadcn primitives

Standard shadcn/ui components in @prood/ui/components/:

button, input, label, card, dialog, dropdown-menu, sheet, table, tabs, badge, skeleton, sonner, sidebar, etc.

Utility functions

ts
import { formatPrice, localized } from '@prood/ui/lib/commerce'

formatPrice(9999, 'EUR')           // → "€99.99"
localized(product.name, 'en')      // → "T-Shirt"

Adding new components

Install shadcn primitives:

pnpm dlx shadcn@latest add dialog -c packages/ui

Commerce components are hand-authored in packages/ui/src/components/.

Theming

Uses CSS variables with Tailwind v4. Dark mode via next-themes:

tsx
import { ThemeProvider } from 'next-themes'

<ThemeProvider attribute="class" defaultTheme="system">
  {children}
</ThemeProvider>

Color tokens are defined in packages/ui/src/styles/themes/prood.css and neutral.css. packages/ui/src/styles/globals.css maps them to Tailwind with @theme inline and holds the display type scale.