Skip to main content

Crate quadraui

Crate quadraui 

Source
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 root README.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 on windows-latest, and every per-primitive rasteriser is shipped; its conformance-matrix column gates like every other backend’s (see tests/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:

PrimitiveUse for
TreeViewFile explorers, source-control panels, hierarchical lists
ListViewQuickfix, search results, flat selectable lists
FormSettings panels, config editors
PaletteCommand palettes, fuzzy pickers
StatusBarMode/file/cursor strips, footer bars
TabBarEditor tabs, document tabs
ActivityBarVertical icon strips (VSCode-style)
TerminalCell grids for terminal emulators
TextDisplayStreaming 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, from cargo new to 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 the gtk feature: 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 a 0.x release 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:

  1. WidgetId is owned (String) — not &'static str.
  2. Events are plain data — no Rust closures.
  3. Primitives implement Serialize + Deserialize — Lua tables map via JSON.
  4. WidgetIds are namespaced (e.g. "plugin:my-ext:send").
  5. No global event handlers — every event references a WidgetId.
  6. 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::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::NavigationMode;
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 Backend trait — 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. See quadraui/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.
flexlayout
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.
gtkgtk
Public GTK (Cairo + Pango) rasterisers for quadraui primitives.
interaction
InteractionState — a single hover/pressed store keyed by WidgetId.
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, future quadraui::win::run / quadraui::macos::run).
shell
Shell runner infrastructure: ShellApp trait + ShellConfig.
shell_adaptergtk, or tui, or win, or macOS and macos
Shared [ShellAdapter] that wraps a ShellApp in an AppShell and implements AppLogic against it.
style
Style — non-colour visual tokens (spacing, radius, border width, focus-ring weight, …), the geometry half of theming that crate::Theme deliberately does not cover.
terminal_engineterminal
PTY + vt100 + scrollback engine for embedded terminal emulators.
terminal_style
Shared terminal-cell rendering helpers consumed by every rasteriser that paints crate::primitives::terminal::Terminal cell grids (tui, gtk, macos today).
testing
Backend-agnostic conformance-test surface.
text_util
Pure text-processing utilities: fuzzy subsequence matching and word-aware line wrapping.
theme
Backend-agnostic Theme struct consumed by the per-backend rasterisers in crate::tui and crate::gtk.
transition
Time-based progress helper for chrome motion (fades, slides, resizes).
tuitui
Public TUI (ratatui) rasterisers for quadraui primitives.
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.
winwin
Win-GUI backend: Direct2D + DirectWrite rasterisers.

Structs§

A11yChild
A sub-node a primitive contributes to the tree: a list row, a toolbar button, a tree item.
A11yInfo
Accessibility metadata a future per-primitive field or Backend sidecar 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).
A11yNodeId
Identity of a node in the accessibility tree, stable across frames.
A11yTree
A whole accessibility tree for one frame: every node, in document order, root first.
A11yTreeBuilder
Builds accessibility trees from frames, and diffs consecutive frames so only changed nodes are emitted.
A11yTreeNode
One node of a built accessibility tree.
A11yUpdate
An incremental tree update: the nodes that changed since the last one, plus the focus (always) and the root (first update only).
A11yValueRange
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§

A11yChecked
A tri-state “checked” value for checkboxes, radio buttons, and tri-state toggles. Mirrors accesskit::Toggled.
A11yLive
Live-region politeness, controlling how urgently an AT should announce a change to this element’s content. Mirrors accesskit::Live.
A11yRole
A typed accessibility role, replacing a free-form role string.

Constants§

VERSION
Crate version, sourced from Cargo.toml.

Traits§

A11yPrimitive
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.