Button
A button that runs an action.
Every component rendered live from the eidotter npm package.
Each card says what the component does and links to Storybook for the API.
Buttons, text fields, toggles, and filters — components that capture input.
A button that runs an action.
A labelled text field for one line of text.
Use the label prop for visible labels. Use errorMessage for validation feedback.
Don't use placeholder text as the sole label — it vanishes on focus.
Turns one option on or off. Use several to pick more than one.
An on/off setting that takes effect at once.
A row of filters that narrows a list to one subset.
A square button that shows only an icon, such as close or next.
Write the label as the action, such as "Close settings" or "Next image".
Don't use it when the action needs a word to be clear. Use Button with text.
Default size, 36px: close, previous, next, disabled
Window size, 28px, for dense title strips
Bare variant, no outline at rest
Touch size, 44px, for stage and kiosk screens
Inherit tone: takes the bar's text colour
Status, progress, and system state — communicated back to the user.
A message box in the page that stays until dismissed.
Match the color to the severity. Use title for the headline and children for supporting text.
Don't use alerts for transient feedback like "Saved!" — use Notification with auto-dismiss.
A short toast message. Your app places it and decides when it goes.
Use for transient feedback. Set duration for auto-dismiss. Stack in a fixed container.
Don't use for persistent messages — use Alert instead.
A small label for a status or a count.
A bar that shows how much of a task is done.
One number with a label and an optional trend.
Containers, accordions, tabs, and navigation — structure for your content.
A box that groups related content under an optional title.
Use one variant consistently within a grid. Reserve glow for a single highlighted item.
Don't nest cards — use Section for sub-groups.
A window frame with a title strip, for panels in the page.
Backup finished at 08:00. Drive C:\ is at 64%.
A section that opens and closes when you click its heading.
No network adapter detected.
An accordion built from a list of titles and texts.
A dialog that keeps keyboard focus inside until you close it.
Keep modal content focused on a single task. Provide a clear way to dismiss.
Don't trap reference content in a modal — use InlineExpand so users can read and work at once.
Are you sure you want to format C:\?
Static preview: Modal's DosDialog chrome rendered with inline. The DosDialog card below opens a live dialog.
The overlay frame that Modal, Lightbox and CmdPalette use.
Pass a close IconButton in the head. DosDialog does not add one for you.
Don't open one dialog over another. Every dialog shares one z-index layer.
Inline: the same chrome in the page, no overlay, no JS
CRT effects: on. Theme: amber.
Overlay: opens a live dialog
Opens with ⌘K, filters a list as you type, and runs the item you pick.
Surface high-frequency verbs the user knows by name. Keep labels imperative.
Don't use it as a generic search — it's a verb launcher, not a query tool.
Switches between panels of related content.
Keep tab labels short (1-2 words). Use underline for content tabs, pills for mode switching.
Don't use tabs for sequential steps — that implies a wizard, not navigation.
Underline (default)
Pills variant
Shows where the current page sits in the site.
A list of site links that folds into a menu on phones.
Retro variant (default)
Modern variant
The bar at the top of a site with the brand and the nav.
This site's header is a live Header component. Scroll up to see it.
Display menu in the end slot
The Display menu at the right of this site's header has two switches. DOS sets the style: on is a DOS theme (switching it on picks amber-mono), off is the modern light theme (eidotter/themes/light.css). LIGHT sets the brightness within DOS: on is amber-paper (eidotter/themes/amber-paper.css: black ink on an amber ground), off is amber-mono. Under the modern theme the LIGHT switch is not shown; switching DOS back on brings it back. The menu sets data-theme on <html> and remembers the choice in this browser. A small script in <head> applies the saved theme before the page paints and points the theme-color meta at the theme's background. The end slot sits after the nav on wide screens and before MENU on phones.
One column for a whole page: header, sections and footer on one left edge.
Put the Header in the header slot with layout="stacked" and rule={false}. Put each block in a PageSection.
Don't draw rules between sections. Spacing separates them.
EXAMPLE.COM
Home · Notes · About
Header, sections and footer share one left edge, 40px apart, with no dividers.
A small PageShell with a 480px column. Use contentAs="div" when your layout already has a <main>. The Storybook template ReviewPage shows PageShell, a stacked Header and Bench together.
A line between two blocks of content.
Use between logical sections of content to create breathing room.
Don't stack separators or use between every element — let spacing do that work.
Shows two versions side by side, such as before and after.
Label each pane with what it shows. Give screenshots alt text.
Don't use it for a single image. Use DosFigure.
Before: the heading is centred. After: it sits on the column edge.
README.TXT
Brand, nav and text on one left edge.
README.TXT
Brand, nav and text on one left edge.
The panes sit side by side when the bench is at least 760px wide, and stack below that.
The bar at the bottom of a page with legal and other links.
Place once in your layout. Pass legal links relevant to your jurisdiction.
Don't duplicate footer content — use the component's link props.
The footer at the bottom of this page is a live Footer component.
Text, code, icons, and inline content — displayed and interactive.
A read-only DOS window for command output and code.
A DOS command line that runs a callback when you press Enter.
A phrase in a paragraph that opens its explanation in place.
eiDotter ships
A link inside running text.
Read more in the component categories, browse the Storybook, or check the repository.
A frame for screenshots and placeholder images, with optional notes.
A label you can select or remove.
Lays out a set of tags and handles their keyboard behaviour.
Text that cycles through random characters before it settles.
Pixel-art icons from pixelarticons (MIT) that take the colour of the text around them.
These components show reserves, what is still active, and how far a value is from a target. Your app supplies the bands, targets and labels as props. The demos use sample data.
A ring that shows one value as a percent.
Mark estimated values with provenance so readers know where a number comes from.
Don't use a gauge for values over time. Use SeriesBars for that.
A bar that shows how full a reserve is, with an optional target range.
Give the optimal range on the same scale as the value.
Don't rely on color alone. Each tone has a fill pattern and a text label.
One bar split into parts that add up to the whole.
A short row of bars measured against a goal line.
unit="%" adds the unit to the screen-reader summary, the value table and the bar titles, so the goal reads "60 %".
Shows how much of something is still active over time.
Pass the current time in. The strip never reads the clock.
Don't leave out provenance. It is required so readers can tell modelled values from measured ones.
A row of monitor-style tiles, one per reading.
Events, milestones, and versions plotted along a time axis.
A single marker on a timeline.
A timeline you can zoom, scroll, list or open entry by entry.
Use interactive mode for exploratory timelines, static mode for read-only feeds, and master-detail when an entry needs to open into a full reading pane while the timeline stays as navigation.
Don't use interactive mode for simple lists — static mode is lighter and more readable.
Interactive mode (default)
Static mode (vertical feed)
Master-detail mode (level-3 split view)
Static previews — see Storybook for interactive zoom, keyboard, and master-detail navigation.
Presentational messaging components — no AI SDK dependency. Compose inside Terminal for a DOS chat window.
One message in a chat, styled by who sent it.
Use inside ChatHistory or a custom list. Set role to "user", "assistant", or "system".
Don't use for non-chat content — use Alert or Card instead.
Overlays and animations that bring CRT character to any page.
Adds CRT scanlines, glow and flicker over the whole page.
The scanlines, glow, and flicker on this page come from the
RetroEffects component — a fixed CSS overlay.