Overview
About ferry-ui
What ferry-ui is, who it is for, and the ideas behind its design.
Overview
What ferry-ui is, who it is for, and the ideas behind its design.
ferry-ui is a React design system for dense product interfaces: dashboards, admin consoles, settings pages, data tables and developer tools.
import {
Button,
Card,
CardAction,
CardContent,
CardDescription,
CardHeader,
CardTitle,
DescriptionItem,
DescriptionList,
StatusBadge,
} from 'ferry-ui'
export default function Principles() {
return (
<Card className="w-full max-w-md">
<CardHeader>
<div>
<CardTitle className="flex items-center gap-2">
Acme production
<StatusBadge tone="success" label="Active" size="sm" />
</CardTitle>
<CardDescription>Customer billing</CardDescription>
</div>
<CardAction>
<Button>Export</Button>
<Button variant="primary">Open project</Button>
</CardAction>
</CardHeader>
<CardContent className="text-[13px] text-foreground-light">
The project sends the invoices of 12 customers on the first day of each month.
</CardContent>
<DescriptionList variant="strip" columns={3} aria-label="Project facts">
<DescriptionItem label="Region" mono>
eu-west
</DescriptionItem>
<DescriptionItem label="Members">8</DescriptionItem>
<DescriptionItem label="Open invoices">4</DescriptionItem>
</DescriptionList>
</Card>
)
}ferry-ui is for two groups: the people who build product screens, and the AI agents that work with them.
Each component, prop and hook has a JSDoc text. The text says what the thing is, when to use it and when not to use it. The AGENTS.md file puts this text in one reference for agents. The AI agents page describes this file.
Each component is in one of three layers. The tokens give the colors, the radii, the shadows and the fonts to all of them.
| Layer | Role | Examples |
|---|---|---|
| Primitive | It wraps one Radix part or one HTML element. | Button, Dialog, Table |
| Pattern | It composes primitives for a usual need of a product. | Empty State, Form Card, Confirm Dialog |
| Layout component | It is a piece of the application shell. | App Shell, Top Bar, Icon Rail |
The card at the top of this page follows these principles.
| Principle | Meaning |
|---|---|
| A dense and calm interface | Most text is 13px and body text is 14px. Buttons are 30px high and fields are 34px high. Color is for meaning only. |
| Borders before shadows | The structure comes from 1px borders in three strengths. Only menus, popovers and dialogs have a deep shadow. |
| Two radii | Controls have a 6px radius. Containers have an 8px radius. |
| Mono labels | Mono Label is a small uppercase caption in a monospace font. It names cards, table columns and metrics. |
| One primary action | The solid primary button is the one main action of a page, a dialog or a card. |
| Two font weights | The hierarchy comes from the size and the text color. ferry-ui uses only the weights 400 and 500. |
| One class for the theme | Each color is a CSS variable. The dark class on the html element changes the palette. |
| No router and no store | ferry-ui has no global store, no router dependency and no data fetch. Props control each component. Links go through a link component that you supply. |
| Library | Role |
|---|---|
| Radix UI | The accessible parts below the primitives. |
| Tailwind CSS v4 | The styles and the theme. |
| shadcn/ui conventions | cn(), cva variants, data-slot attributes and asChild. |
| lucide-react | The icons. |
ferry-ui has the MIT license. The LICENSE file is in the repository.
| Subject | Value |
|---|---|
| License | MIT |
| Author | B.ROGER |
| Version | 0.1.0 |
The package contains its documentation and its license.
node_modules/ferry-ui/README.md
node_modules/ferry-ui/AGENTS.md
node_modules/ferry-ui/LICENSE