Skip to main content

teksilo_widgets/
lib.rs

1#![allow(
2// SPDX-License-Identifier: MPL-2.0
3// SPDX-FileCopyrightText: 2026 FernTech
4
5    clippy::type_complexity,
6    clippy::too_many_arguments,
7    clippy::collapsible_if,
8    clippy::manual_find,
9    clippy::redundant_guards,
10    clippy::needless_range_loop,
11    clippy::explicit_counter_loop,
12    clippy::if_same_then_else,
13    dead_code
14)]
15
16#[cfg(test)]
17pub(crate) mod a11y_set_semantics;
18pub mod accordion;
19pub mod animations;
20pub mod avatar;
21pub mod badge;
22pub mod banner;
23pub mod breadcrumb;
24pub mod button;
25pub mod calendar;
26pub mod card;
27pub mod checkbox;
28pub mod code_editor;
29pub use code_editor::{
30    BracketPair, COMMON_BRACKETS, CodeConfig, CodeEditor, CodeEditorHandle, CompletionContext,
31    CompletionItem, CompletionKind, IndentStyle, LogView, LogViewHandle, PlainTextEditor,
32};
33pub mod color_edit;
34pub mod color_picker;
35pub mod combo_box;
36pub mod command_link_button;
37pub mod command_palette;
38pub mod common;
39pub(crate) mod data_views;
40pub mod date_edit;
41pub mod date_range_edit;
42pub mod date_time_edit;
43pub mod dialog;
44pub mod docking;
45pub use data_views::{ActivateOn, DragTransferMode, RowDragData, ViewId};
46pub(crate) mod drag_preview;
47pub mod drop_target;
48pub mod drop_zone;
49pub mod file_picker_field;
50pub mod focus_scope;
51pub mod font_picker;
52pub mod grid_view;
53pub mod group_box;
54pub mod group_header;
55pub mod hex_color_input;
56pub mod icon_button;
57pub mod input_dialog;
58pub mod keystroke_format;
59pub mod language_switcher;
60pub mod link;
61pub(crate) mod list_item_a11y;
62pub(crate) mod list_source;
63pub mod list_view;
64pub mod menu;
65pub mod menu_bar;
66pub(crate) mod menu_context;
67pub mod menu_item;
68pub mod menu_list;
69pub mod message_box;
70pub mod notification;
71pub mod overlay_trigger;
72pub mod panel;
73pub mod password_field;
74pub(crate) mod popover_caret;
75pub mod popover_surface;
76pub mod popover_widget;
77pub mod primitives;
78#[cfg(feature = "telemetry")]
79pub mod privacy_settings;
80pub mod progress_bar;
81pub mod radio_button;
82pub mod radio_group;
83pub mod radio_tile;
84pub mod radio_tile_group;
85pub mod repeater;
86pub mod rich_text;
87pub mod scroll_area;
88pub mod scroll_bar;
89pub mod search_field;
90pub mod segmented_control;
91pub(crate) mod severity_badge;
92pub mod shadow;
93pub mod shortcut_settings;
94pub mod slider;
95pub mod snackbar;
96pub mod spin_box;
97pub mod spinner;
98pub mod split_button;
99pub mod splitter;
100pub mod standard_item;
101pub mod status_bar;
102pub mod stepper;
103pub mod styles;
104pub mod tab_widget;
105pub mod table_view;
106pub mod text_input;
107pub mod text_scale_control;
108pub mod theme_switcher;
109pub mod time_edit;
110pub mod title_bar;
111pub mod toast;
112pub mod toggle;
113pub mod tool_box;
114pub mod toolbar;
115pub mod tooltip;
116pub(crate) mod tree_source;
117pub mod tree_table_view;
118pub mod tree_view;
119
120#[cfg(feature = "preview")]
121mod doc_snippets;
122#[cfg(feature = "preview")]
123mod preview_catalog;
124
125pub use tooltip::TooltipWidget;
126
127pub use accordion::{Accordion, AccordionOrientation};
128pub use animations::{
129    Blur, Collapse, Crossfade, Cycle, Fade, Pulse, Rotate, Scale, ScaleOrigin, Shake, Slide,
130    SlideEdge, SmoothSize, SmoothSizeAxes, Unroll, UnrollFrom,
131};
132pub use avatar::{Avatar, AvatarCorner, AvatarPresence, AvatarShape, AvatarSize};
133pub use badge::Badge;
134pub use banner::{Banner, BannerSeverity};
135pub use breadcrumb::{Breadcrumb, BreadcrumbItem};
136pub use button::{Button, ButtonVariant, IconLocation};
137pub use calendar::{Calendar, DateRange, WeekNumberDisplay};
138pub use card::Card;
139pub use checkbox::Checkbox;
140pub use color_edit::ColorEdit;
141pub use color_picker::{ColorPicker, ColorPickerLayout, ColorSwatch, DEFAULT_SWATCHES};
142pub use combo_box::ComboBox;
143pub use command_link_button::CommandLinkButton;
144pub use command_palette::{CommandPalette, PaletteCommand};
145pub use common::scroll::OverscrollBehavior;
146pub use date_edit::DateEdit;
147pub use date_range_edit::DateRangeEdit;
148pub use date_time_edit::DateTimeEdit;
149pub use dialog::{Dialog, DialogContent, ModalContainer, ModalScrim};
150pub use docking::{
151    CornerOwners, DockAction, DockActionId, DockActionPlacement, DockCorner, DockLayoutState,
152    DockOpenLocation, DockOpenMode, DockPolicy, DockRail, DockRailItemSize, DockRailSlot, DockSide,
153    DockTabDisplay, DockTabId, DockWidget, DockWidgetId, DockingLayout, DockingModel,
154    TabPresentation,
155};
156pub use drop_target::{DropRegionSpec, DropTarget};
157pub use drop_zone::DropZone;
158pub use file_picker_field::{FilePickerField, FilePickerKind};
159pub use focus_scope::FocusScope;
160pub use font_picker::{FontMeta, FontPicker, FontPreviewMode, FontSpacingFilter};
161pub use teksilo_core::styles::{
162    DropRegion, DropRegionSet, DropTargetDragState, DropTargetStyle, DropTargetStyleConfig,
163    DropTargetVariant, RadioTileStyle, RadioTileStyleConfig, RadioTileVariant,
164    SharedDropTargetStyle, SharedRadioTileStyle, TabIndicatorPosition,
165};
166pub use teksilo_data::CheckState;
167// Re-export the policy enum alongside the widget so consumers need a single
168// `use teksilo::widgets::{FocusScope, TraversalScopePolicy}`.
169pub use grid_view::{
170    GridSectionProvider, GridSizing, GridTabTraversal, GridView, GroupingSections, ScrollAnchor,
171    TileContext, grouping_sections,
172};
173pub use group_box::GroupBox;
174pub use group_header::GroupHeader;
175pub use hex_color_input::HexColorInput;
176pub use icon_button::{BuiltInIcons, IconButton, IconButtonSize};
177pub use input_dialog::InputDialog;
178pub use language_switcher::LanguageSwitcher;
179pub use link::Link;
180pub use list_view::ListView;
181pub use menu::{
182    MenuEntry, MenuItemState, MenuItems, MenuModel, MenuNode, NativeMenuMode, StandardMenu,
183    StandardMenuRole,
184};
185pub use menu_bar::{CollapsePolicy, MenuBar};
186pub use menu_item::MenuItem;
187pub use menu_list::{MenuList, MenuSeparator};
188pub use message_box::{
189    ButtonRole, EventContextMessageBoxExt, MessageBox, MessageBoxButton, MessageBoxButtons,
190    MessageBoxResult, MessageBoxSeverity, StandardButton,
191};
192pub use notification::{
193    ARCHIVE_FILE_NAME, ArchivedAction, ArchivedActionStyle, DEFAULT_ARCHIVE_LIMIT,
194    NotificationArchive, NotificationArchiveModel, NotificationCenterButton, NotificationEntry,
195    NotificationLog, NotificationLogDialog, NotificationUpdate,
196};
197pub use overlay_trigger::OverlayTrigger;
198pub use panel::Panel;
199pub use password_field::{AtRevealPolicy, EchoMode, PasswordField, RevealMode};
200pub use popover_surface::PopoverSurface;
201pub use popover_widget::{
202    PopoverButton, PopoverCustom, PopoverIconButton, PopoverTrigger, PopoverWidget,
203};
204pub use primitives::text_input_field::{InputPurpose, ValidationFeedback, ValidationOutcome};
205pub use primitives::{
206    AspectRatio, Center, ColumnFlow, DeadZone, Divider, Expand, FixedSize, FormLayout, Grid,
207    HStack, IconWidget, ImageFit, ImageWidget, MasonryLayout, MaxSize, MinSize, Padding,
208    RectWidget, Shrinkable, Spacer, Switcher, TextWidget, TrackSize, VStack, Wrap, ZStack,
209};
210pub use primitives::{TextFieldHandle, TextInputField};
211#[cfg(feature = "telemetry")]
212pub use privacy_settings::PrivacySettings;
213pub use progress_bar::ProgressBar;
214pub use radio_button::RadioButton;
215pub use radio_group::RadioGroup;
216pub use radio_tile::{RadioTile, RadioTileIndicatorSide};
217pub use radio_tile_group::{RadioTileGroup, TileLayout};
218pub use repeater::Repeater;
219pub use scroll_area::{ScrollArea, ScrollBarMode, ScrollBarPolicy};
220pub use scroll_bar::{ScrollBar, ScrollBarOrientation};
221pub use search_field::SearchField;
222pub use segmented_control::{
223    Segment, SegmentDisplay, SegmentId, SegmentOverflow, SegmentSizing, SegmentedControl,
224};
225pub use shortcut_settings::ShortcutSettings;
226pub use slider::Slider;
227pub use snackbar::Snackbar;
228pub use spin_box::{
229    ButtonLayout as SpinButtonLayout, SpinBox, SpinValue, StepType, WheelMode, WrapMode,
230};
231pub use spinner::Spinner;
232pub use split_button::SplitButton;
233pub use splitter::{
234    PaneDescriptor, PaneSnapshot, PaneState, Splitter, SplitterModel, SplitterState,
235};
236pub use teksilo_core::focus::TraversalScopePolicy;
237// `Splitter`'s public API takes an `Orientation`; re-export it so callers
238// don't need a separate `teksilo_tokens` import.
239pub use standard_item::{StandardListItem, StandardTreeItem};
240pub use status_bar::StatusBar;
241pub use stepper::{
242    ChromePosition, Step, StepStatus, Stepper, StepperController, StepperOrientation, Wizard,
243};
244pub use tab_widget::{
245    ContextMenuFactory, IconFactory as TabIconFactory, STATIC_KIND, StaticContentFactory, TabBar,
246    TabBarOrientation, TabBarVisibility, TabDelegate, TabDisplayMode, TabHandle, TabId, TabInfo,
247    TabOverflowButton, TabSizing, TabWidget,
248};
249pub use table_view::{
250    Alignment as TableAlignment, CellContext, CellSelectionModel, Column, ColumnContext,
251    ColumnResizePolicy, ColumnWidth, EditTriggers, GridLines, PinnedSide, SortDirection,
252    TabTraversal, TableSelectionMode, TableView, TruncationPolicy,
253};
254pub use teksilo_tokens::Orientation;
255pub use text_input::{TextInput, ValidationState};
256pub use text_scale_control::TextScaleControl;
257pub use theme_switcher::ThemeSwitcher;
258pub use time_edit::{SecondsMode, TimeEdit, TimeFormat};
259pub use title_bar::{DragRegion, ResizeStrip, TitleBar, WindowControls, WindowFrame};
260pub use toast::{
261    EventContextToastExt, Toast, ToastAction, ToastActionStyle, ToastAudience, ToastDismissCause,
262    ToastHandle, ToastHost, ToastInstallOptions, ToastPriority, ToastRegistry, ToastRoute,
263    ToastSeverity, ToastSurface,
264};
265pub use toggle::Toggle;
266pub use tool_box::{ToolBox, ToolBoxItem, ToolBoxOrientation};
267pub use toolbar::{Toolbar, ToolbarAction, ToolbarItem, ToolbarOrientation, ToolbarOverflow};
268pub use tree_source::{TreeRow, TreeRowMeta};
269pub use tree_table_view::TreeTableView;
270pub use tree_view::{TreeRowContext, TreeView};
271
272/// The framework bundle: teksilo-widgets' own translatable strings, grouped
273/// by locale. Registered by applications via
274/// `I18nConfig::framework_locales(teksilo_widgets::framework_locales())`
275/// at startup.
276///
277/// teksilo-widgets ships `en-US` (the source language) plus 22
278/// translations. Keys missing from a locale's bundle fall back to the en-US
279/// source via `I18nManager::resolve_widget`'s fallback chain, so a partial
280/// translation degrades key-by-key rather than wholesale. Applications that
281/// need a locale teksilo-widgets doesn't ship — or that disagree with a
282/// shipped rendering — can fill the gap with
283/// `I18nConfig::override_widget_strings(...)`, which wins over this bundle.
284///
285/// `ar-SA` and `he-IL` are right-to-left; the layout flip is derived from the
286/// language tag by `teksilo_i18n::rtl_from_locale`, not from anything in the
287/// `.ftl` files themselves.
288///
289/// Every translation carries exactly the same message keys and the same
290/// `{ $variable }` placeables as `en-US.ftl`; `locale_parity` in
291/// `crates/teksilo-widgets/tests/locale_parity.rs` enforces that.
292pub fn framework_locales() -> &'static [(&'static str, &'static [&'static str])] {
293    &[
294        ("en-US", &[include_str!("../locales/en-US.ftl")]), // source language
295        ("ar-SA", &[include_str!("../locales/ar-SA.ftl")]), // Arabic (RTL)
296        ("cs-CZ", &[include_str!("../locales/cs-CZ.ftl")]), // Czech
297        ("da-DK", &[include_str!("../locales/da-DK.ftl")]), // Danish
298        ("de-DE", &[include_str!("../locales/de-DE.ftl")]), // German
299        ("el-GR", &[include_str!("../locales/el-GR.ftl")]), // Greek
300        ("es-ES", &[include_str!("../locales/es-ES.ftl")]), // Spanish
301        ("fi-FI", &[include_str!("../locales/fi-FI.ftl")]), // Finnish
302        ("fr-FR", &[include_str!("../locales/fr-FR.ftl")]), // French
303        ("he-IL", &[include_str!("../locales/he-IL.ftl")]), // Hebrew (RTL)
304        ("hu-HU", &[include_str!("../locales/hu-HU.ftl")]), // Hungarian
305        ("it-IT", &[include_str!("../locales/it-IT.ftl")]), // Italian
306        ("ja-JP", &[include_str!("../locales/ja-JP.ftl")]), // Japanese
307        ("ko-KR", &[include_str!("../locales/ko-KR.ftl")]), // Korean
308        ("nb-NO", &[include_str!("../locales/nb-NO.ftl")]), // Norwegian Bokmål
309        ("nl-NL", &[include_str!("../locales/nl-NL.ftl")]), // Dutch
310        ("pl-PL", &[include_str!("../locales/pl-PL.ftl")]), // Polish
311        ("pt-PT", &[include_str!("../locales/pt-PT.ftl")]), // Portuguese (European)
312        ("ro-RO", &[include_str!("../locales/ro-RO.ftl")]), // Romanian
313        ("ru-RU", &[include_str!("../locales/ru-RU.ftl")]), // Russian
314        ("sv-SE", &[include_str!("../locales/sv-SE.ftl")]), // Swedish
315        ("tr-TR", &[include_str!("../locales/tr-TR.ftl")]), // Turkish
316        ("uk-UA", &[include_str!("../locales/uk-UA.ftl")]), // Ukrainian
317    ]
318}
319
320#[cfg(test)]
321mod layout_integration_tests;