limn
    ↑↓ ChooseEnter OpenEsc Close
    GitHub
    0.1.43 is on crates.io

    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.

    Get started
    cargo add limn limn-egui
    96components, each with a live page
    5crates on crates.io
    2targets: Linux and WebAssembly
    1,200+tests run on every change

    The library

    96 components.
    Each one runs on its page.

    System
    TextSeparatorIconDrawingTextLayout
    Actions
    ButtonButtonGroupToolbarClipboardLinkKbdMessageActions
    Inputs
    TextFieldFormFieldTextAreaSearchFieldSelectSwitchCheckboxRadioGroupToggleNumberInputSwatchPickerNewColorPickerNewSliderDatePickerTimePickerDateTimePicker
    Navigation
    TabsSegmentedControlStepperBreadcrumbCollapsibleAccordionChatMinimapPagerPaginationMenuBarStatusBarWindowControlsNavigationBarTopBarNew
    Data
    ListRowTreeRowTableDescriptionListMarkdownDiagramCodeBlockOutputBlockCodeEditorCodeDiffChartsAttachment
    Layout
    CardFramedCardScrollAreaMediaTileCarouselNewMediaCardPageHeaderSectionHeaderPageColumn / CardGridPanelHeaderSidebarPanelResizeHandleSideRailNewPeekPanelNewPreferencesGroup
    States
    EmptyNoticeAlertProgressSpinnerSkeletonTextShimmerMarkerTickerCollapseChipBadgeAvatarAvatarGroupContextWindow
    Overlays
    PopoverDropdownListDropdownMenuContextMenuModal / AlertDialogBottomSheetToastImageViewerSuggestionListTooltipTour
    Native
    WaylandDataOwnerNew
    Browse the components

    How a frame is made

    State in.
    Interface out.

    1. 01

      State

      Yours. A plain value your application owns and changes.

    2. 02

      Element

      A description of the window, rebuilt from the state whenever it changes.

    3. 03

      UiTree

      Lays the description out and keeps what a description cannot: focus, scroll, hover, motion.

    4. 04

      Frame

      Drawing commands, hit regions and accessibility nodes, for any renderer to paint.

    view.rs
    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(); }
        }
    }
    Read the concepts

    Already built

    The parts nobody
    wants to write twice.

    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.

    Get started
    cargo add limn limn-egui