Interfaces,
drawn in Rust.
limn is a native UI library. You describe the window from your state; it brings the components, the layout, the motion and the accessibility.
cargo add limn limn-eguiThe library
96 components.
Each one runs on its page.
- Inputs
- TextFieldFormFieldTextAreaSearchFieldSelectSwitchCheckboxRadioGroupToggleNumberInputSwatchPickerNewColorPickerNewSliderDatePickerTimePickerDateTimePicker
- Navigation
- TabsSegmentedControlStepperBreadcrumbCollapsibleAccordionChatMinimapPagerPaginationMenuBarStatusBarWindowControlsNavigationBarTopBarNew
- Data
- ListRowTreeRowTableDescriptionListMarkdownDiagramCodeBlockOutputBlockCodeEditorCodeDiffChartsAttachment
- Layout
- CardFramedCardScrollAreaMediaTileCarouselNewMediaCardPageHeaderSectionHeaderPageColumn / CardGridPanelHeaderSidebarPanelResizeHandleSideRailNewPeekPanelNewPreferencesGroup
- States
- EmptyNoticeAlertProgressSpinnerSkeletonTextShimmerMarkerTickerCollapseChipBadgeAvatarAvatarGroupContextWindow
- Overlays
- PopoverDropdownListDropdownMenuContextMenuModal / AlertDialogBottomSheetToastImageViewerSuggestionListTooltipTour
- Native
- WaylandDataOwnerNew
How a frame is made
State in.
Interface out.
- 01
State
Yours. A plain value your application owns and changes.
- 02
Element
A description of the window, rebuilt from the state whenever it changes.
- 03
UiTree
Lays the description out and keeps what a description cannot: focus, scroll, hover, motion.
- 04
Frame
Drawing commands, hit regions and accessibility nodes, for any renderer to paint.
use limn::{Button, Component, ComponentPalette, Element, Text};
fn view(state: &State, palette: ComponentPalette) -> Element {
Element::column(vec![
Text::new(&state.title, palette).render(),
Button::new("save", "Save changes", palette).render(),
])
.gap(12.0)
}
fn update(state: &mut State, action: &UiAction) {
if let UiAction::Clicked { id } = action {
if id == "save" { state.save(); }
}
}Already built
The parts nobody
wants to write twice.
Accessibility
Every control tells the platform its role, its name and its state. Screen readers get them through AccessKit.
Motion
Springs and transitions that survive a rebuild, one switch to turn them off, and the browser’s preference read for you.
Hot reload
Edit a view while the application runs. The window changes; the state stays where it was.
Themes and tokens
One palette colors every component. Radii and durations are tokens you set once.
A code editor
Carets, selections, undo, syntax colors, a minimap and Vim keys, over a buffer you own.
Text, laid out in Rust
Shaping, fallback faces, wrapping, carets and selection, the same on every machine and in a browser.
Shaped by real work
The interface of
openADE
A native Rust development environment for working with coding agents. Every panel, menu and editor in it is limn: the library grows from what a real application needs.
Draw yours.
cargo add limn limn-egui