#![deny(clippy::print_stdout, clippy::print_stderr)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![allow(rustdoc::broken_intra_doc_links, rustdoc::private_intra_doc_links)]
mod a11y;
pub mod caret_blink;
pub mod descriptor_store;
pub mod diagnostics;
pub mod diff;
pub mod focus;
pub mod font_role;
pub mod frame;
pub mod generic_font;
pub mod interaction;
pub mod layout;
pub mod prelude;
pub mod primitives;
pub mod shell;
pub mod style;
pub mod terminal_style;
pub mod testing;
pub mod text_util;
pub mod theme;
pub mod transition;
pub mod types;
pub mod undo;
#[cfg(feature = "terminal")]
#[cfg_attr(docsrs, doc(cfg(feature = "terminal")))]
pub mod terminal_engine;
#[cfg(feature = "layout")]
#[cfg_attr(docsrs, doc(cfg(feature = "layout")))]
pub mod flex;
#[cfg(any(feature = "gtk", all(feature = "macos", target_os = "macos")))]
pub(crate) mod image_cache;
#[cfg(any(
feature = "gtk",
feature = "win",
all(feature = "macos", target_os = "macos")
))]
pub(crate) mod codicon;
#[cfg(feature = "gtk")]
#[cfg_attr(docsrs, doc(cfg(feature = "gtk")))]
pub mod gtk;
#[cfg(all(feature = "macos", target_os = "macos"))]
#[cfg_attr(docsrs, doc(cfg(feature = "macos")))]
pub mod macos;
#[cfg(feature = "tui")]
#[cfg_attr(docsrs, doc(cfg(feature = "tui")))]
pub mod tui;
#[cfg(feature = "win")]
#[cfg_attr(docsrs, doc(cfg(feature = "win")))]
pub mod win;
pub mod compose;
pub mod accelerator;
pub mod backend;
pub mod event;
pub mod paint_surface;
mod paint_geometry;
pub mod dispatch;
pub mod modal_stack;
pub mod runner;
#[cfg(any(
feature = "tui",
feature = "gtk",
all(feature = "macos", target_os = "macos"),
feature = "win"
))]
pub mod shell_adapter;
#[cfg(any(
feature = "tui",
feature = "gtk",
all(feature = "macos", target_os = "macos"),
feature = "win"
))]
mod runtime;
mod desktop;
#[cfg(any(
feature = "tui",
feature = "gtk",
feature = "win",
all(feature = "macos", target_os = "macos")
))]
mod text_selection;
#[cfg(any(
feature = "tui",
feature = "gtk",
feature = "win",
all(feature = "macos", target_os = "macos")
))]
mod backend_core;
pub use a11y::{
frame_to_tree, A11yChecked, A11yChild, A11yInfo, A11yLive, A11yNodeId, A11yPrimitive, A11yRole,
A11yTree, A11yTreeBuilder, A11yTreeNode, A11yUpdate, A11yValueRange,
};
pub use caret_blink::CaretBlinkState;
pub use diff::compute_hunks;
pub use focus::FocusManager;
pub use font_role::{ChromePrimitive, EditorClassPrimitive, FontRole};
pub use generic_font::GenericFamily;
pub use primitives::activity_bar::{
ActivityBar, ActivityBarEvent, ActivityBarHit, ActivityBarLayout, ActivityBarRowHit,
ActivityBarStyle, ActivityItem, ActivitySide, VisibleActivityItem,
DEFAULT_ACTIVITY_ICON_SIZE_PX,
};
pub use primitives::board::{
board_layout, BadgeStatus, BoardAction, BoardCard, BoardColumn, BoardHit, BoardLayout,
BoardMeasure, BoardModel, CardBadge, CardId, CardLayout, ColumnLayout, MoveDir,
};
pub use primitives::button::{Button, ButtonEvent, ButtonHit, ButtonLayout, ButtonVariant};
pub use primitives::canvas::{Canvas, CanvasHit, CanvasLayout, DrawOp};
pub use primitives::chart::{
Chart, ChartEvent, ChartHit, ChartKind, ChartLayout, ChartMeasure, Series,
};
pub use primitives::combo_box::{ComboBox, ComboBoxEvent, ComboBoxHit, ComboBoxLayout};
pub use primitives::command_center::{
CommandCenter, CommandCenterHit, CommandCenterLayout, CommandCenterMeasure,
};
pub use primitives::command_line::{CommandLine, CommandLineLayout, CommandLineMeasure};
pub use primitives::completions::{
CompletionItem, CompletionItemMeasure, CompletionKind, Completions, CompletionsHit,
CompletionsLayout, CompletionsPlacement, VisibleCompletion,
};
pub use primitives::context_menu::{
ContextMenu, ContextMenuGlyphs, ContextMenuHit, ContextMenuItem, ContextMenuItemMeasure,
ContextMenuLayout, ContextMenuPlacement, ResolvedContextMenuPlacement, VisibleContextMenuItem,
};
pub use primitives::data_table::{
Column, ColumnAlign, ColumnMeasure, ColumnWidth, DataRow, DataTable, DataTableEvent,
DataTableGlyphs, DataTableHit, DataTableLayout, ResolvedColumn, SortDirection,
};
pub use primitives::date_picker::{
CalendarDate, DateFormat, DateLocale, DatePicker, DatePickerEvent, DatePickerHit,
DatePickerLayout, DayCell, TimeOfDay, Weekday,
};
pub use primitives::dialog::{
native_dialog_options, Dialog, DialogButton, DialogHit, DialogInput, DialogLayout,
DialogMeasure, DialogSeverity, DialogTable, DialogTextInput, VisibleDialogButton,
};
pub use primitives::diff_view::{
DiffDisplayLine, DiffEditability, DiffHeaderGeometry, DiffHunk, DiffLineContent, DiffMode,
DiffPane, DiffPaneGeometry, DiffRow, DiffRowKind, DiffView, DiffViewGeometry, DiffViewHit,
DiffViewLayout,
};
pub use primitives::drop_zone::{
compute_drop_zone, drop_zone_hit_test, drop_zone_overlay, DropEdge, DropGroupRect, DropOverlay,
DropZone, DropZoneHit, DropZoneKind,
};
pub use primitives::editor::{
CursorPos as EditorCursorPos, CursorShape as EditorCursorShape, DiagnosticMark,
DiagnosticSeverity, DiffLine, Editor, EditorCursor, EditorHit, EditorLayout, EditorLine,
EditorPaintOptions, EditorSelection, EditorStyledSpan, GitLineStatus,
SelectionCols as EditorSelectionCols, SelectionKind as EditorSelectionKind, SpellMark,
Style as EditorStyle,
};
pub use primitives::find_replace::{
compute_hit_regions as compute_find_replace_hit_regions, FindReplaceClickTarget,
FindReplaceHit, FindReplacePanel, FrHitRegion, FR_PANEL_WIDTH,
};
pub use primitives::float::{Float, FloatHit, FloatLayout, FloatMeasure};
pub use primitives::form::{
ButtonRowItem, FieldKind, Form, FormEvent, FormField, FormFieldMeasure, FormHit,
FormItemMeasure, FormLayout, ToggleGroupItem, ValidationState, VisibleFormField,
};
pub use primitives::image::{Image, ImageFit, ImageHit, ImageLayout, ImageSource};
pub use primitives::list::{
ListItem, ListItemMeasure, ListView, ListViewEvent, ListViewHit, ListViewLayout,
VisibleListItem,
};
pub use primitives::menu_bar::{
MenuBar, MenuBarHit, MenuBarItem, MenuBarItemMeasure, MenuBarLayout, VisibleMenuBarItem,
};
pub use primitives::message_list::{MessageList, MessageListHit, MessageListMeasure, MessageRow};
pub use primitives::minimap::{
aggregate_spans, reserved_width, sample_blocks, sample_window, window_start_line, Minimap,
MinimapGrid, MinimapHit, MinimapLayout, MinimapLine, MinimapScale, MinimapSizing, MinimapSpan,
VisibleMinimapLine,
};
pub use primitives::multi_section_view::{
ActionId as MsvActionId, AuxHit, Axis as MsvAxis, DividerBounds, EmptyBody, HeaderAction,
HeaderHit, InlineInput, MsvLayoutMetrics, MultiSectionView, MultiSectionViewHit,
MultiSectionViewLayout, ScrollMode, ScrollbarHit, Section, SectionAux, SectionBody,
SectionHeader, SectionId, SectionLayout, SectionMeasure, SectionSize,
};
pub use primitives::number_input::{
NumberInput, NumberInputEvent, NumberInputHit, NumberInputLayout,
};
pub use primitives::palette::{
Palette, PaletteEvent, PaletteHit, PaletteItem, PaletteItemMeasure, PaletteLayout, PaletteMode,
PalettePreview, PaletteScrollbar, VisiblePaletteItem,
};
pub use primitives::panel::{
Panel, PanelAction, PanelHit, PanelLayout, PanelMeasure, VisiblePanelAction,
};
pub use primitives::pipeline_view::{
PipelineEvent, PipelineHit, PipelineStage, PipelineView, PipelineViewLayout,
PipelineViewMeasure, StageBounds, StageStatus,
};
pub use primitives::progress::{
ProgressBar, ProgressBarHit, ProgressBarLayout, ProgressBarMeasure,
};
pub use primitives::radio_group::{
RadioGroup, RadioGroupEvent, RadioGroupHit, RadioGroupLayout, RadioOption, RadioOptionMeasure,
};
pub use primitives::rich_text_popup::{
PopupPlacement, PopupScrollbar, RichTextLink, RichTextPopup, RichTextPopupHit,
RichTextPopupLayout, RichTextPopupMeasure, TextSelection, VisibleRichTextLine,
};
pub use primitives::scroll_view::{ScrollView, ScrollViewEvent};
pub use primitives::scrollbar::{
clamp_scroll_offset_f32, fit_thumb, scroll_by_clamped_f32, scroll_rows, wheel_delta,
wheel_row_delta, PressZone, ScrollAxis, Scrollbar,
};
pub use primitives::sidebar_panel::{
SidebarPanel, SidebarPanelHit, SidebarPanelLayout, SidebarPanelMeasure,
};
pub use primitives::spinner::{Spinner, SpinnerHit, SpinnerLayout, SpinnerMeasure};
pub use primitives::split::{Split, SplitDirection, SplitHit, SplitLayout, SplitMeasure};
pub use primitives::split_tree::{
SplitTree, SplitTreeDivider, SplitTreeLayout, SplitTreeMeasure,
MAX_RATIO as SPLIT_TREE_MAX_RATIO, MIN_RATIO as SPLIT_TREE_MIN_RATIO,
};
pub use primitives::status_bar::{
StatusBar, StatusBarEvent, StatusBarHit, StatusBarHitRegion, StatusBarLayout, StatusBarSegment,
StatusSegmentMeasure, StatusSegmentSide, VisibleStatusSegment,
};
pub use primitives::switch::{Switch, SwitchEvent, SwitchHit, SwitchLayout};
#[allow(deprecated)]
pub use primitives::tab_bar::{
tab_icon_at, tab_icon_cols, SegmentMeasure, TabBar, TabBarEvent, TabBarGlyphs, TabBarHit,
TabBarHits, TabBarLayout, TabBarSegment, TabChrome, TabFrame, TabIcon, TabItem, TabMeasure,
VisibleSegment, VisibleTab,
};
pub use primitives::terminal::{
Terminal, TerminalCell, TerminalCellSize, TerminalCursorShape, TerminalEvent, TerminalHit,
TerminalLayout, TerminalScrollbar, TerminalSplitHit, TerminalSplitLayout,
};
pub use primitives::text_display::{
TextDisplay, TextDisplayEvent, TextDisplayHit, TextDisplayLayout, TextDisplayLine,
TextDisplayLineMeasure, VisibleTextDisplayLine,
};
pub use primitives::text_input::{
EditOp, TextEditor, TextInput, TextInputHit, TextInputLayout, TextInputMeasure,
VisibleTextInputLine,
};
pub use primitives::toast::{
Toast, ToastButton, ToastCorner, ToastFocus, ToastFocusTarget, ToastHit, ToastMeasure,
ToastOverlay, ToastSeverity, ToastStackLayout, VisibleToast,
};
pub use primitives::toolbar::{
Toolbar, ToolbarButton, ToolbarHit, ToolbarIcons, ToolbarItemKind, ToolbarItemMeasure,
ToolbarLayout, ToolbarPaintOptions, ToolbarVAlign, VisibleToolbarItem,
};
pub use primitives::tooltip::{
ResolvedPlacement, Tooltip, TooltipBorder, TooltipChrome, TooltipHit, TooltipLayout,
TooltipMeasure, TooltipPlacement,
};
pub use primitives::tree::{
selected_paths_for_indices, TreeEvent, TreeRow, TreeRowEditState, TreeRowMeasure, TreeView,
TreeViewHit, TreeViewLayout, VisibleTreeRow,
};
pub use style::Style;
pub use text_util::{
fuzzy_score, next_char_boundary, prev_char_boundary, safe_prefix, safe_slice,
snap_to_char_boundary, word_wrap, wrap_spans, WrapPolicy,
};
pub use theme::Theme;
pub use transition::{lerp, lerp_rect, Transition};
pub use types::{
apply_selection_gesture, Badge, Color, Decoration, Icon, Modifiers, SelectionGesture,
SelectionMode, StyledSpan, StyledText, TreePath, TreeStyle, WidgetId,
};
pub use undo::UndoStack;
pub use accelerator::{
parse_key_binding, render_accelerator, render_binding, Accelerator, AcceleratorId,
AcceleratorScope, KeyBinding, ParsedBinding, Platform,
};
pub use backend::{
Backend, BackendCaps, BackendError, Clipboard, ClipboardFormat, ColorDepth, Display,
FileDialogOptions, InvalidationLog, MenuStyle, MessageDialogButton, MessageDialogChoice,
MessageDialogOptions, Metrics, Notification, PlatformFontDefaults, PlatformServices,
PointerShape, ResizeEdge, ResolvedMenuStyle, RgbaImage, SecretStore, ServiceResult,
SystemTheme, WindowControl,
};
pub use event::{
mouse_down, mouse_moved, mouse_up, scroll, window_resized, BackendNativeEvent, ButtonMask, Key,
MouseButton, NamedKey, Point, Rect, ScrollDelta, UiEvent, UserPayload, Viewport,
};
pub use frame::{
check_frame_order, compose_frame, FrameHitMap, FrameOrderViolation, FramePresence, FrameRung,
FrameZone, OwnedContent, OwnedFrame, OwnedNode, ScreenLayout, Surface,
};
pub use paint_surface::{PaintSurface, PathVerb};
pub use interaction::InteractionState;
pub use layout::{visible_range_walk, Anchor, Axis, ResolvedSide, Side, VisibleItem};
pub use shell::{ShellApp, ShellConfig, ShellContext};
pub use compose::markdown::{
render_markdown_to_styled, render_markdown_to_styled_wrapped, CodeBlockRange, RenderedMarkdown,
};
pub use compose::{
filter_help_actions, help_actions_to_palette_items, notify_or_toast, AppShell, AppShellEvent,
AppShellLayout, BackendWidget, BottomBand, BottomPanelConfig, BottomPanelController,
BottomPanelEvent, BottomPanelLayout, BottomPanelTab, ChatController, ChatControllerEvent,
ChatRole, ChatTurn, ContextMenuController, ContextMenuOutcome, DualModePaletteController,
DualModePaletteEvent, FilePickerController, FilePickerEvent, FilePickerMode, FocusGroup,
FocusRing, FolderPickerController, FolderPickerEvent, FormController, FormControllerEvent,
GroupLayout, HelpAction, HelpNote, HelpOverlayController, HelpOverlayEvent, HelpRegistry,
MenuDef, MenuEvent, MenuSystem, MessageDialogController, MessageDialogEvent, NavigationMode,
Pane, PaneDragRect, PaneTab, PanelDefinition, SectionKind, ShellPosition, SidebarEvent,
SidebarPanelBody, SidebarPanelBodyLayout, SidebarPanelChrome, SidebarSectionDef, SidebarSystem,
StatusBarAction, StatusBarInteraction, TabGroupController, TabGroupEvent, TabGroupLayout,
ToastStackController, ToastStackEvent, ToolbarHoverTracker, TreeController,
TreeControllerEvent, ViewHelp, WorkspaceController, WorkspaceDoc, WorkspaceEvent,
WorkspaceLayout, PALETTE_CHROME_ROWS,
};
pub use dispatch::{
dispatch_click, dispatch_mouse_down, dispatch_mouse_drag, dispatch_mouse_up, dispatch_scroll,
text_selection_line_range, DragState, DragTarget, ScrollSurface, SurfaceScrollbar, TextRegion,
};
pub use modal_stack::{ModalEntry, ModalStack};
pub use runner::{AppLogic, Reaction, StepOutcome};
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
#[cfg(test)]
mod tests {
use super::*;
fn package_version(manifest: &str) -> Option<&str> {
manifest
.lines()
.map(str::trim)
.skip_while(|line| *line != "[package]")
.skip(1)
.take_while(|line| !line.starts_with('['))
.find_map(|line| {
let value = line
.strip_prefix("version")?
.trim_start()
.strip_prefix('=')?;
value.trim().strip_prefix('"')?.split('"').next()
})
}
#[test]
fn version_matches_cargo_toml() {
let manifest = include_str!("../Cargo.toml");
let declared = package_version(manifest).expect(
"quadraui/Cargo.toml should have a `version = \"...\"` key in its \
`[package]` table",
);
assert_eq!(
VERSION, declared,
"CARGO_PKG_VERSION ({VERSION}) disagrees with quadraui/Cargo.toml's \
[package] version ({declared}) — either the build is reading a stale \
manifest, or this test's parser no longer matches the manifest layout."
);
}
#[test]
fn package_version_parser_ignores_other_tables() {
let manifest = "\
[package]\n\
name = \"quadraui\"\n\
version = \"1.2.3\"\n\
rust-version = \"1.97.1\"\n\
\n\
[dependencies.serde]\n\
version = \"9.9.9\"\n";
assert_eq!(package_version(manifest), Some("1.2.3"));
}
#[test]
fn package_version_parser_reports_a_missing_key() {
assert_eq!(package_version("[package]\nname = \"quadraui\"\n"), None);
assert_eq!(package_version("[dependencies]\nversion = \"1.0\"\n"), None);
}
fn declared_rust_version(manifest: &str) -> Option<&str> {
manifest.lines().map(str::trim).find_map(|line| {
let value = line
.strip_prefix("rust-version")?
.trim_start()
.strip_prefix('=')?
.trim();
let inner = value.strip_prefix('"')?.strip_suffix('"')?;
let mut parts = inner.split('.');
let major = parts.next()?;
let minor = parts.next()?;
let patch = parts.next();
if parts.next().is_some() {
return None;
}
let is_digits = |s: &str| !s.is_empty() && s.chars().all(|c| c.is_ascii_digit());
if !is_digits(major) || !is_digits(minor) {
return None;
}
if let Some(p) = patch {
if !is_digits(p) {
return None;
}
}
Some(inner)
})
}
#[test]
fn rust_version_parses_in_the_shape_the_msrv_job_expects() {
let manifest = include_str!("../Cargo.toml");
assert!(
declared_rust_version(manifest).is_some(),
"quadraui/Cargo.toml's rust-version line is missing, or not in \
the exact `rust-version = \"X.Y\"` / `rust-version = \"X.Y.Z\"` \
shape `.github/workflows/ci.yml`'s `msrv` job parses with `sed`. \
Fix the field's shape, and update that job's parser to match if \
the shape itself is deliberately changing.",
);
}
#[test]
fn declared_rust_version_rejects_malformed_shapes() {
assert_eq!(declared_rust_version("rust-version = \"1\"\n"), None);
assert_eq!(declared_rust_version("rust-version = \"1.92.0.1\"\n"), None);
assert_eq!(declared_rust_version("rust-version = \"x.y\"\n"), None);
assert_eq!(
declared_rust_version("rust-version = \"1.92.0\" # trailing\n"),
None
);
assert_eq!(declared_rust_version("name = \"quadraui\"\n"), None);
assert_eq!(
declared_rust_version("rust-version = \"1.92\"\n"),
Some("1.92")
);
assert_eq!(
declared_rust_version("rust-version = \"1.92.0\"\n"),
Some("1.92.0")
);
}
}