Skip to main content

Form controls

Button

Input

Textarea

Select

Switch

Label

Form (with react-hook-form)

Layout & containers

Card

Dialog

Status & feedback

Badge

StatusBadge

One neutral outlined pill with a colored dot, for record states (“Active”, “Failed”, “Pending”). The label carries the meaning; the dot confirms it, so the pill reads the same to a color-blind viewer.
It accepts every Badge prop except variant, and exports the StatusTone type.

Stat

A headline figure: a small uppercase label, the figure in the heading face with its change beside it, and one muted line of context.
StatChange’s tone ('positive' | 'negative' | 'neutral') is the reading, not the direction: expenses falling is positive. A trend icon pairs with the color so the tone never rides on color alone; pass icon (a Font Awesome class) to use a different glyph.

Alert

Skeleton

Spinner

Overlays & menus

Tooltip

Separator

Page structure

@ekanos/ui/page ships the page shape the host’s own pages use, so a partner page does not hand-roll chrome. A page composes the parts in this order:
These primitives use route links from next/link, so render them inside a Next app (the harness provides one).

Utilities

Icon (Font Awesome)

name is a Font Awesome class string (fa-<style> fa-<glyph>, e.g. fa-light fa-house). Legacy Lucide component names (e.g. AlertCircle) are still translated to Font Awesome at render time during the migration, but must not be written; an unknown name falls back to fa-light fa-shapes. See Fonts & Icons for Font Awesome setup.

If (conditional rendering)

Trans (i18n with next-intl)

A client component that must render under a NextIntlClientProvider (it throws without one). A key resolves to the host’s message when it exists; otherwise defaults (interpolated), then children, then the key itself.

Utils

AI surfaces

PromptInput

onSubmit receives { text, files } and the form event. The entry also exports attachment, action-menu, select, hover-card, tab, and command parts (PromptInputActionMenu, PromptInputSelect, PromptInputCommand, …). Its ChatStatus and FileUIPart types come from the ai package, which is imported for types only.

Styling imports

Stylesheets

See Styling.

TypeScript

Every entry ships type declarations. A few prop types are exported by name, for example:
For components without a named props type, use React.ComponentProps<typeof Input>. Props extend the underlying element’s props, so standard attributes work: