Skip to content
Mlola UI
  • Introduction
  • Theming
  • Quality
  • Versions
  • Coding agents
  • AI integration
  • All components
  • Migrate from shadcn/ui
  • Workbench
  • Icons
  • AccordionA collapsible content panel supporting single and multiple open modes
  • Activity HeatmapActivity by day in GitHub's calendar grid, with quantile shading, a keyboard grid and hover detail
  • AlertA status banner with variants, dismiss action, and optional action slot
  • App ShellA resizable, foldable sidebar with sections and items that becomes a drawer on small screens
  • AvatarUser avatar with image, initials fallback, and status indicator
  • BadgeA small status or label badge with color variants, dot indicator, and removal
  • Bar ChartBars per category, grouped or stacked, standing up or lying across, with rounded ends and keyboard reading
  • Block EditorA block editor: slash commands, Markdown shortcuts, to-dos, callouts, drag to reorder, a selection bubble and AI that streams into the page
  • BotAn expressive companion whose body morphs between shapes on springs and whose face carries the assistant's state
  • BreadcrumbNavigation breadcrumb trail with custom separators and responsive collapse
  • ButtonA versatile button component with multiple variants, sizes, and states
  • CalendarA month grid for one date, a range or several, with min and max, blocked days, two-month view and full keyboard paging
  • CanvasAn infinite surface to pan and zoom, with a dotted grid, zoom controls, floating panels and collaborators' cursors
  • Canvas ToolbarA floating tool palette with single-key shortcuts, roving focus and room for undo and redo
  • CardA compound card with header, content, and footer slots in four surface variants
  • CarouselOne slide at a time with previous/next controls and a roving dot group
  • ChartThe shared chart frame: scales, nice ticks, monotone curves, stacking, legend, tooltip and an accessible data table
  • CheckboxAn accessible checkbox with label, description, error, and indeterminate state
  • CitationNumbered inline sources with hover previews and a matching source list
  • Code BlockHighlighted code with a filename, line numbers, marked lines and copy; its palette is Mlola's contrast-solved text roles
  • Color PickerA color field with a saturation area, hue and opacity, hex, rgb or oklch, an eyedropper, presets and a contrast check
  • ComboboxA text field that filters a long list as you type, with grouping, descriptions and creating what is missing
  • Command MenuThe ⌘K palette: ranked commands with shortcuts, keyboard navigation and matched letters bolded
  • Commit HistoryA git log with a branch graph, refs, CI checks, authors and relative times
  • Confidence TextAn answer that marks where the model is unsure, with the confidence spoken to screen readers
  • Context CardsThe passages a model retrieved before answering, with source, location, relevance and the query's words marked
  • Context MenuA right-click menu built for what was clicked, with shortcuts, typeahead, long-press on touch and Shift+F10
  • Context MeterHow full the context window is and on what, warning before answers get cut short
  • ConversationA message log that follows new content and offers a way back when the reader scrolls up
  • Copy ButtonCopies a value to the clipboard and confirms it, with the outcome spoken to screen readers and a refusal explained
  • Data GridA spreadsheet-grade table: virtualized rows, pinned and resizable columns, sorting, cell ranges, inline editing, copy and paste, totals
  • Date PickerA date field that opens a calendar, for one date or a range with presets, shown in the reader's format and stored as ISO
  • Diff ViewUnified or split file diffs from before/after text or a patch, with in-line change marks and folded unchanged lines
  • Donut ChartParts of a whole as a ring whose center reads the slice you point at
  • Dropdown MenuA keyboard-navigable dropdown menu with icons, shortcuts, and danger items
  • DropzoneDrop, choose or paste files; checked for type, size and count before they are handed over
  • Editor TabsOpen files across an editor: unsaved dots, git status, preview tabs and names that disambiguate twins
  • Empty StateWhat a screen says when there is nothing to show yet, and the way forward
  • Eval GridTest cases against model and prompt variants: pass rates, scores, latency and cost, disagreements, and each answer diffed against the expected one
  • File ChangesAn agent's changed files as one summary line that opens into each file's status and size of change
  • File TreeA project's files as a keyboard-first tree with folder guides, file-type badges and git status
  • Filter BarFilters as editable sentences, "Status is In progress", with an applyFilters helper
  • Funnel ChartStages of a funnel with step conversion and drop-off between each
  • GanttA roadmap timeline: grouped bars you drag and resize, milestones, dependency arrows, today and three zoom levels
  • Generative UIRenders a JSON interface a model streams — metrics, charts, tables, alerts, buttons — from the library's own components as it arrives
  • Hover CardA preview card that opens when the pointer rests on a link or name, and on keyboard focus
  • InputText input with variants, sizes, label, hint, and error states
  • KanbanColumns of cards that move by drag or keyboard, with room-making drops, edge scrolling, folding columns and limits
  • KbdKeys and platform-aware shortcuts: mod+k reads ⌘K on a Mac and Ctrl K elsewhere, spoken as words
  • Line ChartLines and areas over a sequence, stacked or overlaid, with a crosshair, keyboard reading and dashed targets
  • MessageOne conversation turn with actions, feedback, answer versions and a facts line
  • MinimapThe whole canvas in miniature, with the view outlined; press or drag to move there
  • ModalAccessible dialog overlay with focus trap, escape handling, and scroll lock
  • Model CompareThe same prompt streamed to several models side by side, blind by default, with time to first token, speed and a vote
  • Model PickerChoose a model by speed, reasoning depth and context window, built on Select
  • Node GraphA node editor for agent workflows: drag nodes, connect ports, refuse loops and watch a run flow through the edges
  • Number InputA number field formatted at rest in the reader's locale, with steppers you can hold, arrows, bounds and precision
  • OrbThe assistant's presence: idle, listening, thinking and speaking, colored by the theme and driven by live audio
  • OTP InputA one-time code as separate boxes that type, delete, paste and autofill like one field
  • PaginationPage navigation with prev/next, page numbers, and ellipsis for large ranges
  • Password InputA 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
  • PopoverA non-modal layer anchored to its trigger that flips and shifts to stay on screen
  • Priority IconA work item priority as signal bars, with a filled alert for urgent
  • ProgressHorizontal and circular progress indicators with variants and indeterminate mode
  • Prompt InputA growing composer that sends on Enter, never mid-IME, with attachments, tools and a stop button
  • Prompt PlaygroundA system prompt and a template whose variables become fields, with model settings, saved versions and a run history
  • Property PickerA small trigger that opens a searchable menu to set a property: status, priority, assignee or labels, one or many
  • Radar ChartSeveral series compared across the same qualities on a spider web, with highlighting and a tooltip
  • Radio GroupA native radio group with vertical and horizontal orientations
  • RatingStar rating with exact fractional fill and optional review count
  • ResizableTwo panes and a keyboard-accessible handle between them
  • Rich Text EditorA modern rich text editor: headings, marks, lists, quotes, code and links, with Markdown shortcuts as you type and paste cleaned to what it owns
  • Scatter ChartPoints or bubbles on two measures, with series, keyboard stepping and a tooltip
  • SchedulerA day, three-day and week calendar where events are drawn, moved and resized by pointer or keyboard, with overlaps laid out side by side
  • Segmented ControlSingle-choice control that swaps between a small set of options
  • SelectCustom searchable dropdown with option groups, keyboard navigation, and clearing
  • Selection ActionsSelect text and AI actions appear above it: rewrite, explain, shorten
  • SheetA slide-over panel from any screen edge with header, body, and footer sections
  • SkeletonShimmering loading placeholders for text, avatars, and cards
  • SliderAn accessible single-value slider with keyboard support and pointer dragging
  • Source ControlBranch sync state, staged and unstaged changes, and a commit box whose message a model can stream in
  • SparklineA tiny axis-free trend line for stat cards, tables and lists
  • SpinnerWork in progress whose end is unknown, drawn in the color of the text around it and named for screen readers when it stands alone
  • Status IconA work item status as one glyph: backlog, todo, in progress, in review, done and canceled, readable without color
  • StepperProgress through a flow of steps, horizontal or vertical, clickable, condensing to "Step 2 of 4" when narrow
  • Streaming TextText that arrives in pieces, revealed at a steady reading rate that catches up on bursts, with fresh runs fading in
  • Suggested EditAn AI rewrite shown as word-level tracked changes, each accepted or rejected on its own or all at once
  • SuggestionsPrompt starters and follow-ups as a wrapping or swipeable row
  • TableA compositional data table with sortable columns, striped rows, density sizes, and footer totals
  • TabsTabbed interface with underline, pills, and enclosed variants
  • Tag InputMany short values in one field: add with Enter or a comma, paste lists, remove with Backspace, with suggestions and validation
  • Task ListAn agent's plan as it runs: status per step, nested subtasks, progress announced as it changes
  • TerminalCommand output with ANSI colors mapped to theme roles, exit status, follow-on-output scrolling and an optional input with history
  • TextareaMulti-line text that grows as it is written, with a counter near its limit
  • ThinkingA model's reasoning with a live timer that folds into “Thought for 8s”, plus shimmer, dots and orbit indicators
  • Time PickerA time field of typeable spinbuttons in 12- or 24-hour time, with a quick list; the value is always HH:MM
  • TimelineA vertical event timeline with status dots, timestamps, and custom icon nodes
  • ToastToast notification system with an imperative API, auto-dismiss, and stacking
  • ToggleiOS-style switch and button-style toggle with controlled and uncontrolled modes
  • Tool CallA model's tool use as an expandable card, with input, output, timing and human approval
  • TooltipHover and focus tooltip with four placements, delay, and arrow
  • TourA guided product tour that spotlights parts of the page step by step, with keyboard control and a focus trap
  • Trace ViewerOne 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
  • TranscriptA call or meeting transcript that follows playback word by word, with speakers, search and a summary
  • TreemapNested rectangles sized by value, laid out as squares as far as possible
  • Virtual ListA long list that renders only what is on screen, measures rows of any height and loads more near the end
  • Voice WaveMirrored audio bars for microphone input or the assistant's voice, fed by a live meter
  • WhiteboardShapes, arrows, freehand, text and sticky notes on an infinite canvas, with selection, resize, color, undo and presence
GitHubv1.1.4Studio

Migrating from shadcn/ui

Mlola UI works like shadcn/ui in the way that matters: the CLI copies components into your project and the source is yours. What changes is underneath. There is no Tailwind, no Radix and no class merging: a class names the element, data-* attributes carry variant and state, and every color, size and duration is a --ml-* token derived from the theme. You can move one component at a time.

What changes

shadcn/uiMlola UI
npx shadcn@latest initnpx mlola-ui init
npx shadcn@latest add buttonnpx mlola-ui add button
components.jsonmlola.config.json
components/uicomponents/ui (the same default alias)
Tailwind CSSThe engine stylesheet, @mlola-ui/engine. No build plugin.
cn(), clsx, tailwind-merge, cvaNothing: variants and state are data-* attributes, not class strings.
Radix UI primitivesNothing: each component owns its behavior, from the same logic as the framework-free runtime.
lucide-react@mlola-ui/icons
next-themes and the .dark classdata-mode="light" or "dark" on the root, and data-theme for the character.

Run both while you move

Nothing collides: Mlola classes start with ml- and its tokens with --ml-, and its styles live in cascade layers named mlola. The engine places them above Tailwind's preflight whichever stylesheet loads first, so its components look right. To also keep Mlola below the utilities, so a utility you still use on a Mlola element wins until you remove it, declare the order once, before either import.

CSS
/* app.css: one line first, then both stylesheets */
@layer theme, base, mlola, components, utilities;
@import "tailwindcss";
@import "@mlola-ui/engine";

This order is tested with Tailwind CSS 4.

Theme variables

In shadcn/ui you write each variable by hand, in both modes. In Mlola you never write a palette token: a theme is a few decisions, and the engine derives every role with its contrast guaranteed in light and dark. When your own CSS needs a color, read the role:

shadcn/uiMlola UI
--background--ml-background
--foreground--ml-text
--card, --card-foreground--ml-surface, --ml-text
--popover, --popover-foreground--ml-surface-elevated, --ml-text
--primary, --primary-foreground--ml-primary, --ml-primary-foreground. Primary-colored text on the page reads --ml-primary-text.
--secondary, --secondary-foreground--ml-background-subtle, --ml-text (what variant="secondary" uses)
--muted, --muted-foreground--ml-background-subtle, --ml-text-muted
--accent, --accent-foreground--ml-fill-hover, --ml-text
--destructive--ml-danger, with --ml-danger-foreground and --ml-danger-text
--border--ml-border, or --ml-border-subtle for dividers
--input--ml-control-border
--ring--ml-focus, the color; --ml-ring is the whole focus halo
--radius--ml-radius-xs to --ml-radius-lg by the size of the thing, and --ml-radius-pill
--chart-1 to --chart-5--ml-chart-1 to --ml-chart-6
--sidebar and its setThe planes: the app shell's sidebar reads --ml-background-subtle, --ml-fill-hover and --ml-fill-active.
—--ml-success, --ml-warning and --ml-info, each with -foreground and -text

Dark mode is an attribute, and so is the theme:

HTML
<!-- shadcn/ui: a class, usually set by next-themes -->
<html class="dark">

<!-- Mlola UI: the character and the mode -->
<html data-theme="graphite" data-mode="dark">

Variants and state

In React, variants stay props. Color moves to one shared word, tone, which means the same thing on every component that has it:

TSX
// shadcn/ui
<Button variant="destructive" size="sm">Delete</Button>
<Button variant="ghost" size="icon" aria-label="Close"><X /></Button>
<Badge variant="secondary">Draft</Badge>
<Alert variant="destructive">…</Alert>
toast.error("Could not save");

// Mlola UI
<Button variant="danger" size="sm">Delete</Button>
<Button variant="subtle" size="icon" aria-label="Close"><IconX /></Button>
<Badge tone="neutral">Draft</Badge>
<Alert tone="danger">…</Alert>
toast.danger("Could not save");

In HTML, or any template language, the same thing is an attribute:

HTML
<button class="ml-button" data-variant="danger" data-size="sm">Delete</button>
<span class="ml-badge" data-tone="neutral">Draft</span>

A variant of your own is a value and a rule, not a class string:

CSS
/* shadcn/ui: a new key in buttonVariants, a string of utilities */

/* Mlola UI: the source is yours. Add "brand" to ButtonVariant,
   then one rule beside the others in button.css, reading tokens */
.ml-button[data-variant="brand"] {
  background: var(--ml-info);
  color: var(--ml-info-foreground);
}

Components

Every shadcn/ui component and where it goes. Items marked Pro are part of Mlola Pro.

shadcn/uiMlola UINotes
AccordionAccordionThe same parts: AccordionItem, AccordionTrigger, AccordionContent.
AlertAlertvariant="destructive" becomes tone="danger"; success, warning and info are there too.
Alert DialogModalrole="alertdialog": announced at once, and the backdrop does not dismiss it.
Aspect RatioNative CSS aspect-ratio
AvatarAvatarSizes xs to xl, a presence status, and AvatarGroup.
BadgeBadgeColor is tone (neutral, primary, info, success, warning, danger); variant is soft, solid or outline.
BreadcrumbBreadcrumb
ButtonButtondefault becomes primary, destructive becomes danger, ghost becomes subtle; size default becomes md. loading replaces a spinner.
Button GroupSegmented Controlml-clusterA segmented control for one choice; the cluster primitive to lay buttons out.
CalendarCalendarmode is single, multiple or range.
CardCardThe same parts: CardHeader, CardTitle, CardDescription, CardContent, CardFooter.
CarouselCarousel
ChartChart ProLine Chart ProBar Chart ProDonut Chart ProNative SVG, with no charting library.
CheckboxCheckbox
CollapsibleAccordionor a native <details>
ComboboxCombobox
CommandCommand Menu
Context MenuContext Menu
Data TableTableData Grid ProThe table has the same parts; the data grid adds sorting, selection and editing.
Date PickerDate PickerOne component, with mode single or range.
DialogModalModalHeader, ModalBody and ModalFooter.
DrawerSheetside="bottom".
Dropdown MenuDropdown MenuItems are data passed as items, not children.
EmptyEmpty State
Field, Form, LabelInputField wires the label, hint and error for you. Keep your form library: Input forwards its ref.
Hover CardHover Card
InputInput
Input OTPOTP Input
KbdKbdShortcut spells a combination for the visitor's platform.
MenubarDropdown MenuOne dropdown menu per menu.
Navigation MenuApp ShellFor application navigation; there is no site mega-menu yet.
PaginationPagination
PopoverPopover
ProgressProgressAlso CircularProgress.
Radio GroupRadio Group
ResizableResizable
Scroll AreaNative scrolling; scroll areas inside components already use thin, themed scrollbars
SelectSelectOptions are data; searchable, clearable and multiple are props.
Separatorml-divider
SheetSheet
SidebarApp ShellSidebar, SidebarSection and SidebarItem, with a drawer on phones.
SkeletonSkeleton
SliderSlider
SonnerToast<Toaster /> and toast(), with success, warning, info, loading and promise; toast.error becomes toast.danger.
SwitchToggleExported as Switch.
TableTableThe same parts: TableHeader, TableBody, TableRow, TableHead, TableCell, TableCaption.
TabsTabsThe same parts, plus variant (default, pills, enclosed) and orientation.
TextareaTextarea
ToggleButtonvariant="subtle" or "secondary" with aria-pressed.
Toggle GroupSegmented Control
TooltipTooltipThe text is the content prop; there is no TooltipContent.
Typographyml-headingml-ledeml-eyebrowml-fine-print

Mlola also has components shadcn/ui does not: Tag Input, Number Input, Time Picker, Color Picker, Stepper, Timeline, Rating, Dropzone, Tour, Virtual List.

An order that works

  1. Initialize. Run npx mlola-ui init. To let Tailwind utilities keep winning while you move, add the layer line above to the stylesheet that imports Tailwind.
  2. Bring the brand. Paste your --primary into the Studio as the brand color, then npx mlola-ui theme pull <id>. Or write mlola.theme.json yourself and render it offline with npx mlola-ui theme build, or start from a canonical theme.
  3. Swap the leaves. Button, Badge, Input, Card and the other parts with no children of their own. Most are a new import and a renamed prop.
  4. Swap the overlays. Dialog, Sheet, Popover, Dropdown Menu, Select and Tooltip. Their items and content become props.
  5. Remove what is left. When nothing imports Radix, cva, clsx, tailwind-merge or lucide-react any more, uninstall them. Tailwind can stay for your own markup.

A coding agent can do most of this. Give it the Mlola MCP server, then ask it to move one component at a time and to run check_markup on what it writes.

shadcn/ui, Tailwind CSS and Radix are the work of their authors. Mlola UI is not affiliated with them; the names are used only to describe a migration.