Teksilo Widget Catalog
A categorized index of every widget that ships in the workspace. One line
per widget; the source link is the authoritative reference. For full
public API surfaces (struct, builder methods, enums, module doc) of one
or more widgets, run python3 tools/extract_widget_api.py <Widget…>
or --all for everything.
For per-subsystem docs (data binding, accessibility overrides, animation, drag-and-drop, multi-window, settings, i18n, theming, shortcuts/intents/actions), see SUMMARY.md.
Styling status
All 42 themable widgets are on the four-tier styling system
(docs/styling-system.md): each ships a *Style
trait in teksilo-core::styles::* plus a default Recipe*Style impl in
teksilo-widgets/src/styles/*. The widget builds its parts, hands a
*StyleConfig to the active style, and uses the returned WidgetId
as its root child, no themable widget self-paints. Style resolution
is per-call .style(impl FooStyle) → theme-wide
theme.style_slots.<slot> → recipe default.
| Widget | Variant enum | Style trait | Slot |
|---|---|---|---|
Toggle | ToggleVariant (Switch/Pill/Square/Inset) | ToggleStyle | style_slots.toggle |
Button | ButtonVariant (Filled/Tinted/Outlined/Plain/Ghost/Link/Destructive) | ButtonStyle | style_slots.button |
Checkbox | CheckboxVariant (Square/Rounded/Circle) | CheckboxStyle | style_slots.checkbox |
RadioButton | RadioVariant (Circle/Square/Rounded) | RadioStyle | style_slots.radio |
RadioTile | RadioTileVariant (Outlined/Elevated/Filled) | RadioTileStyle | style_slots.radio_tile |
IconButton | IconButtonSize (Compact/Default/Toolbar/Large/Hero) | IconButtonStyle | style_slots.icon_button |
Panel | PanelVariant (Plain/Sunken/Raised/Highlighted) | PanelStyle | style_slots.panel |
Card | CardVariant (Plain/Elevated/Outlined/Filled) | CardStyle | style_slots.card |
TooltipWidget | , | TooltipStyle | style_slots.tooltip |
MenuItem | , | MenuItemStyle | style_slots.menu_item |
StandardListItem / StandardTreeItem | , | StandardItemStyle | style_slots.standard_item |
Popover | PopoverVariant (Default/Menu/Tooltip), surface | PopoverStyle | style_slots.popover |
ScrollBar | ScrollBarVariant (Permanent/Overlay/Thin) + ScrollBarOrientation | ScrollBarStyle | style_slots.scroll_bar |
TabBar | , (carries TabBarOrientation) | TabStyle | style_slots.tab |
ComboBox | ComboBoxVariant (Outlined/Filled/Underline/Plain) | ComboBoxStyle | style_slots.combo_box |
Slider | SliderVariant (Continuous/Discrete/Range) + SliderOrientation | SliderStyle | style_slots.slider |
TextInput | TextInputVariant (Outlined/Filled/Underline/Bare) | TextInputStyle | style_slots.text_input |
The 17 legacy per-widget dimension structs in teksilo-tokens::components
were deleted; their IntUI constants now live in the matching
teksilo-widgets/src/styles/recipe_*_style.rs modules. The dimension
data for non-themable widgets (toolbar, status bar, dialog, accordion,
badge, progress bar, table, …) lives directly in those same
recipe_*_style.rs modules as pub const blocks. Four sibling preset
crates ship, Material 3 (theme-material3), Fluent / Windows 11
(theme-fluent), macOS Aqua (theme-macos) and KDE Plasma's Breeze
(theme-kde). Image-backed styles, the ImageTheme TOML loader, and a
GTK4-Adwaita preset are still pending.
End-to-end demo of the slot bag + per-call override: see
examples/theme_styles/.
Layout primitives: crates/teksilo-widgets/src/primitives/
The composable building blocks of every widget tree. See layout-primitives.md for the layout protocol, slack distribution math, and worked examples.
- HStack, horizontal stack with cross-axis alignment, spacing, and slack distribution.
- VStack, vertical stack; same model.
- ZStack, overlay stack at a shared origin with two-axis alignment.
- Grid, fixed/fr/auto track grid (
TrackSize); explicit cell placement. - Wrap, flow layout that wraps to new rows when out of width.
- MasonryLayout, variable-height grid packing into the shortest column (Pinterest-style).
- ColumnFlow, newspaper columns whose count follows the available width: drops a column and re-partitions every child as the width shrinks. Contiguous source-order runs, so reading and focus order stay correct at every count;
min/max_column_width,max_columns,column_rule, opt-insemantic_list, reactivecolumn_count_signal(). Pair with aScrollAreafor vertical overflow. - FormLayout, labelled rows with column alignment for settings panels.
- Center, centers a single child within the space it is given (fills a bounded axis, shrink-wraps an open one;
flex = 0, so it does not claim stack slack, wrap inExpandfor that). - Expand, flex-basis-zero workhorse for ratio splits and full-bleed children.
- Shrinkable, shrink counterpart to
Expand: opts a child into compression (down to aminfloor) when a stack is over-constrained. Native shrink covers single-line / ellipsis text; controls (Buttonetc.) stay rigid and overflow viaToolbar. - Padding, uniform or per-edge inset around a single child (propagates flex/shrink/min).
- Spacer, flexible empty space that consumes slack via
flex = 1.0. - Divider, 1 dp themed line, horizontal or vertical.
- FixedSize, pins width/height regardless of parent proposal.
- MinSize, clamps response to a floor (touch-target enforcement, etc.).
- MaxSize, clamps response to a ceiling.
- AspectRatio, constrains a child to a fixed width-to-height ratio.
- Switcher, shows one of N children, driven by
Signal<usize>. - DeadZone, layout-transparent gesture dead zone: a press inside it never arms a drag/swipe on an ancestor. Wrap interactive controls (buttons, a
⋮menu) inside a draggable/swipeable container (a dock-panel header, a card, a list row) so clicking them, even with click jitter, can't start the ancestor's drag. The framework counterpart of Electron's-webkit-app-region: no-drag; backed by the node-levelgesture_dead_zoneflag (robust by construction, not a recognizer-timing race). - FocusScope, layout-transparent Tab traversal boundary (lives at crate root). Scopes its descendants'
tab_indexso sibling regions don't interleave, and traps or passes Tab viaTraversalScopePolicy::{Cycle, Continue}. See events-and-gestures.md §6.1. - TouchTarget, the last-resort hit-targeting mechanism: grows the layout around an undersized control to a conforming touch target, siblings reflowing, and only at
TargetDensity::Touch. Use only whenWidget::hit_outset(a thin grip claiming space, hit-only) and the miss-only slop pass (an isolated near-miss catch, also hit-only) aren't enough because a neighboring target leaves no space to borrow. See density-and-targets.md.
Visual primitives
Direct draw surfaces with no internal composition.
- RectWidget, themed rectangle (background, border, corner radius); reactive bindings.
- TextWidget, single-line text via the
TextBackend; reactive content + color. - IconWidget, vector icon rendered through the path atlas;
IconModefor tinted vs. raw. - ImageWidget, bitmap with
ImageFit(fill / contain / cover / none / scale-down). - LiveImage, a picture another thread rewrites many times a second (a VM screen, a video frame, a camera preview), fed through a
LiveImageSource: a commit repaints nothing, and the window uploads what changed; windows on one GPU upload a commit once. A producer that hands over whole frames writes through aLiveImageDiffWriter, which commits only what changed.LiveImageSizing,ImageFit, orientation,scaling(Trilinearbuilds a mip chain for thumbnails), device-pixel snapping, a placeholder while not live,pause_when_inactive,dim_when_disabled, and aLiveImageHandlethat maps widget points to source pixels. - ImageMask, CPU-side anti-aliased alpha mask (
ImageMaskShape); used by Avatar and other shaped-image patterns. - ValidationStrip, inline error/warning/success strip under a field.
- TextInputField, primitive single-line editable text used inside the higher-level field widgets.
- TwistArrow, small chevron that indicates and toggles a tree node's expansion (used by
TreeView/TreeTableView).
Containers and chrome
Themed framing, sectioning, and window-level structure.
- Panel, themed background + border + corner radius + padding.
- Card, elevated panel with shadow and optional header/footer slots.
- GroupBox, labelled bordered group for related controls.
- GroupHeader, section header (label + trailing rule line) for settings forms.
- Toolbar, command bar (
ToolbarAction/ToolbarItem) with automatic overflow: excess actions collapse into a⌄MenuListpopover (Qt extension / NSToolbar overflow / WinUI CommandBar). Per-action overflow priority,always_overflow, toggle, pinned custom widgets, collapsible custom widgets (overflow_asmenu row /overflow_widgetlive embedded control / theToolbarOverflowtrait), separators, flexible space, display mode, orientation,is_overflowing(). Full ARIA toolbar a11y (Role::Toolbar + orientation, roving tab-index + arrow nav, chevronHasPopup::Menu, no AT duplication of overflowed items). Built onLayoutContext::measure_intrinsic. Reference: docs/widgets/toolbar.md. - StatusBar, bottom-of-window status text strip with
Role::Status. - Banner, persistent inline info / success / warning / error strip (
BannerSeverity);Role::Status+Live::Polite. - DropZone, standalone "drop files here" target for external (OS) drag-and-drop;
accept_extensionsfilter,allow_multiple,on_files_dropped/on_text_dropped/on_urls_dropped, keyboard Browse fallback; Tier-3DropZoneStyle,Role::Group+Live::Polite. See drag-and-drop.md §11.4. - DropTarget, wrapping drop container: turns any child into a drop target without hiding it (the child stays fully visible; the highlight is a border, not a fill). Reacts to internal (typed
DragPayload) and external drops; optional centered hint popup;accept_external_*/accept_typed::<T>/accept_whenfilters,on_drop/on_drop_typed::<T>,targeted_signal(SwiftUIisTargetedpattern); Tier-3DropTargetStyle,Role::Group. See drag-and-drop.md §11.6. - Accordion, vertically stacked collapsible sections, multiple-open allowed.
- ToolBox, vertically stacked collapsible pages, exactly one expanded (Qt
QToolBoxanalog). - ScrollArea, viewport with overlay or permanent scrollbars (
ScrollBarMode,ScrollBarPolicy). - ScrollBar, standalone scrollbar, drag/track-click/keyboard.
- Splitter, N-pane resizable splitter with draggable, collapsible dividers, per-pane stretch, and a serializable
SplitterModel. See docs/widgets/splitter.md. - DockingLayout, VS Code-style dockable layout: a centre slot + 4 collapsible/splittable/draggable side regions (leading/trailing/top/bottom), per-corner ownership, activity rail, drag-to-dock five-zone overlay, and a serializable
DockingModel. See docs/widgets/docking.md. - TabWidget, tab bar + content switcher; data-source-driven
TabBar<T>underneath. See tab-widget.md. - Stepper, embeddable step-flow widget (Material / Ant / Flutter "stepper"): horizontal or vertical, linear or non-linear, per-step completion state.
- Wizard, thin modal launcher built on
Stepper: a multi-step flow with header, footer, and step switching. - Breadcrumb, clickable path segments with chevron separators (
BreadcrumbItem). Automatic overflow: when too narrow the middle crumbs collapse into a trailing-of-root…MenuListdropdown (Windows Explorer / web breadcrumb pattern) while the root + current crumb stay;is_overflowing()signal. RTL-aware separators (chevron mirrors). Built onmeasure_intrinsic+MenuList::item_when. - TitleBar, custom window title bar with drag region, resize strip, and window controls. See title-bar.md.
Buttons
- Button, seven
ButtonVariants (Filled / Tinted / Outlined / Plain / Ghost / Link / Destructive) × five interaction states;IconLocationfor leading/trailing icon; chrome via theButtonStyletrait (see Styling status above). Reference exemplar, read the source. - IconButton, square icon-only button at five
IconButtonSizesteps (Compact / Default / Toolbar / Large / Hero)..embedded()mode for trailing-slot use inside fields. IncludesBuiltInIconsfactory. - CommandLinkButton, large two-line CTA: leading icon + bold title + secondary description; flat surface.
- PopoverButton, Button preset that opens a Popover when activated (
type PopoverButton = PopoverWidget<Button>). - PopoverIconButton, IconButton variant of the same (
type PopoverIconButton = PopoverWidget<IconButton>). - OverlayTrigger, wraps an arbitrary non-button widget (a table-header filter glyph, a tag chip) so it can drive a
PopoverWidget: supplies the activate route,has_popup/expandeda11y annotations, and the arenaenabledgate thatPopoverButton/PopoverIconButtonget fromButton/IconButton. - SplitButton, main action region + chevron region that opens a related-actions menu.
Inputs and indicators
- Checkbox, two-state and tristate (
CheckState). - RadioButton, single radio, bound to a shared value via RadioGroup for mutual exclusion.
- RadioTile / RadioTileGroup, "selectable card" radios: icon + title + inline radio + wrapping description. N-ary group with
TileLayout::{Row, Grid, Column, Vertical}(equal-size cards, adaptive wrapping grid, or a compact settings list with trailing meta), a WAI-ARIA roving radiogroup keyboard, andRole::RadioGroup+ per-tileRole::RadioButton. - Toggle, on/off control; four
ToggleVariants (Switch / Pill / Square / Inset) via theToggleStyletrait. - Slider, horizontal or vertical, optional stepping. Arrows move one
step(1 % of the range by default),PageUp/PageDownonepage_step(ten times that, so 10 % of the range,QAbstractSlider::pageStep,GtkScaleand<input type=range>all agree),Home/Endthe bounds; both distances are published to assistive technology andAction::SetValueis serviced..value_tooltip(|v| ..)shows the value as text by the thumb ("-3.0 dB") while the slider is hovered, dragged or focused from the keyboard, following the thumb as it moves, and publishes the same text as the accessible value;.default_value(v)resets tovon a double-click or through a "Reset to default" accessibility action. See range-keyboard.md. - SegmentedControl, segmented chooser keyed by
SegmentId(so a contributed segment can't re-point the selection); segments that don't fit overflow into a chevron menu, with the selected one always visible;RadioGroupAT role. See segmented-control.md. - ComboBox, selection-only dropdown; virtualized via
ListViewpastmax_visible_items. - FontPicker, lists/searches/filters all installed fonts with per-row in-font samples; spacing + writing-system filters (off-thread coverage index). See font-picker.md.
- ProgressBar, determinate or indeterminate; linear.
- Spinner, circular-arc loading indicator on the shader-driven
AnimatedQuadKind::SpinnerArcpipeline; honoursprefers-reduced-motion. - Link, typographic hyperlink with hover and visited states.
- Badge, passive count/label pill.
- Avatar, user identity (image / initials fallback / hash-derived tint); circular / rounded-square / square shapes; presence indicator with corner positioning.
Text input family
- TextInput, styled single-line input on top of
TextInputField;ValidationState. - RichTextEditor, full editing surface with IME, formatting commands, undo/redo, intrinsic-mode sizing (
min_lines/max_lines); also runs read-only as the rich-text viewer (ScrollPolicy). - CodeEditor / PlainTextEditor, multi-line source / plain-text editors over one core: gutter, current-line band, injected language-agnostic indentation / comment / bracket handling, multiple carets, caret-anchored completion, paragraph/run accessibility. See docs/code-editor.md.
- LogView, read-only, append-only, tail-following streaming view scaling to 100k+ lines via windowed layout; derived follow-tail, scrollback cap, injected per-line severity colour, windowed accessibility. See docs/log-view.md.
- SpinBox, numeric input with
WrapMode,StepType,ButtonLayout,WheelMode,WidthPolicy. - SearchField, TextInput preset with leading magnifier glyph and clear-X;
Role::SearchInput. - PasswordField, secure entry with an embedded reveal toggle, character masking, Caps Lock warning, and clipboard protection.
EchoMode(Masked / NoEcho / RevealWhileTyping),RevealMode(Toggle / Hold / None),AtRevealPolicy(SwapRole / AlwaysProtected). Masks at the text-engine layer (Role::PasswordInput; plaintext never reaches the shaper, glyph atlas, or AT value while masked). On Linux the keys typed into it reach the AT-SPI registry without their characters (keycode and modifiers only; seeteksilo_platform::key_report). Demo:cargo run -p password-field. - FilePickerField, TextInput + Browse button wired to the native file dialog;
FilePickerKind::OpenFile / PickFolder / SaveFile. - InputDialog, single-field input modal: title + prompt + TextInput + Cancel/OK;
on_resultdeliversSome(value)/None.
Date and time
- Calendar, month grid with WAI-ARIA grid keyboard pattern;
CalendarMode::Single/Range(DateRange);WeekNumberDisplaytoggle. Locale-derived first day of week and format pattern. - DateEdit, date input with trailing calendar-icon trigger;
WidthPolicy,ValidationBehavior. - TimeEdit, time input;
TimeFormat,SecondsMode. - DateTimeEdit, combined date + time input.
- DateRangeEdit, two-date range input.
Color
- HexColorInput, hex code text input with live swatch.
- ColorEdit, compact color editor with swatch trigger.
- ColorPicker, full HSV picker;
ColorPickerLayoutcontrols panel arrangement. - ColorSwatch, single clickable color cell (
Role::ColorWell) for composing custom swatch rows/palettes outside the bundled grid;Prop<Color>-bound so it can track a live preview.
Menus
-
MenuBar, top-of-window menu strip; widget-based on Windows/Linux. On macOS it mirrors a declarative
MenuModelinto the systemNSMenu,MenuBar::from_model(..).native_on_macos(..)+install_native_menu(), see native-menu.md (on-device validation pending).MenuBar::buildinstalls anRc<dyn MenubarDispatcher>intoWindowStateon every platform so the framework can intercept F10,Alt+<letter>, and bare-Alt-tap before focus-based key dispatch, matching Win32'sWM_SYSKEYDOWNsemantics. ReturnsMenubarAction::{OpenMenu, FocusTrigger, Intercept}. Alt-tap is detected on theWindowState::alt_downfalling edge withother_key_pressed_during_alt == false. Mnemonic-derived chords NEVER enterShortcutRegistry, by constructionShortcutSettingscannot list them, which is the correct behaviour (mnemonics are derived from labels, change with locale, and are not user-rebindable per Win32 / GNOME HIG).macOS-specific behaviour: the dispatcher's
Alt+<letter>branch is compiled out on macOS because the OS rewrites Option+letter into accented characters (Option+E → ´, Option+F → ƒ) before winit hands the keystroke to the app, the chord can never match the mnemonic table, and intercepting would silently break accented text input. F10, bare-Alt-tap → focus menubar, and bare-letter activation inside an open menu all continue to work on macOS (none involves a transformed letter key). Mnemonic underlines are also hidden on macOS viacfg!(target_os = "macos")inMenuLabel::paintso the UI doesn't promise a chord that won't fire. Use F10 + arrows + Enter for keyboard menu navigation, and the existingShortcutsystem for Cmd+? accelerators. -
MenuList, overlay menu panel; accepts arbitrary
impl Widgetchildren.MenuSeparatorfor inline rules. Full keyboard suite: ArrowUp/Down + wrap,Home/End, Enter/Space activates the focused item, ArrowRight opens submenus, ArrowLeft/Esc bubble. Type-ahead with 500 ms default reset (.type_ahead_timeout(d)override), ASCII case-fold, separators skipped. In-menu mnemonic activation: bare letter (no modifiers) inside an open menu activates the item whose&-marker matches; mnemonic wins over type-ahead when both could fire. Surface:.inset(dp)sets the gap between the surface and its rows (default 4 dp; themax_visible_itemsscroll cap follows it), and.surface_style(style)gives one list its ownPopoverStyleahead of the theme's popover slot (which aComboBoxdropdown shares). -
MenuItem, keyboard-highlightable menu row with
for_shortcut(id)for live-rebinding labels. Three modes via builder methods:.checked(Signal<bool>)→Role::MenuItemCheckBox, checkmark glyph in the leading slot, click flips the bound signal..check_state(Signal<CheckState>)→ tri-state checkbox; click cycles Unchecked↔Checked (Indeterminate is external-source-only per Windows convention); rendered glyph: check / dash / spacer..radio(value, Signal<usize>)→Role::MenuItemRadio, filled-dot glyph whenselected == value. Radio items in the sameMenuListauto-group viaSignal::sameand announce "2 of N" viapush_to_radio_group.
All four (icon / check / tristate / radio) are mutually exclusive, a
debug_assert!fires if both.icon(...)and a check/radio mode are set. AT state mirrorsCheckboxexactly:set_toggled(bool)for binary,inner_mut().set_toggled(Toggled::Mixed)for Indeterminate. -
Mnemonics use the in-string Windows / Qt
&convention:&Saveunderlines 'S' when Alt is held;&&produces a literal&.MenuLabel(private leaf widget) renders the underline viacanvas.draw_underlinegated onWindowState::alt_down; the AT name strips the&, and the mnemonic letter is written toinner_mut().set_access_key("S")for Windows Narrator. Parser atmnemonic.rs. -
Safe-triangle submenu hover gate: the mechanism lives in
teksilo-core::overlay::safe_triangle, not in the widget, since both a sibling row's hover-switch and the overlay's ownPointerLeavedismissal grace must honour the same region. The trigger arms the region from its hover-leave (ctx.arm_overlay_safe_region(sub_id)); sibling rows read it viactx.pointer_in_overlay_safe_region(content_id). The enclosing MenuList'sSafeTriangleStatenow tracks only which submenu is open. A sibling submenu trigger's hover-switch instead callsctx.show_overlay_after_replacing_siblings(...), which dismisses the open sibling only when the new submenu opens, so a pointer merely crossing the row costs nothing.
Overlays and dialogs
See tooltips.md for the tooltip system.
- TooltipWidget, plain, rich, or composite tooltips (three tiers, per-anchor mutual exclusion); sticky-on-dwell promotion to non-modal
Role::Dialog;TooltipRegistryfor app-wide reuse. Rich tier carries inline markup + shortcut chip + "more" disclosure; composite tier (CompositeTooltipWidget) hosts an arbitrary widget tree (CK3-style: tabbed sections, charts, progress bars). - Popover, anchored overlay accepting arbitrary
impl Widgetcontent; configurable placement, dismissal, optional caret. - CommandPalette, type-to-run access to every registered command. Application-agnostic: its content is the tree's
ShortcutRegistry, so a command becomes searchable just by registering it (bound to a keystroke or not); activating a row sends the same intent a menu row or chord would.CommandPalette::new().present(ctx)shows it near the top of the window, dismissed by Escape or an outside click; a command runs in whatever the palette was opened over. - Dialog, modal dialog frame;
DialogContent/ModalContainerfor content + presentation. - MessageBox, predefined info/warning/error/question modals (
MessageBoxSeverity); semantic-role buttons (ButtonRole,StandardButton,MessageBoxButton,MessageBoxButtons) with platform-aware ordering; result viaMessageBoxResult. - Snackbar, queued auto-dismissing toast with animated slide-in.
- Toast, stackable, action-rich, severity-aware floating notification (
info/success/warning/error/loading); link + button actions;Toast::idupdate-in-place; persistent archive backing; corner-anchored hover-pause stack. The "upgrade path" fromSnackbar. Full reference: widgets/toast.md. - ToastHost, per-window invisible widget owning the toast queue + per-frame timer + hover-pause; mounted by
install_toast. - NotificationLog, archive UI: mark-all-read / clear toolbar + day-bucket section headers (Today / Yesterday / This week / Earlier) + replayable action buttons.
- NotificationCenterButton, bell icon + live unread-count badge + popover containing a
NotificationLog. Marks-all-read on popover open. - NotificationLogDialog, one-liner
::show(archive, ctx)modal preset. - Shadow, drop-shadow primitive used by elevated surfaces (
AttachedSidefor one-sided shadows).
Data-driven widgets
Backed by the teksilo-data reactive collections. See data-models.md for the underlying ListModel<T> / TreeModel<T> / SelectionModel / sort-filter projections. All five (ListView/TreeView/TableView/TreeTableView/GridView) share cross-widget row-drag export machinery, ActivateOn, ViewId, RowDragData<T>, in data_views.rs; see drag-and-drop.md §12.
- Repeater, non-virtualized siblings driven by
ListModel<T>change notifications; for small bounded collections. - ListView, virtualized vertical list for large/unbounded collections. Optional sections (
.sections(provider), the sameSectionProvider/grouping_sectionsasGridView): a full-width header row above each group (.section_header_delegate,.section_header_height), virtualized and counted in the scroll extent in all three row-height modes, with the current group's header pinned at the top by.pinned_section_headers(true). Indices stay item indices everywhere (selection, activation, keyboard, drag and drop); headers areRole::Headingnodes between theRole::ListBoxOptionrows. - GridView, virtualized 2D tile grid (photo-gallery / icon-view / collection-view) bound to
ListModel<T>/ListDataSource. PluggableGridLayoutStrategy:UniformGrid(fixed size / fixed column count / adaptive min-width),VariableRowGrid(rows sized to tallest tile, auto-measure + scroll-anchoring or exact.item_height),VirtualizedMasonry(Pinterest waterfall). FlatSelectionModel(Single/Multi) with click/Ctrl/Shift + rubber-band marquee, full 2D keyboard nav (arrows / Home-End / PageUp-Down / type-ahead / Alt+Arrow reorder), drag-to-reorder routed through the source'sdrag/can_accept/accept_drop(+on_item_dropescape hatch for foreign payloads), per-tile activation + context menu, sections (grouping_sections) with sticky pinned headers, empty/loading states, source-driven lazy loading (request_window+can_fetch_more/fetch_more+ placeholder rows), andRole::Grid > Role::GridCellaccessibility. See grid-view.md; democargo run -p grid-view. - TreeView, hierarchical list with twist-arrow expand/collapse. The 4-arg
new_with_contextvariant passes aTreeRowContextcarrying a one-linetoggle_callback()for chevron wiring. - StandardListItem, canonical row layout for
ListViewdelegates:[checkbox?] [leading_slot?] [center_slot?] [label] [Spacer] [trailing_slot?], plus an optional subtitle line with its own[subtitle_leading_slot?] [subtitle] [Spacer] [subtitle_trailing_slot?]. Selection / hover / pressed background routes throughSurfaceRole::Selected/AccentSubtle/Pressed(theme-driven, roundeditem_corner_radius: 8.0, mirrorsMenuItem/ComboBox). Optional two-state (Signal<bool>) or tri-state (Signal<CheckState>) checkbox at the start of the row, independent of row selection. See the worked example in examples/data_collections/src/main.rs. - StandardTreeItem,
StandardListItemplus depth-driven indent and a chevron column (always reserved, even for leaves, so labels at the same depth align)..from_entry(&FlatEntry)sets depth + has_children + is_expanded in one call;.on_chevron_toggle(...)/.on_chevron_toggle_rc(...)wires the chevron tap to aTreeSliceHandle::toggle_expandcallback (cleanest withTreeView::new_with_context);.on_checkbox_toggle(...)is the row checkbox's, forwarded to the embeddedCheckbox::on_change. - TableView, multi-column, virtualized; sort/filter via
SortFilterListModel, drag-resize and drag-reorder columns, pinned Leading/Trailing, cell + row selection, edit hooks, row drag-drop reorder, fullRole::TableAT tree. See table-view.md. - TreeTableView, hierarchical multi-column variant of TableView;
Role::TreeGrid. Optional full-width group rows (.full_width_row(..)+.full_width_row_delegate(..): one cell across every column, still a selectable, expandable, draggable row of the tree) and pinned ancestor rows (.pinned_ancestors(depth): the groups above the first visible row stay under the header, pushed up as the next one arrives). See table-view.md.
Worked TreeView delegate using both new pieces:
#![allow(unused)] fn main() { let tree_checks: TreeCheckedModel<Item> = state.app_state(); TreeView::new_with_context(model, move |item, entry, selected, ctx| { let mut row = StandardTreeItem::new(lit!(&item.title)) .from_entry(entry) .selected(selected) .on_chevron_toggle_rc(ctx.toggle_callback()); if entry.has_children { row = row.tristate_checkbox(tree_checks.signal_for(entry.node_id)); } Box::new(row) }) }
Charts: crates/teksilo-charts/src/
Sits at the same tier as teksilo-widgets (no dep on widgets). Series
data is a ChartModel<T>
(teksilo-data, see data-models.md), not a Prop/
Signal-bound Vec. See charts.md.
- BarChart, vertical or horizontal bars; single or grouped series; optional value labels, axis labels, grid lines, hover tooltips.
- LineChart, points connected by polylines; single or multiple series; optional area fill; hover tooltips on data points.
- PieChart, pie + donut variants; donut variant has a center slot.
All three sit on the Tier-3 styling ladder via
ChartStyle
(.style(...) / theme.style_slots.chart), an all-recipe trait
distinct from the widget world's make_*(cfg, ctx) -> WidgetId
traits; its default RecipeChartStyle lives in teksilo-charts
itself, not teksilo-widgets/src/styles/* (see
styling-system.md).
Gridlines support dashed/dotted patterns (theme-wide via a custom
ChartStyle, or per-axis via AxisConfig::gridline_dash); area and
donut fills support gradients. Full reference:
charts.md §11.
Shared infrastructure (axis.rs, legend.rs, palette.rs, layout.rs, hit.rs) is reused across all three; ChartSeries<T> / ChartDatum<T> construction DTOs live in teksilo-data and are re-exported from teksilo_charts.
Animation wrappers: crates/teksilo-widgets/src/animations/
Wrappers that animate a child subtree without the caller managing scheduler state. See animation.md for Signal<f32>::animate_to and the underlying scheduler.
- Fade, opacity tween 0↔1; layout-transparent.
- Pulse, sine-driven looping opacity oscillation (recording-indicator pattern).
- Cycle, cycles through children on a fixed period.
- Crossfade, keyed builder; old fades to new on key change.
- Collapse, height-collapse tween used by Accordion and disclosure patterns.
- Unroll, the horizontal sibling of
Collapse: a width-unroll tween for side panels and inline reveals. - SmoothSize, auto-sizes to the child's intrinsic size and animates every change (
SmoothSizeAxes). - Slide, slides a child in/out from a chosen edge (
SlideEdge); layout-stable. - Shake, damped horizontal oscillation triggered by a
Signal<u32>bump (invalid-input feedback). - Scale, uniform 2D scale 0↔1 (
ScaleOrigin); visual-only by default, optional layout-driving mode. - Rotate, rotates a child subtree by a
Prop<f32>angle in radians. - Blur, Gaussian-equivalent blur on the child subtree via dual-Kawase chain; sub-perceptual radii are zero-cost.
Settings widgets
Pre-built UI for common app-level concerns.
- ShortcutSettings, full keyboard-shortcut rebind UI: chords drawn as key caps that record a new chord when clicked, search by name or by keys, confirmation before a chord moves from another command, per-row and global reset, one Tab stop with arrow-key navigation. See shortcut-intent-action.md.
- PrivacySettings (
telemetryfeature), consent toggles for telemetry adapters; ties into the telemetry.md consent gate. - TextScaleControl, a specialized
SpinBox(80 %–200 %) for the global "grow all text" accessibility setting; binds the persistedTEXT_SCALE_KEY, applies app-wide on edit. See text-scale.md. - ThemeSwitcher, drop-in app-theme picker for settings screens & toolbars (native / OS-follow themes, persistence); applies app-wide on select.
- LanguageSwitcher, drop-in UI-language picker for settings screens; switches the active locale app-wide. See i18n.md.
Cross-references
- Layout protocol and slack distribution: layout-primitives.md
- Events, gestures, focus, attached handlers: events-and-gestures.md
- Accessibility overrides on every widget: accessibility-overrides.md
- Animation scheduler and
MotionTokens: animation.md - Theming and role-based color resolution: reactive-theme.md
- Drag and drop integration: drag-and-drop.md
- Settings persistence (
SettingsStore,SettingsFile<T>,MruList<T>): settings.md - Global text-scale accessibility setting (
TextScaleControl,ctx.text_scale,follow_text_scale): text-scale.md - i18n (
tr!,tr_signal!, locale-aware formatting): i18n.md - Shortcuts / intents / actions: shortcut-intent-action.md
- Multi-window orchestration: multi-window.md
- Inspector for runtime introspection: inspector.md
- Framework internals (Canvas, rendering pipeline, threading, testability): architecture.md
- Full per-widget API extraction:
python3 tools/extract_widget_api.py <Widget…>or--all