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.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
Dropdown Menu
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)
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
TypeScript
Every entry ships type declarations. A few prop types are exported by name, for example:React.ComponentProps<typeof Input>. Props extend the underlying element’s props, so standard attributes work: