Expand description
§quadraui
Cross-platform UI primitives for keyboard-driven desktop and terminal apps.
Targets four rendering backends with a single declarative API:
- TUI (ratatui + crossterm) — full feature parity, works everywhere.
- Linux (GTK4 + Cairo + Pango) —
gtk4, full feature parity. - macOS (Core Graphics + Core Text) —
objc2/AppKit. Every in-window rasteriser shipped; see the crate rootREADME.md’s Status section for the two documented divergences from GTK. - Windows (Direct2D + DirectWrite) —
windows-rs. Window creation, event translation, and platform services are real and exercised by blocking CI onwindows-latest, and every per-primitive rasteriser is shipped; its conformance-matrix column gates like every other backend’s (seetests/conformance.rs).
§What’s in the box
49 primitives (one module each under src/primitives/), each
declarative + serde-friendly so apps and Lua plugins can describe UI
as data. A representative sample:
| Primitive | Use for |
|---|---|
TreeView | File explorers, source-control panels, hierarchical lists |
ListView | Quickfix, search results, flat selectable lists |
Form | Settings panels, config editors |
Palette | Command palettes, fuzzy pickers |
StatusBar | Mode/file/cursor strips, footer bars |
TabBar | Editor tabs, document tabs |
ActivityBar | Vertical icon strips (VSCode-style) |
Terminal | Cell grids for terminal emulators |
TextDisplay | Streaming logs, AI chat output |
See the crate root README.md’s Primitives section for the fuller
(still not exhaustive) list, or src/primitives/mod.rs for the
authoritative one.
§How it works
Apps build primitive descriptions from their own state. Backends consume
the descriptions and rasterise them. Events flow back as *Event enums
that reference primitives by WidgetId (owned strings — plugin-safe,
no &'static str).
// App (your code) — state-driven, declarative:
let bar = quadraui::StatusBar {
id: WidgetId::new("status:editor"),
left_segments: vec![mode_segment(), filename_segment()],
right_segments: vec![lsp_segment(), cursor_segment()],
};
// Backend (one of the four in-tree ones — see "Backend implementors"
// below) — measure + paint:
draw_status_bar(cr, &bar, &theme);§Backend implementors
Backend is pub but sealed — TUI, GTK, Win-GUI, and macOS are
the only implementations that will ever exist, and the trait enforces
that rather than just documenting it. See Backend’s
own rustdoc for the mechanism (a private supertrait, plus a
compile_fail doctest proving an out-of-crate impl Backend doesn’t
compile) and the reasoning: a required method can be added to
Backend in an ordinary PR, with no default and no version bump,
whenever a new primitive ships — sealing is what makes that safe
rather than a silent trap for a downstream implementor. Want to
render onto a target none of the four cover? Contribute a fifth
in-tree backend — see BACKEND.md.
§Documentation
Every file named below ships in the published .crate — this list
deliberately names only files a consumer of the published crate can
actually open.
README.md(repository root) — quick start, full primitive list, per-backend status.docs/GUIDE.md— build a small two-pane app end to end, fromcargo newto something you can run and click on.docs/APP_ARCHITECTURE.md— where app state lives vs. what quadraui owns; read before architecting a consumer app on top of it.docs/CONSUMER_PATTERNS.md— recipes for common app shapes (debug sidebars, source-control panels) built from these primitives.BACKEND.md— contributing a new in-tree render backend: mental model, the three contracts (owned data, measurer-parameterised algorithms, per-primitive contracts), two-pass paint pattern, click-intercept hierarchy, implementer checklist.examples/tui_demo.rs— runnable ratatui example that exercises the TabBar + StatusBar contracts end-to-end (cell units).cargo run --example tui_demo.examples/gtk_demo.rs— same demo rendered with GTK4 + Cairo + Pango (pixel units, two-pass paint). Requires thegtkfeature:cargo run --example gtk_demo --features gtk.docs/decisions/DECISIONS.md— running log of API decisions (which primitives, why this shape, what was deferred), including D-019, the stability policy for what a0.xrelease may change.
§Status
0.6.x — pre-1.0, published on crates.io. Breaking changes are
grouped into scheduled minor releases and recorded in CHANGELOG.md;
what a 0.x release may change is D-019 in
quadraui/docs/decisions/DECISIONS.md. 49 primitives shipped. The TUI
and GTK backends have full feature parity and are battle-tested by
vimcode (5000+ tests). The macOS backend implements the whole
Backend trait and is built/tested for real on macos-latest CI. The
Windows backend’s window/event/platform-services infrastructure is
real and CI-blocking on windows-latest, and every per-primitive
rasteriser is shipped too, with no todo!() left in
src/win/backend.rs — builds, tests and the cross-backend conformance
matrix are all blocking on windows-latest CI. See the root
README.md’s Status section for the specifics and issue links.
§Plugin invariants (briefly)
Applies to every primitive:
WidgetIdis owned (String) — not&'static str.- Events are plain data — no Rust closures.
- Primitives implement
Serialize + Deserialize— Lua tables map via JSON. - WidgetIds are namespaced (e.g.
"plugin:my-ext:send"). - No global event handlers — every event references a
WidgetId. - Primitives don’t borrow app state — owned data or explicit
'a.
Verify all six when adding a new primitive or extending an existing one.
Re-exports§
pub use caret_blink::CaretBlinkState;pub use diff::compute_hunks;pub use focus::FocusManager;pub use font_role::ChromePrimitive;pub use font_role::EditorClassPrimitive;pub use font_role::FontRole;pub use generic_font::GenericFamily;pub use primitives::activity_bar::ActivityBar;pub use primitives::activity_bar::ActivityBarEvent;pub use primitives::activity_bar::ActivityBarHit;pub use primitives::activity_bar::ActivityBarLayout;pub use primitives::activity_bar::ActivityBarRowHit;pub use primitives::activity_bar::ActivityBarStyle;pub use primitives::activity_bar::ActivityItem;pub use primitives::activity_bar::ActivitySide;pub use primitives::activity_bar::VisibleActivityItem;pub use primitives::activity_bar::DEFAULT_ACTIVITY_ICON_SIZE_PX;pub use primitives::board::board_layout;pub use primitives::board::BadgeStatus;pub use primitives::board::BoardAction;pub use primitives::board::BoardCard;pub use primitives::board::BoardColumn;pub use primitives::board::BoardHit;pub use primitives::board::BoardLayout;pub use primitives::board::BoardMeasure;pub use primitives::board::BoardModel;pub use primitives::board::CardBadge;pub use primitives::board::CardId;pub use primitives::board::CardLayout;pub use primitives::board::ColumnLayout;pub use primitives::board::MoveDir;pub use primitives::button::Button;pub use primitives::button::ButtonEvent;pub use primitives::button::ButtonHit;pub use primitives::button::ButtonLayout;pub use primitives::button::ButtonVariant;pub use primitives::canvas::Canvas;pub use primitives::canvas::CanvasHit;pub use primitives::canvas::CanvasLayout;pub use primitives::canvas::DrawOp;pub use primitives::chart::Chart;pub use primitives::chart::ChartEvent;pub use primitives::chart::ChartHit;pub use primitives::chart::ChartKind;pub use primitives::chart::ChartLayout;pub use primitives::chart::ChartMeasure;pub use primitives::chart::Series;pub use primitives::combo_box::ComboBox;pub use primitives::combo_box::ComboBoxEvent;pub use primitives::combo_box::ComboBoxHit;pub use primitives::combo_box::ComboBoxLayout;pub use primitives::command_center::CommandCenter;pub use primitives::command_center::CommandCenterHit;pub use primitives::command_center::CommandCenterLayout;pub use primitives::command_center::CommandCenterMeasure;pub use primitives::command_line::CommandLine;pub use primitives::command_line::CommandLineLayout;pub use primitives::command_line::CommandLineMeasure;pub use primitives::completions::CompletionItem;pub use primitives::completions::CompletionItemMeasure;pub use primitives::completions::CompletionKind;pub use primitives::completions::Completions;pub use primitives::completions::CompletionsHit;pub use primitives::completions::CompletionsLayout;pub use primitives::completions::CompletionsPlacement;pub use primitives::completions::VisibleCompletion;pub use primitives::context_menu::ContextMenu;pub use primitives::context_menu::ContextMenuGlyphs;pub use primitives::context_menu::ContextMenuHit;pub use primitives::context_menu::ContextMenuItem;pub use primitives::context_menu::ContextMenuItemMeasure;pub use primitives::context_menu::ContextMenuLayout;pub use primitives::context_menu::ContextMenuPlacement;pub use primitives::context_menu::ResolvedContextMenuPlacement;pub use primitives::context_menu::VisibleContextMenuItem;pub use primitives::data_table::Column;pub use primitives::data_table::ColumnAlign;pub use primitives::data_table::ColumnMeasure;pub use primitives::data_table::ColumnWidth;pub use primitives::data_table::DataRow;pub use primitives::data_table::DataTable;pub use primitives::data_table::DataTableEvent;pub use primitives::data_table::DataTableGlyphs;pub use primitives::data_table::DataTableHit;pub use primitives::data_table::DataTableLayout;pub use primitives::data_table::ResolvedColumn;pub use primitives::data_table::SortDirection;pub use primitives::date_picker::CalendarDate;pub use primitives::date_picker::DateFormat;pub use primitives::date_picker::DateLocale;pub use primitives::date_picker::DatePicker;pub use primitives::date_picker::DatePickerEvent;pub use primitives::date_picker::DatePickerHit;pub use primitives::date_picker::DatePickerLayout;pub use primitives::date_picker::DayCell;pub use primitives::date_picker::TimeOfDay;pub use primitives::date_picker::Weekday;pub use primitives::dialog::native_dialog_options;pub use primitives::dialog::Dialog;pub use primitives::dialog::DialogButton;pub use primitives::dialog::DialogHit;pub use primitives::dialog::DialogInput;pub use primitives::dialog::DialogLayout;pub use primitives::dialog::DialogMeasure;pub use primitives::dialog::DialogSeverity;pub use primitives::dialog::DialogTable;pub use primitives::dialog::DialogTextInput;pub use primitives::dialog::VisibleDialogButton;pub use primitives::diff_view::DiffDisplayLine;pub use primitives::diff_view::DiffEditability;pub use primitives::diff_view::DiffHeaderGeometry;pub use primitives::diff_view::DiffHunk;pub use primitives::diff_view::DiffLineContent;pub use primitives::diff_view::DiffMode;pub use primitives::diff_view::DiffPane;pub use primitives::diff_view::DiffPaneGeometry;pub use primitives::diff_view::DiffRow;pub use primitives::diff_view::DiffRowKind;pub use primitives::diff_view::DiffView;pub use primitives::diff_view::DiffViewGeometry;pub use primitives::diff_view::DiffViewHit;pub use primitives::diff_view::DiffViewLayout;pub use primitives::drop_zone::compute_drop_zone;pub use primitives::drop_zone::drop_zone_hit_test;pub use primitives::drop_zone::drop_zone_overlay;pub use primitives::drop_zone::DropEdge;pub use primitives::drop_zone::DropGroupRect;pub use primitives::drop_zone::DropOverlay;pub use primitives::drop_zone::DropZone;pub use primitives::drop_zone::DropZoneHit;pub use primitives::drop_zone::DropZoneKind;pub use primitives::editor::CursorPos as EditorCursorPos;pub use primitives::editor::CursorShape as EditorCursorShape;pub use primitives::editor::DiagnosticMark;pub use primitives::editor::DiagnosticSeverity;pub use primitives::editor::DiffLine;pub use primitives::editor::Editor;pub use primitives::editor::EditorCursor;pub use primitives::editor::EditorHit;pub use primitives::editor::EditorLayout;pub use primitives::editor::EditorLine;pub use primitives::editor::EditorPaintOptions;pub use primitives::editor::EditorSelection;pub use primitives::editor::EditorStyledSpan;pub use primitives::editor::GitLineStatus;pub use primitives::editor::SelectionCols as EditorSelectionCols;pub use primitives::editor::SelectionKind as EditorSelectionKind;pub use primitives::editor::SpellMark;pub use primitives::editor::Style as EditorStyle;pub use primitives::find_replace::compute_hit_regions as compute_find_replace_hit_regions;pub use primitives::find_replace::FindReplaceClickTarget;pub use primitives::find_replace::FindReplaceHit;pub use primitives::find_replace::FindReplacePanel;pub use primitives::find_replace::FrHitRegion;pub use primitives::find_replace::FR_PANEL_WIDTH;pub use primitives::float::Float;pub use primitives::float::FloatHit;pub use primitives::float::FloatLayout;pub use primitives::float::FloatMeasure;pub use primitives::form::ButtonRowItem;pub use primitives::form::FieldKind;pub use primitives::form::Form;pub use primitives::form::FormEvent;pub use primitives::form::FormField;pub use primitives::form::FormFieldMeasure;pub use primitives::form::FormHit;pub use primitives::form::FormItemMeasure;pub use primitives::form::FormLayout;pub use primitives::form::ToggleGroupItem;pub use primitives::form::ValidationState;pub use primitives::form::VisibleFormField;pub use primitives::image::Image;pub use primitives::image::ImageFit;pub use primitives::image::ImageHit;pub use primitives::image::ImageLayout;pub use primitives::image::ImageSource;pub use primitives::list::ListItem;pub use primitives::list::ListItemMeasure;pub use primitives::list::ListView;pub use primitives::list::ListViewEvent;pub use primitives::list::ListViewHit;pub use primitives::list::ListViewLayout;pub use primitives::list::VisibleListItem;pub use primitives::menu_bar::MenuBar;pub use primitives::menu_bar::MenuBarHit;pub use primitives::menu_bar::MenuBarItem;pub use primitives::menu_bar::MenuBarItemMeasure;pub use primitives::menu_bar::MenuBarLayout;pub use primitives::menu_bar::VisibleMenuBarItem;pub use primitives::message_list::MessageList;pub use primitives::message_list::MessageListHit;pub use primitives::message_list::MessageListMeasure;pub use primitives::message_list::MessageRow;pub use primitives::minimap::aggregate_spans;pub use primitives::minimap::reserved_width;pub use primitives::minimap::sample_blocks;pub use primitives::minimap::sample_window;pub use primitives::minimap::window_start_line;pub use primitives::minimap::Minimap;pub use primitives::minimap::MinimapGrid;pub use primitives::minimap::MinimapHit;pub use primitives::minimap::MinimapLayout;pub use primitives::minimap::MinimapLine;pub use primitives::minimap::MinimapScale;pub use primitives::minimap::MinimapSizing;pub use primitives::minimap::MinimapSpan;pub use primitives::minimap::VisibleMinimapLine;pub use primitives::multi_section_view::ActionId as MsvActionId;pub use primitives::multi_section_view::AuxHit;pub use primitives::multi_section_view::Axis as MsvAxis;pub use primitives::multi_section_view::DividerBounds;pub use primitives::multi_section_view::EmptyBody;pub use primitives::multi_section_view::HeaderAction;pub use primitives::multi_section_view::HeaderHit;pub use primitives::multi_section_view::InlineInput;pub use primitives::multi_section_view::MsvLayoutMetrics;pub use primitives::multi_section_view::MultiSectionView;pub use primitives::multi_section_view::MultiSectionViewHit;pub use primitives::multi_section_view::MultiSectionViewLayout;pub use primitives::multi_section_view::ScrollMode;pub use primitives::multi_section_view::ScrollbarHit;pub use primitives::multi_section_view::Section;pub use primitives::multi_section_view::SectionAux;pub use primitives::multi_section_view::SectionBody;pub use primitives::multi_section_view::SectionHeader;pub use primitives::multi_section_view::SectionId;pub use primitives::multi_section_view::SectionLayout;pub use primitives::multi_section_view::SectionMeasure;pub use primitives::multi_section_view::SectionSize;pub use primitives::number_input::NumberInput;pub use primitives::number_input::NumberInputEvent;pub use primitives::number_input::NumberInputHit;pub use primitives::number_input::NumberInputLayout;pub use primitives::palette::Palette;pub use primitives::palette::PaletteEvent;pub use primitives::palette::PaletteHit;pub use primitives::palette::PaletteItem;pub use primitives::palette::PaletteItemMeasure;pub use primitives::palette::PaletteLayout;pub use primitives::palette::PaletteMode;pub use primitives::palette::PalettePreview;pub use primitives::palette::PaletteScrollbar;pub use primitives::palette::VisiblePaletteItem;pub use primitives::panel::Panel;pub use primitives::panel::PanelAction;pub use primitives::panel::PanelHit;pub use primitives::panel::PanelLayout;pub use primitives::panel::PanelMeasure;pub use primitives::panel::VisiblePanelAction;pub use primitives::pipeline_view::PipelineEvent;pub use primitives::pipeline_view::PipelineHit;pub use primitives::pipeline_view::PipelineStage;pub use primitives::pipeline_view::PipelineView;pub use primitives::pipeline_view::PipelineViewLayout;pub use primitives::pipeline_view::PipelineViewMeasure;pub use primitives::pipeline_view::StageBounds;pub use primitives::pipeline_view::StageStatus;pub use primitives::progress::ProgressBar;pub use primitives::progress::ProgressBarHit;pub use primitives::progress::ProgressBarLayout;pub use primitives::progress::ProgressBarMeasure;pub use primitives::radio_group::RadioGroup;pub use primitives::radio_group::RadioGroupEvent;pub use primitives::radio_group::RadioGroupHit;pub use primitives::radio_group::RadioGroupLayout;pub use primitives::radio_group::RadioOption;pub use primitives::radio_group::RadioOptionMeasure;pub use primitives::rich_text_popup::PopupPlacement;pub use primitives::rich_text_popup::PopupScrollbar;pub use primitives::rich_text_popup::RichTextLink;pub use primitives::rich_text_popup::RichTextPopup;pub use primitives::rich_text_popup::RichTextPopupHit;pub use primitives::rich_text_popup::RichTextPopupLayout;pub use primitives::rich_text_popup::RichTextPopupMeasure;pub use primitives::rich_text_popup::TextSelection;pub use primitives::rich_text_popup::VisibleRichTextLine;pub use primitives::scroll_view::ScrollView;pub use primitives::scroll_view::ScrollViewEvent;pub use primitives::scrollbar::clamp_scroll_offset_f32;pub use primitives::scrollbar::fit_thumb;pub use primitives::scrollbar::scroll_by_clamped_f32;pub use primitives::scrollbar::scroll_rows;pub use primitives::scrollbar::wheel_delta;pub use primitives::scrollbar::wheel_row_delta;pub use primitives::scrollbar::PressZone;pub use primitives::scrollbar::ScrollAxis;pub use primitives::scrollbar::Scrollbar;pub use primitives::sidebar_panel::SidebarPanel;pub use primitives::sidebar_panel::SidebarPanelHit;pub use primitives::sidebar_panel::SidebarPanelLayout;pub use primitives::sidebar_panel::SidebarPanelMeasure;pub use primitives::spinner::Spinner;pub use primitives::spinner::SpinnerHit;pub use primitives::spinner::SpinnerLayout;pub use primitives::spinner::SpinnerMeasure;pub use primitives::split::Split;pub use primitives::split::SplitDirection;pub use primitives::split::SplitHit;pub use primitives::split::SplitLayout;pub use primitives::split::SplitMeasure;pub use primitives::split_tree::SplitTree;pub use primitives::split_tree::SplitTreeDivider;pub use primitives::split_tree::SplitTreeLayout;pub use primitives::split_tree::SplitTreeMeasure;pub use primitives::split_tree::MAX_RATIO as SPLIT_TREE_MAX_RATIO;pub use primitives::split_tree::MIN_RATIO as SPLIT_TREE_MIN_RATIO;pub use primitives::status_bar::StatusBar;pub use primitives::status_bar::StatusBarEvent;pub use primitives::status_bar::StatusBarHit;pub use primitives::status_bar::StatusBarHitRegion;pub use primitives::status_bar::StatusBarLayout;pub use primitives::status_bar::StatusBarSegment;pub use primitives::status_bar::StatusSegmentMeasure;pub use primitives::status_bar::StatusSegmentSide;pub use primitives::status_bar::VisibleStatusSegment;pub use primitives::switch::Switch;pub use primitives::switch::SwitchEvent;pub use primitives::switch::SwitchHit;pub use primitives::switch::SwitchLayout;pub use primitives::tab_bar::tab_icon_at;pub use primitives::tab_bar::tab_icon_cols;pub use primitives::tab_bar::SegmentMeasure;pub use primitives::tab_bar::TabBar;pub use primitives::tab_bar::TabBarEvent;pub use primitives::tab_bar::TabBarGlyphs;pub use primitives::tab_bar::TabBarHit;pub use primitives::tab_bar::TabBarHits;Deprecated pub use primitives::tab_bar::TabBarLayout;pub use primitives::tab_bar::TabBarSegment;pub use primitives::tab_bar::TabChrome;pub use primitives::tab_bar::TabFrame;pub use primitives::tab_bar::TabIcon;pub use primitives::tab_bar::TabItem;pub use primitives::tab_bar::TabMeasure;pub use primitives::tab_bar::VisibleSegment;pub use primitives::tab_bar::VisibleTab;pub use primitives::terminal::Terminal;pub use primitives::terminal::TerminalCell;pub use primitives::terminal::TerminalCellSize;pub use primitives::terminal::TerminalCursorShape;pub use primitives::terminal::TerminalEvent;pub use primitives::terminal::TerminalHit;pub use primitives::terminal::TerminalLayout;pub use primitives::terminal::TerminalScrollbar;pub use primitives::terminal::TerminalSplitHit;pub use primitives::terminal::TerminalSplitLayout;pub use primitives::text_display::TextDisplay;pub use primitives::text_display::TextDisplayEvent;pub use primitives::text_display::TextDisplayHit;pub use primitives::text_display::TextDisplayLayout;pub use primitives::text_display::TextDisplayLine;pub use primitives::text_display::TextDisplayLineMeasure;pub use primitives::text_display::VisibleTextDisplayLine;pub use primitives::text_input::EditOp;pub use primitives::text_input::TextEditor;pub use primitives::text_input::TextInput;pub use primitives::text_input::TextInputHit;pub use primitives::text_input::TextInputLayout;pub use primitives::text_input::TextInputMeasure;pub use primitives::text_input::VisibleTextInputLine;pub use primitives::toast::Toast;pub use primitives::toast::ToastButton;pub use primitives::toast::ToastCorner;pub use primitives::toast::ToastFocus;pub use primitives::toast::ToastFocusTarget;pub use primitives::toast::ToastHit;pub use primitives::toast::ToastMeasure;pub use primitives::toast::ToastOverlay;pub use primitives::toast::ToastSeverity;pub use primitives::toast::ToastStackLayout;pub use primitives::toast::VisibleToast;pub use primitives::toolbar::Toolbar;pub use primitives::toolbar::ToolbarButton;pub use primitives::toolbar::ToolbarHit;pub use primitives::toolbar::ToolbarIcons;pub use primitives::toolbar::ToolbarItemKind;pub use primitives::toolbar::ToolbarItemMeasure;pub use primitives::toolbar::ToolbarLayout;pub use primitives::toolbar::ToolbarPaintOptions;pub use primitives::toolbar::ToolbarVAlign;pub use primitives::toolbar::VisibleToolbarItem;pub use primitives::tooltip::ResolvedPlacement;pub use primitives::tooltip::Tooltip;pub use primitives::tooltip::TooltipBorder;pub use primitives::tooltip::TooltipChrome;pub use primitives::tooltip::TooltipHit;pub use primitives::tooltip::TooltipLayout;pub use primitives::tooltip::TooltipMeasure;pub use primitives::tooltip::TooltipPlacement;pub use primitives::tree::selected_paths_for_indices;pub use primitives::tree::TreeEvent;pub use primitives::tree::TreeRow;pub use primitives::tree::TreeRowEditState;pub use primitives::tree::TreeRowMeasure;pub use primitives::tree::TreeView;pub use primitives::tree::TreeViewHit;pub use primitives::tree::TreeViewLayout;pub use primitives::tree::VisibleTreeRow;pub use style::Style;pub use text_util::fuzzy_score;pub use text_util::next_char_boundary;pub use text_util::prev_char_boundary;pub use text_util::safe_prefix;pub use text_util::safe_slice;pub use text_util::snap_to_char_boundary;pub use text_util::word_wrap;pub use text_util::wrap_spans;pub use text_util::WrapPolicy;pub use theme::Theme;pub use transition::lerp;pub use transition::lerp_rect;pub use transition::Transition;pub use types::apply_selection_gesture;pub use types::Badge;pub use types::Color;pub use types::Decoration;pub use types::Icon;pub use types::Modifiers;pub use types::SelectionGesture;pub use types::SelectionMode;pub use types::StyledSpan;pub use types::StyledText;pub use types::TreePath;pub use types::TreeStyle;pub use types::WidgetId;pub use undo::UndoStack;pub use accelerator::parse_key_binding;pub use accelerator::render_accelerator;pub use accelerator::render_binding;pub use accelerator::Accelerator;pub use accelerator::AcceleratorId;pub use accelerator::AcceleratorScope;pub use accelerator::KeyBinding;pub use accelerator::ParsedBinding;pub use accelerator::Platform;pub use backend::Backend;pub use backend::BackendCaps;pub use backend::BackendError;pub use backend::Clipboard;pub use backend::ClipboardFormat;pub use backend::ColorDepth;pub use backend::Display;pub use backend::FileDialogOptions;pub use backend::InvalidationLog;pub use backend::MenuStyle;pub use backend::MessageDialogButton;pub use backend::MessageDialogChoice;pub use backend::MessageDialogOptions;pub use backend::Metrics;pub use backend::Notification;pub use backend::PlatformFontDefaults;pub use backend::PlatformServices;pub use backend::PointerShape;pub use backend::ResizeEdge;pub use backend::ResolvedMenuStyle;pub use backend::RgbaImage;pub use backend::SecretStore;pub use backend::ServiceResult;pub use backend::SystemTheme;pub use backend::WindowControl;pub use event::mouse_down;pub use event::mouse_moved;pub use event::mouse_up;pub use event::scroll;pub use event::window_resized;pub use event::BackendNativeEvent;pub use event::ButtonMask;pub use event::Key;pub use event::MouseButton;pub use event::NamedKey;pub use event::Point;pub use event::Rect;pub use event::ScrollDelta;pub use event::UiEvent;pub use event::UserPayload;pub use event::Viewport;pub use frame::check_frame_order;pub use frame::compose_frame;pub use frame::FrameHitMap;pub use frame::FrameOrderViolation;pub use frame::FramePresence;pub use frame::FrameRung;pub use frame::FrameZone;pub use frame::OwnedContent;pub use frame::OwnedFrame;pub use frame::OwnedNode;pub use frame::ScreenLayout;pub use frame::Surface;pub use paint_surface::PaintSurface;pub use paint_surface::PathVerb;pub use interaction::InteractionState;pub use layout::visible_range_walk;pub use layout::Anchor;pub use layout::Axis;pub use layout::ResolvedSide;pub use layout::Side;pub use layout::VisibleItem;pub use shell::ShellApp;pub use shell::ShellConfig;pub use shell::ShellContext;pub use compose::markdown::render_markdown_to_styled;pub use compose::markdown::render_markdown_to_styled_wrapped;pub use compose::markdown::CodeBlockRange;pub use compose::markdown::RenderedMarkdown;pub use compose::filter_help_actions;pub use compose::help_actions_to_palette_items;pub use compose::notify_or_toast;pub use compose::AppShell;pub use compose::AppShellEvent;pub use compose::AppShellLayout;pub use compose::BackendWidget;pub use compose::BottomBand;pub use compose::BottomPanelConfig;pub use compose::BottomPanelController;pub use compose::BottomPanelEvent;pub use compose::BottomPanelLayout;pub use compose::BottomPanelTab;pub use compose::ChatController;pub use compose::ChatControllerEvent;pub use compose::ChatRole;pub use compose::ChatTurn;pub use compose::ContextMenuController;pub use compose::ContextMenuOutcome;pub use compose::DualModePaletteController;pub use compose::DualModePaletteEvent;pub use compose::FilePickerController;pub use compose::FilePickerEvent;pub use compose::FilePickerMode;pub use compose::FocusGroup;pub use compose::FocusRing;pub use compose::FolderPickerController;pub use compose::FolderPickerEvent;pub use compose::FormController;pub use compose::FormControllerEvent;pub use compose::GroupLayout;pub use compose::HelpAction;pub use compose::HelpNote;pub use compose::HelpOverlayController;pub use compose::HelpOverlayEvent;pub use compose::HelpRegistry;pub use compose::MenuDef;pub use compose::MenuEvent;pub use compose::MenuSystem;pub use compose::MessageDialogController;pub use compose::MessageDialogEvent;pub use compose::Pane;pub use compose::PaneDragRect;pub use compose::PaneTab;pub use compose::PanelDefinition;pub use compose::SectionKind;pub use compose::ShellPosition;pub use compose::SidebarEvent;pub use compose::SidebarPanelBody;pub use compose::SidebarPanelBodyLayout;pub use compose::SidebarPanelChrome;pub use compose::SidebarSectionDef;pub use compose::SidebarSystem;pub use compose::StatusBarAction;pub use compose::StatusBarInteraction;pub use compose::TabGroupController;pub use compose::TabGroupEvent;pub use compose::TabGroupLayout;pub use compose::ToastStackController;pub use compose::ToastStackEvent;pub use compose::ToolbarHoverTracker;pub use compose::TreeController;pub use compose::TreeControllerEvent;pub use compose::ViewHelp;pub use compose::WorkspaceController;pub use compose::WorkspaceDoc;pub use compose::WorkspaceEvent;pub use compose::WorkspaceLayout;pub use compose::PALETTE_CHROME_ROWS;pub use dispatch::dispatch_click;pub use dispatch::dispatch_mouse_down;pub use dispatch::dispatch_mouse_drag;pub use dispatch::dispatch_mouse_up;pub use dispatch::dispatch_scroll;pub use dispatch::text_selection_line_range;pub use dispatch::DragState;pub use dispatch::DragTarget;pub use dispatch::ScrollSurface;pub use dispatch::SurfaceScrollbar;pub use dispatch::TextRegion;pub use modal_stack::ModalEntry;pub use modal_stack::ModalStack;pub use runner::AppLogic;pub use runner::Reaction;pub use runner::StepOutcome;
Modules§
- accelerator
- Declarative cross-platform keybindings.
- backend
- The
Backendtrait — one implementation per platform target (TUI, GTK, Win-GUI, and eventually macOS). Apps write render code once, parameterised over<B: Backend>; every backend rasterises the same primitive descriptions with platform-native drawing + input. Seequadraui/docs/decisions/BACKEND_TRAIT_PROPOSAL.md§4 for design rationale. - caret_
blink CaretBlinkState— backend-neutral software caret-blink state machine.- compose
- High-level helpers that compose multiple primitives into reusable interaction patterns.
- descriptor_
store - Rust-owned retained descriptor store: handles + in-place mutation.
- diagnostics
- Library-internal diagnostics sink.
- diff
- Pure-computation diff module.
- dispatch
- Cross-backend mouse + scroll dispatch.
- event
- Backend-neutral event type.
- flex
layout - Optional flex/grid layout module, built on
taffy. - focus
FocusManager— the single owner of “what widget currently has keyboard focus”.- font_
role - Chrome-vs-editor font classification.
- frame
- Frame-level rendering: declarative surface list + unified hit-test.
- generic_
font - CSS-style generic font family tokens.
- gtk
gtk - Public GTK (Cairo + Pango) rasterisers for
quadrauiprimitives. - interaction
InteractionState— a single hover/pressed store keyed byWidgetId.- layout
- Shared foundation for layout() and hit_test() primitives.
- modal_
stack - Cross-backend modal-overlay tracking.
- paint_
surface PaintSurface— the low-level drawing-verb trait underneath the three pixel backends.- prelude
- Curated one-line import for a first quadraui app.
- primitives
- Widget primitives.
- runner
- Runner-crate API for
AppLogic-style apps that delegate event + frame loops to a per-backend runner (quadraui::tui::run,quadraui::gtk::run, futurequadraui::win::run/quadraui::macos::run). - shell
- Shell runner infrastructure:
ShellApptrait +ShellConfig. - shell_
adapter gtk, ortui, orwin, or macOS andmacos - Shared [
ShellAdapter] that wraps aShellAppin anAppShelland implementsAppLogicagainst it. - style
Style— non-colour visual tokens (spacing, radius, border width, focus-ring weight, …), the geometry half of theming thatcrate::Themedeliberately does not cover.- terminal_
engine terminal - PTY + vt100 + scrollback engine for embedded terminal emulators.
- terminal_
style - Shared terminal-cell rendering helpers consumed by every rasteriser
that paints
crate::primitives::terminal::Terminalcell grids (tui,gtk,macostoday). - testing
- Backend-agnostic conformance-test surface.
- text_
util - Pure text-processing utilities: fuzzy subsequence matching and word-aware line wrapping.
- theme
- Backend-agnostic
Themestruct consumed by the per-backend rasterisers incrate::tuiandcrate::gtk. - transition
- Time-based progress helper for chrome motion (fades, slides, resizes).
- tui
tui - Public TUI (ratatui) rasterisers for
quadrauiprimitives. - types
- Shared primitive types used across widgets: colours, icons, styled text, widget identifiers, modifier flags, and tree paths.
- undo
UndoStack— a generic, snapshot-based undo/redo history.- win
win - Win-GUI backend: Direct2D + DirectWrite rasterisers.
Structs§
- A11y
Child - A sub-node a primitive contributes to the tree: a list row, a toolbar button, a tree item.
- A11y
Info - Accessibility metadata a future per-primitive field or
Backendsidecar parameter would carry: a typed AT role, an accessible name, and typed state (selected, expanded, checked, disabled, read-only, value, level, position-in-set, live-region politeness). - A11y
Node Id - Identity of a node in the accessibility tree, stable across frames.
- A11y
Tree - A whole accessibility tree for one frame: every node, in document order, root first.
- A11y
Tree Builder - Builds accessibility trees from frames, and diffs consecutive frames so only changed nodes are emitted.
- A11y
Tree Node - One node of a built accessibility tree.
- A11y
Update - An incremental tree update: the nodes that changed since the last one, plus the focus (always) and the root (first update only).
- A11y
Value Range - A numeric value plus its range, for sliders, progress bars, and spin buttons. All three fields are the same unit (the caller’s); this type carries no notion of percentage vs. absolute.
Enums§
- A11y
Checked - A tri-state “checked” value for checkboxes, radio buttons, and
tri-state toggles. Mirrors
accesskit::Toggled. - A11y
Live - Live-region politeness, controlling how urgently an AT should
announce a change to this element’s content. Mirrors
accesskit::Live. - A11y
Role - A typed accessibility role, replacing a free-form role string.
Constants§
- VERSION
- Crate version, sourced from
Cargo.toml.
Traits§
- A11y
Primitive - The per-primitive hook: how a primitive describes itself to an assistive technology.
Functions§
- frame_
to_ tree - The full accessibility tree for one frame, with the default root
label — the stateless convenience form of
A11yTreeBuilder::tree.