# Mlola UI: everything in one file Version 1.1.4. Generated from the registry at https://ui.mlola.com. Free components are shown in full; Mlola Pro items are described, and their source comes with a license. --- # Mlola UI for code generation Generated from the source of truth. Do not edit by hand. ## Read this first - **Do not import a styling framework.** The library ships its own CSS. There is no Tailwind, no CSS-in-JS and no class name utility to install. - **Style through the classes below, never through invented ones.** A class that is not in this document does not exist. (Mlola Pro's classes are in the guide that comes with Pro source.) - **Behavior is optional and framework-free.** `@mlola-ui/behavior` attaches to markup you already rendered. It never renders anything itself, so it works with React, Svelte, Vue, Rails, a Go template or a static file. - **Native controls stay native.** Checkbox and radio are real `` elements. Do not reimplement them. ## The shortest correct example ```html
``` ## Themes Set `data-theme` and `data-mode` on any ancestor. Nothing else changes. | id | name | | --- | --- | | `graphite` | Graphite | | `atelier` | Atelier Umami | | `machined` | Machined Titanium | | `aerogel` | Aerogel Glass | | `nordic` | Nordic Earth | `data-mode` is `light`, `dark`, or `system`, which follows the reader's own setting. The themes' type reads `--font-inter`, `--font-newsreader` and `--font-jetbrains` before its fallbacks: load those fonts (next/font's `variable` option, or @font-face) and set the variables on the root, or the page uses the system's fonts. A project defines its own theme in one file, `mlola.theme.json`, which overrides fonts, colors, geometry, the spacing and type scale, and any custom property through `extend`. See `mlola.theme.example.json`. ## Tokens Every value a design needs is a token. Read them with `var()`; never write a color, a size from outside the scales, a shadow or a duration by hand. Values change with the theme and the mode, the names never do. - **Planes and ink.** Backgrounds, surfaces, the three levels of text, borders. `--ml-background` `--ml-background-subtle` `--ml-surface` `--ml-surface-elevated` `--ml-text` `--ml-text-muted` `--ml-text-faint` `--ml-border` `--ml-border-subtle` - **Color roles.** Each role is a fill with its `-foreground` and `-hover`, a `-text` for text and marks on the page, and (primary) a `-subtle` tint. `--ml-primary` `--ml-primary-foreground` `--ml-primary-hover` `--ml-primary-text` `--ml-primary-subtle` `--ml-success` `--ml-success-foreground` `--ml-success-hover` `--ml-success-text` `--ml-warning` `--ml-warning-foreground` `--ml-warning-hover` `--ml-warning-text` `--ml-danger` `--ml-danger-foreground` `--ml-danger-hover` `--ml-danger-text` `--ml-info` `--ml-info-foreground` `--ml-info-hover` `--ml-info-text` - **Charts.** A categorical palette for series, 3:1 on the surface. Never a status. `--ml-chart-1` `--ml-chart-2` `--ml-chart-3` `--ml-chart-4` `--ml-chart-5` `--ml-chart-6` - **Interaction and light.** Focus, hover and pressed fills, tracks, the veil behind overlays, light and knobs. `--ml-focus` `--ml-fill-hover` `--ml-fill-active` `--ml-track` `--ml-control-border` `--ml-ring` `--ml-scrim` `--ml-highlight` `--ml-knob` `--ml-knob-shadow` `--ml-sheen` - **Spacing.** The only spacing: gaps, padding, margins, offsets. `--ml-space-px` `--ml-space-0-5` `--ml-space-1` `--ml-space-1-5` `--ml-space-2` `--ml-space-2-5` `--ml-space-3` `--ml-space-3-5` `--ml-space-4` `--ml-space-4-5` `--ml-space-5` `--ml-space-6` `--ml-space-7` `--ml-space-8` `--ml-space-9` `--ml-space-10` `--ml-space-12` `--ml-space-14` `--ml-space-16` - **Type.** The only type sizes, line heights, families and weights. `--ml-type-2xs` `--ml-type-xs` `--ml-type-sm` `--ml-type-base` `--ml-type-md` `--ml-type-lg` `--ml-type-xl` `--ml-type-2xl` `--ml-leading-tight` `--ml-leading-snug` `--ml-leading-normal` `--ml-font-sans` `--ml-font-display` `--ml-font-mono` `--ml-display-weight` `--ml-body-leading` `--ml-tracking` - **Density.** Control heights, panel padding, the touch target. `--ml-control-sm` `--ml-control-md` `--ml-control-lg` `--ml-panel-padding` `--ml-target-min` - **Shape.** Corner radii by the size of the thing, and the border weight. `--ml-radius-xs` `--ml-radius-sm` `--ml-radius-md` `--ml-radius-lg` `--ml-radius-pill` `--ml-border-width` - **Depth and material.** Elevation, and the material a floating surface is made of. `--ml-texture-opacity` `--ml-material` `--ml-surface-alpha` `--ml-surface-blur` `--ml-surface-grain` `--ml-surface-highlight` `--ml-shadow-xs` `--ml-shadow-sm` `--ml-shadow-md` `--ml-shadow-lg` `--ml-shadow-xl` `--ml-shadow-tint` - **Motion.** Every transition and entrance. `--ml-duration-fast` `--ml-duration-normal` `--ml-duration-slow` `--ml-duration-reveal` `--ml-ease-standard` `--ml-ease-spring` `--ml-ease-bounce` - **Layers.** The one stacking order. `--ml-layer-raised` `--ml-layer-sticky` `--ml-layer-header` `--ml-layer-dropdown` `--ml-layer-overlay` `--ml-layer-modal` `--ml-layer-popover` `--ml-layer-toast` `--ml-layer-tooltip` `--ml-layer-top` - **Icons.** The theme's icon channel. `--ml-icon-stroke` ## Designing new UI in the Mlola language When the elements above do not cover what you need, build it the way they are built, and it will look like it belongs. 1. **Compose first.** Reach for a component, then a layout primitive, and write CSS only for what neither covers. Put it in a layer of your own, declared before `mlola.accessibility` so the accessibility guarantees still win: `@layer mlola.tokens, mlola.foundations, mlola.materials, mlola.recipes, mlola.motion, app, mlola.accessibility;` 2. **Name what it is, not how it looks.** One class per element role, with your own prefix (not `ml-`, so a later Mlola element never collides). State and variant go in `data-*` and `aria-*`, never in a second class. Reuse the shared words: `data-tone` is `neutral primary info success warning danger`; `data-size` is `xs sm md lg xl`; work that went wrong is `error`. 3. **Color by role, never by value.** Planes are `background`, `background-subtle`, `surface`, `surface-elevated`. Ink is `text`, `text-muted`, `text-faint`. A colored fill (`primary`, `danger`, …) always carries its `-foreground`. Colored text, icons, lines and status marks on the page use the `-text` role: fills are only kept 1.5:1 from the page, enough for an area, not for meaning. Series use `chart-1`…`chart-6`. 4. **Measure with the scales.** Spacing from `--ml-space-*`, type from `--ml-type-*` with `--ml-leading-*`, control heights from `--ml-control-*`, panel padding from `--ml-panel-padding`. A `clamp()` between two steps is fine; a value invented between them is not. 5. **Shape and depth come from the theme.** Radii by the size of the thing (`xs` a tag, `sm` a small control, `md` a control or card, `lg` a panel or dialog, `pill`). Elevation from `--ml-shadow-*`; a floating surface also takes the material: `--ml-surface-alpha`, `--ml-surface-blur`, `--ml-surface-highlight`. 6. **Move with the theme.** Durations from `--ml-duration-*`, easing from `--ml-ease-*`. Reduced motion is handled by the engine. 7. **Stack with the layers.** `--ml-layer-*`, never a raw z-index above 9. 8. **Keep it usable by hand.** Never remove an outline without a `:focus-visible` style in its place. Targets are at least 24px; a smaller control adds `data-hit="expand"` for touch. Text is never under `--ml-type-2xs`. 9. **Leave the theme alone.** `data-theme` and `data-mode` belong to the engine; never set them for a component's own meaning, and never style a theme or mode by name. If something must differ by theme, it is a token. ## Composition primitives Compose pages from these before writing layout CSS: sections, stacks, clusters, grids, headings, forms, stats. They read the same tokens as every component, so a page built from them themes with the rest. `.ml-actions` `.ml-brand` `.ml-brand-mark` `.ml-brand-name` `.ml-chart` `.ml-chart-bar` `.ml-chart-bars` `.ml-chart-heading` `.ml-check-list` `.ml-cluster` `.ml-definition-list` `.ml-display` `.ml-divider` `.ml-empty-state` `.ml-eyebrow` `.ml-filter-chip` `.ml-filter-group` `.ml-fine-print` `.ml-form` `.ml-form-message` `.ml-form-options` `.ml-grid` `.ml-heading` `.ml-icon-chip` `.ml-inline-form` `.ml-inline-form-field` `.ml-label` `.ml-lede` `.ml-link` `.ml-link-external` `.ml-page-shell` `.ml-person` `.ml-person-copy` `.ml-positive` `.ml-price` `.ml-required-mark` `.ml-section` `.ml-section-description` `.ml-section-header` `.ml-section-header-centered` `.ml-section-muted` `.ml-section-shell` `.ml-stack` `.ml-stat` `.ml-stat-card` `.ml-stat-grid` `.ml-stat-list` `.ml-stat-meta` `.ml-stat-value` `.ml-text-primary` `.ml-value` - `.ml-brand-mark` — A brand's own logo takes the mark's place: no chip, the text color, the mark's size. - `.ml-check-list` — A list of benefits, each after a check. Pricing tiers and feature rows share it. - `.ml-link` — A glyph inside a link flows with the text instead of breaking the line. - `.ml-link-external` — The mark after a link to another site, which opens in a new tab. - `.ml-page-shell` — The navigation, main and footer are grid items; they may be narrower than their widest content (a table that scrolls), so the page never does. - `.ml-section` — A section a link jumps to clears the sticky navigation bar. ## Elements and their attributes Emit these classes and attributes from any language and the visuals are correct. This table is read out of the stylesheet, so it is never stale. | class | attribute | allowed values | | --- | --- | --- | | `.ml-accordion-item` | `data-state` | `open` | | `.ml-alert` | `data-state` | `closing` | | `.ml-alert` | `data-tone` | `danger`, `info`, `neutral`, `success`, `warning` | | `.ml-alert` | `data-variant` | `soft` | | `.ml-app-shell` | `data-narrow` | _presence only_ | | `.ml-avatar-root` | `data-size` | `lg`, `sm`, `xl`, `xs` | | `.ml-avatar-status` | `data-status` | `away`, `busy`, `online` | | `.ml-badge` | `data-size` | `lg`, `sm` | | `.ml-badge` | `data-tone` | `danger`, `info`, `primary`, `success`, `warning` | | `.ml-badge` | `data-variant` | `outline`, `solid` | | `.ml-brand-mark` | `data-kind` | `logo` | | `.ml-breadcrumb-item` | `data-collapse-indicator` | _presence only_ | | `.ml-breadcrumb-item` | `data-collapsible` | _presence only_ | | `.ml-button` | `aria-disabled` | `true` | | `.ml-button` | `aria-pressed` | `true` | | `.ml-button` | `data-loading` | _presence only_ | | `.ml-button` | `data-size` | `icon`, `lg`, `sm` | | `.ml-button` | `data-state` | `success` | | `.ml-button` | `data-variant` | `danger`, `link`, `outline`, `primary`, `secondary`, `subtle` | | `.ml-button` | `data-width` | `full` | | `.ml-calendar-cell` | `data-preview` | _presence only_ | | `.ml-calendar-cell` | `data-range` | `end`, `start` | | `.ml-calendar-day` | `aria-disabled` | `true` | | `.ml-calendar-day` | `data-outside` | _presence only_ | | `.ml-calendar-day` | `data-selected` | _presence only_ | | `.ml-calendar-day` | `data-today` | _presence only_ | | `.ml-calendar-day` | `data-unreachable` | _presence only_ | | `.ml-card` | `data-interactive` | _presence only_ | | `.ml-card` | `data-variant` | `elevated`, `glass`, `specular` | | `.ml-carousel` | `data-arrows` | _presence only_ | | `.ml-carousel` | `data-playing` | _presence only_ | | `.ml-carousel-arrow` | `data-side` | `next`, `previous` | | `.ml-carousel-dot` | `aria-current` | `true` | | `.ml-chart-bar` | `data-highlighted` | `true` | | `.ml-checkbox-field` | `data-state` | `checked`, `indeterminate` | | `.ml-circular-progress` | `data-size` | `lg`, `sm` | | `.ml-circular-progress` | `data-state` | `complete`, `indeterminate` | | `.ml-circular-progress` | `data-tone` | `danger`, `info`, `success`, `warning` | | `.ml-color-picker-preset` | `aria-pressed` | `true` | | `.ml-combobox-control` | `data-open` | _presence only_ | | `.ml-combobox-input` | `data-clearable` | _presence only_ | | `.ml-combobox-input` | `data-leading` | _presence only_ | | `.ml-combobox-option` | `aria-disabled` | `true` | | `.ml-combobox-option` | `aria-selected` | `true` | | `.ml-combobox-option` | `data-create` | _presence only_ | | `.ml-combobox-option` | `data-highlighted` | _presence only_ | | `.ml-combobox-popover` | `data-side` | `top` | | `.ml-command-item` | `aria-disabled` | _presence only_ | | `.ml-command-item` | `aria-selected` | `true` | | `.ml-context-menu-item` | `aria-disabled` | `true` | | `.ml-context-menu-item` | `data-danger` | _presence only_ | | `.ml-context-menu-item` | `data-highlighted` | _presence only_ | | `.ml-copy-button` | `data-status` | `error` | | `.ml-date-picker-panel` | `data-presets` | _presence only_ | | `.ml-date-picker-trigger` | `data-empty` | _presence only_ | | `.ml-dropdown-item` | `data-danger` | _presence only_ | | `.ml-dropdown-item` | `data-highlighted` | _presence only_ | | `.ml-dropdown-menu` | `data-align` | `end` | | `.ml-dropdown-trigger` | `aria-expanded` | `true` | | `.ml-dropzone` | `aria-disabled` | _presence only_ | | `.ml-dropzone` | `data-dragging` | _presence only_ | | `.ml-dropzone-file` | `data-status` | `error` | | `.ml-empty` | `data-size` | `page` | | `.ml-filter-chip` | `aria-pressed` | `true` | | `.ml-filter-chip` | `data-state` | `active` | | `.ml-form-message` | `data-tone` | `danger`, `success` | | `.ml-grid` | `data-columns` | `1`, `2`, `3`, `4`, `6` | | `.ml-grid` | `data-layout` | `3-col`, `4-col`, `list` | | `.ml-heatmap` | `data-tone` | `info`, `success`, `warning` | | `.ml-heatmap-cell` | `data-active` | _presence only_ | | `.ml-heatmap-cell` | `data-level` | `1`, `2`, `3`, `4` | | `.ml-heatmap-cell` | `data-outside` | _presence only_ | | `.ml-input` | `aria-invalid` | `true` | | `.ml-input` | `data-invalid` | _presence only_ | | `.ml-input` | `data-size` | `lg`, `sm` | | `.ml-input` | `data-variant` | `filled`, `subtle` | | `.ml-input-control` | `data-leading` | _presence only_ | | `.ml-input-control` | `data-trailing` | _presence only_ | | `.ml-input-field` | `data-invalid` | _presence only_ | | `.ml-modal` | `data-size` | `full`, `lg`, `sm`, `xl` | | `.ml-number-input-control` | `data-disabled` | _presence only_ | | `.ml-number-input-control` | `data-invalid` | _presence only_ | | `.ml-otp` | `data-invalid` | _presence only_ | | `.ml-pagination-button` | `aria-current` | `page` | | `.ml-pagination-button` | `data-state` | `active` | | `.ml-password-input-strength` | `data-strength` | `medium`, `strong`, `weak` | | `.ml-password-input-toggle` | `aria-pressed` | `true` | | `.ml-popover` | `data-side` | `bottom`, `left`, `right`, `top` | | `.ml-priority-icon` | `data-priority` | `high`, `none`, `urgent` | | `.ml-progress-root` | `data-active` | _presence only_ | | `.ml-progress-root` | `data-size` | `lg`, `sm` | | `.ml-progress-root` | `data-state` | `complete`, `indeterminate` | | `.ml-progress-root` | `data-tone` | `danger`, `info`, `success`, `warning` | | `.ml-radio-group` | `data-orientation` | `horizontal` | | `.ml-radio-item` | `data-state` | `checked` | | `.ml-resizable` | `data-anchor` | `second` | | `.ml-resizable` | `data-direction` | `horizontal`, `vertical` | | `.ml-resizable-pane` | `data-folded` | _presence only_ | | `.ml-segmented-control-item` | `aria-pressed` | `true` | | `.ml-segmented-control-item` | `data-state` | `active` | | `.ml-select` | `data-size` | `lg`, `sm` | | `.ml-select` | `data-state` | `open` | | `.ml-select-option` | `data-disabled` | _presence only_ | | `.ml-select-option` | `data-highlighted` | _presence only_ | | `.ml-select-option` | `data-state` | `checked` | | `.ml-select-popover` | `data-side` | `top` | | `.ml-select-root` | `data-invalid` | _presence only_ | | `.ml-select-value` | `data-placeholder` | _presence only_ | | `.ml-sheet-panel` | `data-side` | `bottom`, `left`, `right`, `top` | | `.ml-sheet-panel` | `data-size` | `lg`, `sm` | | `.ml-sidebar-item` | `aria-current` | `page` | | `.ml-sidebar-title` | `aria-expanded` | `false` | | `.ml-sidebar-title` | `data-collapsible` | _presence only_ | | `.ml-skeleton` | `data-rounded` | `none` | | `.ml-slider-field` | `data-size` | `sm` | | `.ml-spinner` | `data-size` | `lg`, `sm` | | `.ml-status-icon` | `data-status` | `backlog`, `canceled`, `done`, `in-progress`, `in-review` | | `.ml-stepper` | `data-orientation` | `horizontal`, `vertical` | | `.ml-stepper-step` | `data-status` | `complete`, `current`, `error`, `upcoming` | | `.ml-table` | `data-size` | `sm` | | `.ml-table` | `data-stripe` | `alternate` | | `.ml-table` | `data-striped` | _presence only_ | | `.ml-table-row` | `data-state` | `selected` | | `.ml-tabs` | `data-orientation` | `vertical` | | `.ml-tabs` | `data-variant` | `enclosed`, `pills` | | `.ml-tabs-trigger` | `aria-selected` | `true` | | `.ml-tabs-trigger` | `data-state` | `active` | | `.ml-tag-input-control` | `data-disabled` | _presence only_ | | `.ml-tag-input-control` | `data-invalid` | _presence only_ | | `.ml-tag-input-tag` | `data-armed` | _presence only_ | | `.ml-textarea-count` | `data-full` | _presence only_ | | `.ml-time-picker-control` | `data-disabled` | _presence only_ | | `.ml-time-picker-control` | `data-unavailable` | _presence only_ | | `.ml-time-picker-option` | `aria-selected` | `true` | | `.ml-time-picker-segment` | `data-empty` | _presence only_ | | `.ml-time-picker-segment` | `data-period` | _presence only_ | | `.ml-timeline-item` | `data-status` | `complete`, `current`, `upcoming` | | `.ml-timeline-marker` | `data-status` | `complete`, `current`, `upcoming` | | `.ml-timeline-marker` | `data-tone` | `danger`, `info`, `primary`, `success`, `warning` | | `.ml-toast` | `data-has-description` | _presence only_ | | `.ml-toast` | `data-swiping` | _presence only_ | | `.ml-toast` | `data-tone` | `danger`, `info`, `success`, `warning` | | `.ml-toast-slot` | `data-state` | `closed` | | `.ml-toaster` | `data-position` | `bottom-center`, `bottom-right`, `top-center`, `top-right` | | `.ml-toggle` | `aria-checked` | `true` | | `.ml-toggle` | `data-size` | `lg`, `sm` | | `.ml-toggle` | `data-state` | `checked` | | `.ml-toggle-button` | `aria-pressed` | `true` | | `.ml-toggle-button` | `data-state` | `on` | | `.ml-tooltip` | `data-side` | `bottom`, `left`, `right`, `top` | | `.ml-tour-button` | `data-primary` | _presence only_ | | `.ml-tour-card` | `data-centered` | _presence only_ | | `.ml-tour-dot` | `data-active` | _presence only_ | | `.ml-tour-scrim` | `data-spotlight` | _presence only_ | ## Behavior ### accordion Disclosure list. One panel open at a time, or several. - Root: `.ml-accordion` - Parts: item `.ml-accordion-item`, trigger `.ml-accordion-trigger`, panel `.ml-accordion-panel` - ARIA on trigger: `role` — button (a real

Yes. The components in the open-source registry are free forever.

``` Load `@mlola-ui/behavior` and call `observe()` to give this markup its keyboard and state handling. --- # Alert > A status banner with variants, dismiss action, and optional action slot. - Tier: free, MIT - Category: Feedback - Docs: https://ui.mlola.com/docs/components/alert ## Install ```bash npx mlola-ui add alert ``` ```tsx import { Alert } from "@/components/ui/alert"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Alert | `tone` | `neutral`, `info`, `success`, `warning`, `danger` | `neutral` | | Alert | `variant` | `card`, `soft` | `card` | ## Example ```tsx import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; export default function Example() { return ( Your card expires soon Update it before September 30 to keep your plan. ); } ``` ## The same markup without React ```html ``` --- # Avatar > User avatar with image, initials fallback, and status indicator. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/avatar ## Install ```bash npx mlola-ui add avatar ``` ```tsx import { Avatar } from "@/components/ui/avatar"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Avatar | `size` | `xs`, `sm`, `md`, `lg`, `xl` | `md` | | Avatar | `status` | `online`, `offline`, `away`, `busy` | | ## Example ```tsx import { Avatar, AvatarGroup } from "@/components/ui/avatar"; export default function Example() { return ( ); } ``` ## The same markup without React ```html
LP KT RS 1 more person
``` --- # Badge > A small status or label badge with color variants, dot indicator, and removal. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/badge ## Install ```bash npx mlola-ui add badge ``` ```tsx import { Badge } from "@/components/ui/badge"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Badge | `size` | `sm`, `md`, `lg` | `md` | | Badge | `tone` | `neutral`, `primary`, `info`, `success`, `warning`, `danger` | `neutral` | | Badge | `variant` | `soft`, `solid`, `outline` | `soft` | ## Example ```tsx import { Badge } from "@/components/ui/badge"; export default function Example() { return (
Draft Live Review Failed
); } ``` ## The same markup without React ```html
Draft Live Review Failed
``` --- # Breadcrumb > Navigation breadcrumb trail with custom separators and responsive collapse. - Tier: free, MIT - Category: Navigation - Docs: https://ui.mlola.com/docs/components/breadcrumb ## Install ```bash npx mlola-ui add breadcrumb ``` ```tsx import { Breadcrumb } from "@/components/ui/breadcrumb"; ``` ## Example ```tsx import { Breadcrumb } from "@/components/ui/breadcrumb"; export default function Example() { return ( ); } ``` ## The same markup without React ```html ``` --- # Button > A versatile button component with multiple variants, sizes, and states. - Tier: free, MIT - Category: Actions - Docs: https://ui.mlola.com/docs/components/button ## Install ```bash npx mlola-ui add button ``` ```tsx import { Button } from "@/components/ui/button"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Button | `size` | `sm`, `md`, `lg`, `icon` | `md` | | Button | `variant` | `primary`, `secondary`, `subtle`, `danger`, `outline`, `link` | `primary` | | Button | `width` | `auto`, `full` | `auto` | ## Example ```tsx import { Button } from "@/components/ui/button"; export default function Example() { return (
); } ``` ## The same markup without React ```html
``` --- # Card > A compound card with header, content, and footer slots in four surface variants. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/card ## Install ```bash npx mlola-ui add card ``` ```tsx import { Card } from "@/components/ui/card"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Card | `variant` | `default`, `elevated`, `glass`, `specular` | `default` | ## Example ```tsx import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; export default function Example() { return ( Team Four members, two pending invitations. Everyone can edit projects; only owners can change billing. ); } ``` ## The same markup without React ```html

Team

Four members, two pending invitations.

Everyone can edit projects; only owners can change billing.
``` --- # Carousel > One slide at a time with previous/next controls and a roving dot group. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/carousel ## Install ```bash npx mlola-ui add carousel ``` ```tsx import { Carousel } from "@/components/ui/carousel"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Carousel | `indicators` | `dots`, `counter`, `none` | `dots` | ## Example ```tsx import { Carousel } from "@/components/ui/carousel"; const slides = ["Plan", "Build", "Ship"].map((title) => (
{title}
)); export default function Example() { return ; } ``` ## The same markup without React ```html ``` --- # Checkbox > An accessible checkbox with label, description, error, and indeterminate state. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/checkbox ## Install ```bash npx mlola-ui add checkbox ``` ```tsx import { Checkbox } from "@/components/ui/checkbox"; ``` ## Example ```tsx import { Checkbox } from "@/components/ui/checkbox"; export default function Example() { return ; } ``` ## The same markup without React ```html
At most once a month.
``` --- # Command Menu > The ⌘K palette: ranked commands with shortcuts, keyboard navigation and matched letters bolded. - Tier: free, MIT - Category: Navigation - Docs: https://ui.mlola.com/docs/components/command-menu ## Install ```bash npx mlola-ui add command-menu ``` ```tsx import { CommandMenu } from "@/components/ui/command-menu"; ``` ## Example ```tsx "use client"; import * as React from "react"; import { Button } from "@/components/ui/button"; import { CommandMenu } from "@/components/ui/command-menu"; export default function Example() { const [open, setOpen] = React.useState(false); return ( <> setOpen(false) }, { id: "invite", label: "Invite a teammate", onSelect: () => setOpen(false) }, ], }, ]} /> ); } ``` ## The same markup without React ```html ``` --- # Dropdown Menu > A keyboard-navigable dropdown menu with icons, shortcuts, and danger items. - Tier: free, MIT - Category: Actions - Docs: https://ui.mlola.com/docs/components/dropdown-menu ## Install ```bash npx mlola-ui add dropdown-menu ``` ```tsx import { DropdownMenu } from "@/components/ui/dropdown-menu"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | DropdownMenu | `align` | `start`, `end` | `start` | ## Example ```tsx import { DropdownMenu } from "@/components/ui/dropdown-menu"; export default function Example() { return ( ); } ``` ## The same markup without React ```html
``` Load `@mlola-ui/behavior` and call `observe()` to give this markup its keyboard and state handling. --- # Dropzone > Drop, choose or paste files; checked for type, size and count before they are handed over. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/dropzone ## Install ```bash npx mlola-ui add dropzone ``` ```tsx import { Dropzone } from "@/components/ui/dropzone"; ``` ## Example ```tsx "use client"; import * as React from "react"; import { Dropzone } from "@/components/ui/dropzone"; export default function Example() { const [files, setFiles] = React.useState([]); return ( ); } ``` ## The same markup without React ```html
Drop files here, or choose PNG, PDF · up to 10.0 MB

PNG or PDF, up to 10 MB

``` --- # Empty State > What a screen says when there is nothing to show yet, and the way forward. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/empty-state ## Install ```bash npx mlola-ui add empty-state ``` ```tsx import { EmptyState } from "@/components/ui/empty-state"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | EmptyState | `size` | `inline`, `page` | `inline` | ## Example ```tsx import { IconMail } from "@mlola-ui/icons"; import { Button } from "@/components/ui/button"; import { EmptyState } from "@/components/ui/empty-state"; export default function Example() { return ( } title="No messages yet" description="New conversations appear here." actions={} /> ); } ``` ## The same markup without React ```html

No messages yet

New conversations appear here.

``` --- # Input > Text input with variants, sizes, label, hint, and error states. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/input ## Install ```bash npx mlola-ui add input ``` ```tsx import { Field } from "@/components/ui/input"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Input | `size` | `sm`, `md`, `lg` | `md` | | Input | `variant` | `default`, `filled`, `subtle` | `default` | ## Example ```tsx import { Input } from "@/components/ui/input"; export default function Example() { return ; } ``` ## The same markup without React ```html

We never share it.

``` --- # Kbd > Keys and platform-aware shortcuts: mod+k reads ⌘K on a Mac and Ctrl K elsewhere, spoken as words. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/kbd ## Install ```bash npx mlola-ui add kbd ``` ```tsx import { Kbd } from "@/components/ui/kbd"; ``` ## Example ```tsx import { Kbd, Shortcut } from "@/components/ui/kbd"; export default function Example() { return (

Press to search, or Esc to close.

); } ``` ## The same markup without React ```html

Press Command K to search, or Esc to close.

``` --- # Modal > Accessible dialog overlay with focus trap, escape handling, and scroll lock. - Tier: free, MIT - Category: Overlays - Docs: https://ui.mlola.com/docs/components/modal ## Install ```bash npx mlola-ui add modal ``` ```tsx import { Modal } from "@/components/ui/modal"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Modal | `size` | `sm`, `md`, `lg`, `xl`, `full` | `md` | ## Example ```tsx "use client"; import * as React from "react"; import { Button } from "@/components/ui/button"; import { Modal, ModalBody, ModalFooter, ModalHeader } from "@/components/ui/modal"; export default function Example() { const [open, setOpen] = React.useState(false); const close = () => setOpen(false); return ( <> This removes the project and every deployment attached to it. ); } ``` ## The same markup without React ```html ``` Load `@mlola-ui/behavior` and call `observe()` to give this markup its keyboard and state handling. --- # OTP Input > A one-time code as separate boxes that type, delete, paste and autofill like one field. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/otp-input ## Install ```bash npx mlola-ui add otp-input ``` ```tsx import { OtpInput } from "@/components/ui/otp-input"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | OtpInput | `mode` | `numeric`, `alphanumeric` | `numeric` | ## Example ```tsx import { OtpInput } from "@/components/ui/otp-input"; export default function Example() { return ; } ``` ## The same markup without React ```html

Sent to your email.

``` --- # Pagination > Page navigation with prev/next, page numbers, and ellipsis for large ranges. - Tier: free, MIT - Category: Navigation - Docs: https://ui.mlola.com/docs/components/pagination ## Install ```bash npx mlola-ui add pagination ``` ```tsx import { Pagination } from "@/components/ui/pagination"; ``` ## Example ```tsx "use client"; import * as React from "react"; import { Pagination } from "@/components/ui/pagination"; export default function Example() { const [page, setPage] = React.useState(3); return ; } ``` ## The same markup without React ```html ``` --- # Popover > A non-modal layer anchored to its trigger that flips and shifts to stay on screen. - Tier: free, MIT - Category: Overlays - Docs: https://ui.mlola.com/docs/components/popover ## Install ```bash npx mlola-ui add popover ``` ```tsx import { Popover } from "@/components/ui/popover"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Popover | `align` | `start`, `center`, `end` | `start` | | Popover | `side` | `top`, `bottom`, `left`, `right` | `bottom` | ## Example ```tsx import { Button } from "@/components/ui/button"; import { Popover } from "@/components/ui/popover"; export default function Example() { return ( Share}>

Anyone with the link can view this page.

); } ``` ## The same markup without React ```html ``` --- # Progress > Horizontal and circular progress indicators with variants and indeterminate mode. - Tier: free, MIT - Category: Feedback - Docs: https://ui.mlola.com/docs/components/progress ## Install ```bash npx mlola-ui add progress ``` ```tsx import { Progress } from "@/components/ui/progress"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Progress | `size` | `sm`, `md`, `lg` | `md` | | Progress | `tone` | `primary`, `info`, `success`, `warning`, `danger` | `primary` | | CircularProgress | `size` | `sm`, `md`, `lg` | `md` | | CircularProgress | `tone` | `primary`, `info`, `success`, `warning`, `danger` | `primary` | ## Example ```tsx import { Progress } from "@/components/ui/progress"; export default function Example() { return ; } ``` ## The same markup without React ```html
Uploading
``` --- # Radio Group > A native radio group with vertical and horizontal orientations. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/radio-group ## Install ```bash npx mlola-ui add radio-group ``` ```tsx import { RadioGroup } from "@/components/ui/radio-group"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | RadioGroup | `orientation` | `horizontal`, `vertical` | `vertical` | ## Example ```tsx import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; export default function Example() { return ( ); } ``` ## The same markup without React ```html
Billing
``` --- # Rating > Star rating with exact fractional fill and optional review count. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/rating ## Install ```bash npx mlola-ui add rating ``` ```tsx import { Rating } from "@/components/ui/rating"; ``` ## Example ```tsx import { Rating } from "@/components/ui/rating"; export default function Example() { return ; } ``` ## The same markup without React ```html 4.5(128) ``` --- # Resizable > Two panes and a keyboard-accessible handle between them. - Tier: free, MIT - Category: Layout - Docs: https://ui.mlola.com/docs/components/resizable ## Install ```bash npx mlola-ui add resizable ``` ```tsx import { Resizable } from "@/components/ui/resizable"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Resizable | `anchor` | `first`, `second` | `first` | | Resizable | `direction` | `horizontal`, `vertical` | `horizontal` | | Resizable | `units` | `percent`, `pixels` | `percent` | ## Example ```tsx import { Resizable } from "@/components/ui/resizable"; export default function Example() { return (
Files} second={
Editor
} />
); } ``` ## The same markup without React ```html
Editor
``` --- # Segmented Control > Single-choice control that swaps between a small set of options. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/segmented-control ## Install ```bash npx mlola-ui add segmented-control ``` ```tsx import { SegmentedControl } from "@/components/ui/segmented-control"; ``` ## Example ```tsx import { SegmentedControl } from "@/components/ui/segmented-control"; export default function Example() { return ( ); } ``` ## The same markup without React ```html
``` --- # Select > Custom searchable dropdown with option groups, keyboard navigation, and clearing. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/select ## Install ```bash npx mlola-ui add select ``` ```tsx import { Select } from "@/components/ui/select"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Select | `size` | `sm`, `md`, `lg` | | ## Example ```tsx import { Select } from "@/components/ui/select"; export default function Example() { return (

0 / 280

What would make this better?

``` --- # Timeline > A vertical event timeline with status dots, timestamps, and custom icon nodes. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/timeline ## Install ```bash npx mlola-ui add timeline ``` ```tsx import { Timeline } from "@/components/ui/timeline"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | TimelineItem | `status` | `complete`, `current`, `upcoming` | `upcoming` | | TimelineItem | `tone` | `neutral`, `primary`, `info`, `success`, `warning`, `danger` | | | TimelineDot | `status` | `complete`, `current`, `upcoming` | `upcoming` | ## Example ```tsx import { Timeline, TimelineItem } from "@/components/ui/timeline"; export default function Example() { return ( ); } ``` ## The same markup without React ```html
  1. Order placed

  2. Shipped

    In transit to the local hub.

  3. Delivered

``` --- # Toast > Toast notification system with an imperative API, auto-dismiss, and stacking. - Tier: free, MIT - Category: Feedback - Docs: https://ui.mlola.com/docs/components/toast ## Install ```bash npx mlola-ui add toast ``` ```tsx import { Toaster } from "@/components/ui/toast"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Toaster | `position` | `top-right`, `top-center`, `bottom-right`, `bottom-center` | `top-right` | ## Example ```tsx "use client"; import { Button } from "@/components/ui/button"; import { Toaster, toast } from "@/components/ui/toast"; export default function Example() { return ( <> ); } ``` ## The same markup without React ```html

Draft saved to your workspace.

``` Load `@mlola-ui/behavior` and call `observe()` to give this markup its keyboard and state handling. --- # Toggle > iOS-style switch and button-style toggle with controlled and uncontrolled modes. - Tier: free, MIT - Category: Actions - Docs: https://ui.mlola.com/docs/components/toggle ## Install ```bash npx mlola-ui add toggle ``` ```tsx import { Switch } from "@/components/ui/toggle"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Switch | `size` | `sm`, `md`, `lg` | `md` | | Toggle | `size` | `sm`, `md`, `lg` | `md` | ## Example ```tsx import { Switch } from "@/components/ui/toggle"; export default function Example() { return ; } ``` ## The same markup without React ```html Email notifications ``` Load `@mlola-ui/behavior` and call `observe()` to give this markup its keyboard and state handling. --- # Tooltip > Hover and focus tooltip with four placements, delay, and arrow. - Tier: free, MIT - Category: Overlays - Docs: https://ui.mlola.com/docs/components/tooltip ## Install ```bash npx mlola-ui add tooltip ``` ```tsx import { Tooltip } from "@/components/ui/tooltip"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Tooltip | `placement` | `top`, `bottom`, `left`, `right` | `top` | ## Example ```tsx import { Button } from "@/components/ui/button"; import { Tooltip } from "@/components/ui/tooltip"; export default function Example() { return ( ); } ``` ## The same markup without React ```html ``` Load `@mlola-ui/behavior` and call `observe()` to give this markup its keyboard and state handling. --- # Activity Heatmap > Activity by day in GitHub's calendar grid, with quantile shading, a keyboard grid and hover detail. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/activity-heatmap ## Install ```bash npx mlola-ui add activity-heatmap ``` ```tsx import { ActivityHeatmap } from "@/components/ui/activity-heatmap"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | ActivityHeatmap | `tone` | `primary`, `info`, `success`, `warning` | `primary` | ## Example ```tsx import { ActivityHeatmap } from "@/components/ui/activity-heatmap"; // Counts by day; days not listed count as zero. const data = [ { date: "2026-09-21", count: 3 }, { date: "2026-09-22", count: 7 }, { date: "2026-09-24", count: 1 }, { date: "2026-09-25", count: 12 }, ]; export default function Example() { return ; } ``` ## The same markup without React ```html
Mon
Wed
Fri
``` --- # Calendar > A month grid for one date, a range or several, with min and max, blocked days, two-month view and full keyboard paging. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/calendar ## Install ```bash npx mlola-ui add calendar ``` ```tsx import { Calendar } from "@/components/ui/calendar"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Calendar | `mode` | `single`, `multiple`, `range` | | ## Example ```tsx import { Calendar } from "@/components/ui/calendar"; export default function Example() { return ; } ``` ## The same markup without React ```html

September 2026

Mo Tu We Th Fr Sa Su
``` --- # Date Picker > A date field that opens a calendar, for one date or a range with presets, shown in the reader's format and stored as ISO. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/date-picker ## Install ```bash npx mlola-ui add date-picker ``` ```tsx import { DatePicker } from "@/components/ui/date-picker"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | DatePicker | `mode` | `single`, `range` | | ## Example ```tsx import { DatePicker } from "@/components/ui/date-picker"; export default function Example() { return ; } ``` ## The same markup without React ```html
``` --- # Time Picker > A time field of typeable spinbuttons in 12- or 24-hour time, with a quick list; the value is always HH:MM. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/time-picker ## Install ```bash npx mlola-ui add time-picker ``` ```tsx import { TimePicker } from "@/components/ui/time-picker"; ``` ## Example ```tsx import { TimePicker } from "@/components/ui/time-picker"; export default function Example() { return ; } ``` ## The same markup without React ```html
09 30
``` --- # Status Icon > A work item status as one glyph: backlog, todo, in progress, in review, done and canceled, readable without color. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/status-icon ## Install ```bash npx mlola-ui add status-icon ``` ```tsx import { StatusIcon } from "@/components/ui/status-icon"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | StatusIcon | `status` | `backlog`, `todo`, `in-progress`, `in-review`, `done`, `canceled` | | ## Example ```tsx import { StatusIcon } from "@/components/ui/status-icon"; export default function Example() { return (
); } ``` ## The same markup without React ```html
``` --- # Priority Icon > A work item priority as signal bars, with a filled alert for urgent. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/priority-icon ## Install ```bash npx mlola-ui add priority-icon ``` ```tsx import { PriorityIcon } from "@/components/ui/priority-icon"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | PriorityIcon | `priority` | `none`, `urgent`, `high`, `medium`, `low` | | ## Example ```tsx import { PriorityIcon } from "@/components/ui/priority-icon"; export default function Example() { return (
); } ``` ## The same markup without React ```html
``` --- # Combobox > A text field that filters a long list as you type, with grouping, descriptions and creating what is missing. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/combobox ## Install ```bash npx mlola-ui add combobox ``` ```tsx import { ComboboxList } from "@/components/ui/combobox"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | ComboboxList | `side` | `top`, `bottom` | | ## Example ```tsx import { Combobox } from "@/components/ui/combobox"; export default function Example() { return ( ); } ``` ## The same markup without React ```html
``` --- # Tag Input > Many short values in one field: add with Enter or a comma, paste lists, remove with Backspace, with suggestions and validation. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/tag-input ## Install ```bash npx mlola-ui add tag-input ``` ```tsx import { TagInput } from "@/components/ui/tag-input"; ``` ## Example ```tsx import { TagInput } from "@/components/ui/tag-input"; export default function Example() { return ; } ``` ## The same markup without React ```html
  • design
  • billing

``` --- # Number Input > A number field formatted at rest in the reader's locale, with steppers you can hold, arrows, bounds and precision. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/number-input ## Install ```bash npx mlola-ui add number-input ``` ```tsx import { NumberInput } from "@/components/ui/number-input"; ``` ## Example ```tsx import { NumberInput } from "@/components/ui/number-input"; export default function Example() { return ; } ``` ## The same markup without React ```html

Up to 50 on this plan.

``` --- # Color Picker > A color field with a saturation area, hue and opacity, hex, rgb or oklch, an eyedropper, presets and a contrast check. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/color-picker ## Install ```bash npx mlola-ui add color-picker ``` ```tsx import { ColorPicker } from "@/components/ui/color-picker"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | ColorPicker | `format` | `hex`, `rgb`, `oklch` | `hex` | ## Example ```tsx import { ColorPicker } from "@/components/ui/color-picker"; export default function Example() { return ; } ``` ## The same markup without React ```html
``` --- # Stepper > Progress through a flow of steps, horizontal or vertical, clickable, condensing to "Step 2 of 4" when narrow. - Tier: free, MIT - Category: Navigation - Docs: https://ui.mlola.com/docs/components/stepper ## Install ```bash npx mlola-ui add stepper ``` ```tsx import { Stepper } from "@/components/ui/stepper"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Stepper | `orientation` | `horizontal`, `vertical` | `horizontal` | ## Example ```tsx import { Stepper } from "@/components/ui/stepper"; export default function Example() { return ( ); } ``` ## The same markup without React ```html ``` --- # Virtual List > A long list that renders only what is on screen, measures rows of any height and loads more near the end. - Tier: free, MIT - Category: Data display - Docs: https://ui.mlola.com/docs/components/virtual-list ## Install ```bash npx mlola-ui add virtual-list ``` ```tsx import { VirtualList } from "@/components/ui/virtual-list"; ``` ## Example ```tsx import { VirtualList } from "@/components/ui/virtual-list"; export default function Example() { return (
Event {index + 1}
} /> ); } ``` ## The same markup without React ```html
Event 1
Event 2
Event 3
Event 4
Event 5
Event 6
Event 7
Event 8
Event 9
Event 10
Event 11
Event 12
Event 13
Event 14
Event 15
Event 16
Event 17
Event 18
Event 19
Event 20
Event 21
Event 22
Event 23
``` --- # Context Menu > A right-click menu built for what was clicked, with shortcuts, typeahead, long-press on touch and Shift+F10. - Tier: free, MIT - Category: Actions - Docs: https://ui.mlola.com/docs/components/context-menu ## Install ```bash npx mlola-ui add context-menu ``` ```tsx import { ContextMenu } from "@/components/ui/context-menu"; ``` ## Example ```tsx import { ContextMenu } from "@/components/ui/context-menu"; export default function Example() { return (
Right-click, or press Shift+F10, on this file.
); } ``` ## The same markup without React ```html
Right-click, or press Shift+F10, on this file.
``` --- # Hover Card > A preview card that opens when the pointer rests on a link or name, and on keyboard focus. - Tier: free, MIT - Category: Overlays - Docs: https://ui.mlola.com/docs/components/hover-card ## Install ```bash npx mlola-ui add hover-card ``` ```tsx import { HoverCard } from "@/components/ui/hover-card"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | HoverCard | `align` | `start`, `center`, `end` | `start` | | HoverCard | `side` | `top`, `bottom`, `left`, `right` | `bottom` | ## Example ```tsx import { HoverCard } from "@/components/ui/hover-card"; export default function Example() { return ( Lena Park, design lead. Owns the pricing page.

}> @lena
); } ``` ## The same markup without React ```html @lena ``` --- # Tour > A guided product tour that spotlights parts of the page step by step, with keyboard control and a focus trap. - Tier: free, MIT - Category: Overlays - Docs: https://ui.mlola.com/docs/components/tour ## Install ```bash npx mlola-ui add tour ``` ```tsx import { Tour } from "@/components/ui/tour"; ``` ## Example ```tsx "use client"; import * as React from "react"; import { Button } from "@/components/ui/button"; import { Tour } from "@/components/ui/tour"; export default function Example() { const [open, setOpen] = React.useState(false); return ( <>
); } ``` ## The same markup without React ```html
``` --- # App Shell > A resizable, foldable sidebar with sections and items that becomes a drawer on small screens. - Tier: free, MIT - Category: Layout - Docs: https://ui.mlola.com/docs/components/app-shell ## Install ```bash npx mlola-ui add app-shell ``` ```tsx import { AppShell } from "@/components/ui/app-shell"; ``` ## Example ```tsx import { IconHome, IconMail, IconSettings } from "@mlola-ui/icons"; import { AppShell, Sidebar, SidebarItem, SidebarSection } from "@/components/ui/app-shell"; export default function Example() { return (
Atlas}> } href="/" current /> } href="/inbox" count={3} /> } href="/settings" /> } >
Home
); } ``` ## The same markup without React ```html
Home
``` --- # Spinner > Work in progress whose end is unknown, drawn in the color of the text around it and named for screen readers when it stands alone. - Tier: free, MIT - Category: Feedback - Docs: https://ui.mlola.com/docs/components/spinner ## Install ```bash npx mlola-ui add spinner ``` ```tsx import { Spinner } from "@/components/ui/spinner"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | Spinner | `size` | `sm`, `md`, `lg` | `md` | ## Example ```tsx import { Spinner } from "@/components/ui/spinner"; export default function Example() { return (

Searching 12,480 records

); } ``` ## The same markup without React ```html

Loading resultsSearching 12,480 records

``` --- # Copy Button > Copies a value to the clipboard and confirms it, with the outcome spoken to screen readers and a refusal explained. - Tier: free, MIT - Category: Actions - Docs: https://ui.mlola.com/docs/components/copy-button ## Install ```bash npx mlola-ui add copy-button ``` ```tsx import { CopyButton } from "@/components/ui/copy-button"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | CopyButton | `size` | `sm`, `md`, `lg`, `icon` | | | CopyButton | `variant` | `primary`, `secondary`, `subtle`, `danger`, `outline`, `link` | `secondary` | | CopyButton | `width` | `auto`, `full` | | ## Example ```tsx import { CopyButton } from "@/components/ui/copy-button"; export default function Example() { return (
ml_live_4f9a2c Copy invite link
); } ``` ## The same markup without React ```html
ml_live_4f9a2c
``` --- # Password Input > A password field with a show and hide toggle and, when choosing a new password, a meter that says how strong it is and what would make it stronger. - Tier: free, MIT - Category: Forms - Docs: https://ui.mlola.com/docs/components/password-input ## Install ```bash npx mlola-ui add password-input ``` ```tsx import { PasswordInput } from "@/components/ui/password-input"; ``` ## Props with fixed values | Component | Prop | Values | Default | | --- | --- | --- | --- | | PasswordInput | `size` | `sm`, `md`, `lg` | | | PasswordInput | `variant` | `default`, `filled`, `subtle` | | ## Example ```tsx import { PasswordInput } from "@/components/ui/password-input"; export default function Example() { return ; } ``` ## The same markup without React ```html

Use 8 or more characters.

``` --- # Mlola Pro These need a Mlola Pro license. Create a token at https://ui.mlola.com/account, run `npx mlola-ui login `, then `npx mlola-ui add `. ## Bot (`bot`) An expressive companion whose body morphs between shapes on springs and whose face carries the assistant's state. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | Bot | `face` | `pill`, `round`, `pixel`, `visor` | `pill` | | Bot | `shape` | `round`, `squircle`, `blob` | `round` | | Bot | `size` | `sm`, `md`, `lg`, `xl` | `md` | | Bot | `state` | `idle`, `listening`, `thinking`, `working`, `speaking`, `happy`, `confused`, `error`, `sleeping` | `idle` | | Bot | `texture` | `none`, `grain`, `dots` | `none` | | Bot | `tone` | `neutral`, `primary`, `info`, `success`, `warning`, `danger` | `neutral` | | Bot | `variant` | `solid`, `gradient`, `glass`, `outline` | `solid` | ## Citation (`citation`) Numbered inline sources with hover previews and a matching source list. ## Code Block (`code-block`) Highlighted code with a filename, line numbers, marked lines and copy; its palette is Mlola's contrast-solved text roles. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | CodeBlock | `language` | `tsx`, `css`, `html`, `json`, `bash`, `python`, `plain` | | ## Confidence Text (`confidence-text`) An answer that marks where the model is unsure, with the confidence spoken to screen readers. ## Context Cards (`context-cards`) The passages a model retrieved before answering, with source, location, relevance and the query's words marked. ## Context Meter (`context-meter`) How full the context window is and on what, warning before answers get cut short. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | ContextMeter | `variant` | `ring`, `bar` | `bar` | ## Conversation (`conversation`) A message log that follows new content and offers a way back when the reader scrolls up. ## Diff View (`diff-view`) Unified or split file diffs from before/after text or a patch, with in-line change marks and folded unchanged lines. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | DiffView | `language` | `tsx`, `css`, `html`, `json`, `bash`, `python`, `plain` | | | DiffView | `view` | `unified`, `split` | `unified` | ## File Changes (`file-changes`) An agent's changed files as one summary line that opens into each file's status and size of change. ## Message (`message`) One conversation turn with actions, feedback, answer versions and a facts line. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | Message | `from` | `user`, `assistant`, `system` | | | Message | `status` | `complete`, `streaming`, `error` | `complete` | | MessageActions | `reveal` | `always`, `hover` | `always` | | MessageFeedback | `value` | `up`, `down` | | ## Model Picker (`model-picker`) Choose a model by speed, reasoning depth and context window, built on Select. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | ModelPicker | `size` | `sm`, `md`, `lg` | `sm` | ## Orb (`orb`) The assistant's presence: idle, listening, thinking and speaking, colored by the theme and driven by live audio. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | Orb | `size` | `sm`, `md`, `lg`, `xl` | `md` | | Orb | `state` | `idle`, `listening`, `thinking`, `speaking` | `idle` | ## Prompt Input (`prompt-input`) A growing composer that sends on Enter, never mid-IME, with attachments, tools and a stop button. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | PromptInput | `status` | `idle`, `submitting`, `streaming` | `idle` | | PromptInput | `submitOn` | `enter`, `mod-enter` | `enter` | ## Selection Actions (`selection-actions`) Select text and AI actions appear above it: rewrite, explain, shorten. ## Streaming Text (`streaming-text`) Text that arrives in pieces, revealed at a steady reading rate that catches up on bursts, with fresh runs fading in. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | StreamingText | `as` | `div`, `p`, `span` | `div` | ## Suggestions (`suggestions`) Prompt starters and follow-ups as a wrapping or swipeable row. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | Suggestions | `layout` | `wrap`, `scroll` | `wrap` | ## Task List (`task-list`) An agent's plan as it runs: status per step, nested subtasks, progress announced as it changes. ## Thinking (`thinking`) A model's reasoning with a live timer that folds into “Thought for 8s”, plus shimmer, dots and orbit indicators. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | ThinkingIndicator | `variant` | `shimmer`, `dots`, `orbit` | `shimmer` | | Thinking | `status` | `thinking`, `done` | `thinking` | ## Tool Call (`tool-call`) A model's tool use as an expandable card, with input, output, timing and human approval. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | ToolCall | `status` | `pending`, `running`, `success`, `error`, `approval`, `denied` | `pending` | | ToolCall | `variant` | `card`, `compact` | `card` | ## Voice Wave (`voice-wave`) Mirrored audio bars for microphone input or the assistant's voice, fed by a live meter. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | VoiceWave | `state` | `idle`, `listening`, `speaking`, `muted` | `idle` | ## File Tree (`file-tree`) A project's files as a keyboard-first tree with folder guides, file-type badges and git status. ## Terminal (`terminal`) Command output with ANSI colors mapped to theme roles, exit status, follow-on-output scrolling and an optional input with history. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | Terminal | `status` | `idle`, `running`, `success`, `error` | `idle` | ## Source Control (`source-control`) Branch sync state, staged and unstaged changes, and a commit box whose message a model can stream in. ## Commit History (`commit-history`) A git log with a branch graph, refs, CI checks, authors and relative times. ## Editor Tabs (`editor-tabs`) Open files across an editor: unsaved dots, git status, preview tabs and names that disambiguate twins. ## Canvas (`canvas`) An infinite surface to pan and zoom, with a dotted grid, zoom controls, floating panels and collaborators' cursors. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | Canvas | `grid` | `dots`, `lines`, `none` | `dots` | | CanvasPanel | `position` | `top-left`, `top`, `top-right`, `left`, `right`, `bottom-left`, `bottom`, `bottom-right` | `top-left` | | CanvasCursor | `tone` | `primary`, `info`, `success`, `warning`, `danger` | `primary` | ## Canvas Toolbar (`canvas-toolbar`) A floating tool palette with single-key shortcuts, roving focus and room for undo and redo. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | CanvasToolbar | `orientation` | `horizontal`, `vertical` | `horizontal` | ## Minimap (`minimap`) The whole canvas in miniature, with the view outlined; press or drag to move there. ## Node Graph (`node-graph`) A node editor for agent workflows: drag nodes, connect ports, refuse loops and watch a run flow through the edges. ## Whiteboard (`whiteboard`) Shapes, arrows, freehand, text and sticky notes on an infinite canvas, with selection, resize, color, undo and presence. ## Rich Text Editor (`rich-text-editor`) A modern rich text editor: headings, marks, lists, quotes, code and links, with Markdown shortcuts as you type and paste cleaned to what it owns. ## Block Editor (`block-editor`) A block editor: slash commands, Markdown shortcuts, to-dos, callouts, drag to reorder, a selection bubble and AI that streams into the page. ## Suggested Edit (`suggested-edit`) An AI rewrite shown as word-level tracked changes, each accepted or rejected on its own or all at once. ## Property Picker (`property-picker`) A small trigger that opens a searchable menu to set a property: status, priority, assignee or labels, one or many. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | PropertyPicker | `align` | `start`, `center`, `end` | | | PropertyPicker | `side` | `top`, `bottom`, `left`, `right` | | | PropertyPicker | `variant` | `pill`, `subtle`, `icon` | | ## Filter Bar (`filter-bar`) Filters as editable sentences, "Status is In progress", with an applyFilters helper. ## Kanban (`kanban`) Columns of cards that move by drag or keyboard, with room-making drops, edge scrolling, folding columns and limits. ## Chart (`chart`) The shared chart frame: scales, nice ticks, monotone curves, stacking, legend, tooltip and an accessible data table. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | ChartLegend | `layout` | `row`, `column` | `row` | ## Line Chart (`line-chart`) Lines and areas over a sequence, stacked or overlaid, with a crosshair, keyboard reading and dashed targets. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | LineChart | `curve` | `linear`, `smooth`, `step` | `smooth` | ## Bar Chart (`bar-chart`) Bars per category, grouped or stacked, standing up or lying across, with rounded ends and keyboard reading. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | BarChart | `layout` | `vertical`, `horizontal` | `vertical` | ## Donut Chart (`donut-chart`) Parts of a whole as a ring whose center reads the slice you point at. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | DonutChart | `legend` | `side`, `below`, `none` | `side` | ## Sparkline (`sparkline`) A tiny axis-free trend line for stat cards, tables and lists. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | Sparkline | `tone` | `neutral`, `primary`, `info`, `success`, `warning`, `danger`, `trend` | `neutral` | ## Gantt (`gantt`) A roadmap timeline: grouped bars you drag and resize, milestones, dependency arrows, today and three zoom levels. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | Gantt | `defaultScale` | `week`, `month`, `quarter` | `month` | | Gantt | `scale` | `week`, `month`, `quarter` | | ## Data Grid (`data-grid`) A spreadsheet-grade table: virtualized rows, pinned and resizable columns, sorting, cell ranges, inline editing, copy and paste, totals. ## Scheduler (`scheduler`) A day, three-day and week calendar where events are drawn, moved and resized by pointer or keyboard, with overlaps laid out side by side. Props with fixed values: | Component | Prop | Values | Default | | --- | --- | --- | --- | | Scheduler | `defaultView` | `day`, `three`, `week` | `week` | | Scheduler | `view` | `day`, `three`, `week` | | ## Funnel Chart (`funnel-chart`) Stages of a funnel with step conversion and drop-off between each. ## Radar Chart (`radar-chart`) Several series compared across the same qualities on a spider web, with highlighting and a tooltip. ## Scatter Chart (`scatter-chart`) Points or bubbles on two measures, with series, keyboard stepping and a tooltip. ## Treemap (`treemap`) Nested rectangles sized by value, laid out as squares as far as possible. ## Trace Viewer (`trace-viewer`) One agent run span by span: a tree on a timeline with the slow and failing steps marked, totals for time, tokens and cost, and each span's input and output. ## Eval Grid (`eval-grid`) Test cases against model and prompt variants: pass rates, scores, latency and cost, disagreements, and each answer diffed against the expected one. ## Model Compare (`model-compare`) The same prompt streamed to several models side by side, blind by default, with time to first token, speed and a vote. ## Prompt Playground (`prompt-playground`) A system prompt and a template whose variables become fields, with model settings, saved versions and a run history. ## Generative UI (`generative-ui`) Renders a JSON interface a model streams — metrics, charts, tables, alerts, buttons — from the library's own components as it arrives. ## Transcript (`transcript`) A call or meeting transcript that follows playback word by word, with speakers, search and a summary. - **AI Chat** (`ai-chat`, block): A complete chat surface that streams reasoning, tool use, answers and sources from any model through one responder function. - **Auth Split** (`auth-split`, block): Brand panel plus login/signup tabbed form. - **CTA + Footer** (`cta-footer`, block): Gradient call-to-action band with email capture plus link footer. - **Data Table** (`data-table`, block): Orders-style table with search, status pills, and empty state. - **FAQ Accordion** (`faq-accordion`, block): Collapsible question list with smooth animation. - **Feature Grid** (`feature-grid`, block): Icon feature grid with 2/3/4 column options. - **Hero Split** (`hero-split`, block): Split hero with badge, headline, dual CTAs, stats, and a replaceable visual. - **Navbar** (`navbar`, block): Sticky marketing nav with mobile menu. - **Newsletter** (`newsletter`, block): Email capture band with success state. - **Pricing Tiers** (`pricing-tiers`, block): Tier cards with highlighted plan and billing toggle. - **Product Grid** (`product-grid`, block): Filterable product cards with ratings and cart actions. - **Stats Band** (`stats-band`, block): Metric row with deltas for dashboards and heroes. - **Testimonials** (`testimonials`, block): Customer quote cards with ratings and avatars. - **Thread Sidebar** (`thread-sidebar`, block): Searchable, grouped conversations or agent runs, with live status for work running in the background. - **Voice Session** (`voice-session`, block): Full-screen voice mode: the assistant's presence, a live wave, captions and call controls, metering the real microphone when allowed. - **Logo Cloud** (`logo-cloud`, block): Customer wordmarks under a line of proof, as framed tiles or one quiet row. - **Comparison Table** (`comparison-table`, block): Every plan side by side, feature by feature, in groups, with the recommended plan marked. - **Feature Rows** (`feature-rows`, block): Features told one at a time, text beside a visual, alternating down the page. - **Process Steps** (`process-steps`, block): A short numbered path from signing up to value, across a row or down a rail beside the heading. - **Contact Form** (`contact-form`, block): Ways to reach the team beside a validated message form with topics, a success state and focus that follows it. - **Changelog** (`changelog`, block): Releases newest first, each change tagged new, improved or fixed, with a filter by kind. - **Onboarding Checklist** (`onboarding-checklist`, block): A getting-started list with progress, the next step called out, and a finished state. - **Activity Feed** (`activity-feed`, block): What happened in a workspace, newest first, grouped by day and filterable by kind. - **Settings Panel** (`settings-panel`, block): Settings sections and rows with a save bar that validates, discards and reports unsaved changes. - **Error State** (`error-state`, block): Not-found, server error, maintenance and offline screens with search, next steps and a reference. - **Auth** (`auth`, page): Authentication page with login/signup tabs, validation, and brand panel. - **Blog** (`blog`, page): Blog index with featured post, filterable grid, and newsletter. - **Chat App** (`chat-app`, page): A full chat product on one route: conversations, streaming chat with reasoning, tools and sources, and voice mode. - **Dashboard** (`dashboard`, page): Admin dashboard with sidebar, stat cards, chart, and activity table. - **Landing Page** (`landing`, page): Full SaaS landing page with hero, features, pricing, testimonials, and CTA. - **Pricing** (`pricing`, page): SaaS pricing page with billing toggle, tier cards, and comparison table. - **Features** (`features`, page): A product tour: centered hero, customer row, features told one at a time, getting started, essentials and reviews. - **Contact** (`contact`, page): Contact channels, a validated message form and the questions people ask before writing. - **Welcome** (`welcome`, page): A new member's home: workspace navigation, this week in numbers, the setup checklist and recent activity. - **Release Notes** (`release-notes`, page): A public changelog with filterable releases and a monthly email signup. - **Code Agent** (`code-agent`, template): A coding agent's workspace: threads, a folded work log with plan and tool calls, results with changed files, and a diff pane for every turn. - **Storefront** (`ecommerce`, template): Ecommerce storefront with filters, product grid, and cart drawer state. - **Canvas Studio** (`canvas-studio`, template): A canvas studio: whiteboards with collaborators and AI that adds ideas to the view, and an agent workflow builder with a step palette, inspector and live test runs. - **Notebook** (`notebook`, template): A notebook: a page tree with favorites and search, pages with covers, icons and properties, a block editor, and an assistant that summarizes, rewrites with tracked changes and gathers open to-dos. - **Tracker** (`tracker`, template): An issue tracker: an inbox the assistant triages, teams with a keyboard-first list and a board with swimlanes, saved views, cycles with burndown, a roadmap, issue pages with history, and an AI agent that takes work. - **Analytics** (`analytics`, template): A product analytics dashboard: traffic with its expected range, a conversion funnel, sources and top pages, revenue by plan, movement, country and account, product use, feature adoption and cohort retention. - **Settings & Billing** (`settings`, template): Account and workspace settings: a validated profile with a save bar, notification channels and quiet hours, members with invitations and roles, API keys shown once, and billing with usage, plans, prorated changes through Paddle and invoices. - **AI Console** (`ai-console`, template): An AI operations console: usage, latency and spend by model, every agent run as a trace with its spans and failures, eval runs across prompt versions with regressions called out, a prompt playground and blind model comparison. - **CRM** (`crm`, template): A CRM: companies and people as editable grids, a deal pipeline with weighted totals, and record pages with an activity timeline, an account brief the assistant writes and next steps it drafts for review. - **Mail** (`mail`, template): A keyboard-first mail client: a split inbox with the assistant's triage, summaries, first drafts and edits to your own reply you accept change by change, done, snooze and star with a key, and a command menu. - **Scheduling** (`scheduling`, template): Scheduling: a public booking page with open times from weekly hours, buffers and existing bookings in the visitor's time zone, a confirmation with a calendar file, and the host's bookings, team calendar, event types, hours and days off. - **Support Desk** (`support`, template): A support desk: an inbox sorted by live response targets, replies and internal notes with macros, a suggested answer the assistant writes from the help center with citations and confidence, the customer beside it, and the questions that still need an article. - **Marketing Site** (`marketing-site`, template): A complete product site: home, features, pricing with a full comparison, changelog, contact, sign-in and a not-found page, with one navigation that marks where the reader is. - **Docs Site** (`docs-site`, template): A documentation site: grouped articles in a sidebar, search over every page and section, a table of contents that follows the reader, code with copy, notes, previous and next, and feedback on every page.