1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//! Stock widget vocabulary — reach for these before composing
//! `column` / `row` / `button` / `text` by hand.
//!
//! # Catalog
//!
//! **Surfaces & shells**
//! - [`card`] — boxed content surface; `card([card_header, card_content, card_footer])` and `titled_card("Title", [...])`
//! - [`sidebar`] — nav rail; `sidebar([sidebar_header, sidebar_group([sidebar_group_label, sidebar_menu([sidebar_menu_button(...)])])])`
//! - [`toolbar`] — page-chrome header row; `toolbar([toolbar_title, spacer(), toolbar_group([...])])`
//! - [`dialog`] — modal dialog; `dialog(key, [dialog_header, body, dialog_footer])`
//! - [`sheet`] — edge-pinned modal; `sheet(key, SheetSide::Right, [sheet_header, body])`
//! - [`popover`] — anchored floating panel; `dropdown` and `context_menu` compose over it
//! - [`overlay`] — `modal` / `modal_panel` / `scrim` primitives behind dialog/sheet
//!
//! **Object rows & lists**
//! - [`item`] — clickable resource row (recent file, repo, project, person, asset entry); `item([item_media_icon, item_content([item_title, item_description]), item_actions([...])])` inside `item_group([...])`
//! - [`list`] — plain `bullet_list` / `numbered_list` / `task_list` for prose-style enumerations
//! - [`table`] — structured tabular data; `table([table_header([table_row([table_head(...)])]), table_body([...])])`
//! - [`accordion`] — collapsible section; `accordion_item("group", "key", "Title", open, [...])` + `accordion::apply_event`
//!
//! **Navigation**
//! - [`tabs`] — segmented control / tabs; `tabs_list(key, ¤t, options)` + `tabs::apply_event`; `tabs_list_from_triggers([...])` for icon/badge tabs
//! - [`editor_tabs`] — closable, reorderable editor tabs (think VS Code)
//! - [`breadcrumb`] — `breadcrumb_list([breadcrumb_link(...), breadcrumb_separator(), breadcrumb_page(...)])`
//! - [`pagination`] — `pagination_content([pagination_previous(), pagination_link(...), pagination_next()])`
//! - [`dropdown_menu`] — `dropdown_menu(key, trigger, [dropdown_menu_item_with_shortcut(...)])`; collapses per-row `[Edit][Delete]` button pairs
//! - [`command`] — palette / menu rows with icon + label + shortcut; `command_row(...)` / `command_item(...)`
//!
//! **Inputs & forms**
//! - [`text_input`] / [`text_area`] — controlled text editing; app owns `(value, Selection)` and calls `apply_event`; fixed-height text areas also drain caret scroll requests after accepted events
//! - [`numeric_input`] — number entry with stepper / formatting
//! - [`input_otp`] — segmented one-time-password input
//! - [`select`] — controlled dropdown; `select_trigger(key, label)` + `select_menu(key, options)` + `SelectAction`
//! - [`switch`] / [`checkbox`] — controlled bools with `apply_event`
//! - [`radio`] — `radio_group(...)` + `radio_item(...)` + `RadioAction`
//! - [`toggle`] — single or grouped toggle buttons (think bold/italic toolbar)
//! - [`slider`] — controlled value bar; `slider(...).key(k)` + `SliderAction` / `slider::apply_input`
//! - [`form`] — `form([...])` + `form_item([form_label, form_control, form_description, form_message])` + `field_row(label, control)` + `form_section(...)`
//!
//! **Feedback & status**
//! - [`alert`] — callouts; `alert([alert_title, alert_description]).warning() / .info() / .destructive()`
//! - [`badge`] — status pill; `badge("Online").success() / .warning() / .destructive() / .info() / .muted()`
//! - [`progress`] — non-interactive value bar; `progress(value, color)`, also `progress_indeterminate(...)`
//! - [`spinner`] — loading indicator
//! - [`skeleton`] — loading placeholder; `skeleton().width(...)` / `skeleton_circle(size)`
//!
//! **Identity & content**
//! - [`avatar`] — `avatar_fallback("Name")` / `avatar_image(img)`; default size [`avatar::DEFAULT_AVATAR_SIZE`]
//! - [`text`] — text leaves with role modifiers (`h1`, `h2`, `h3`, `paragraph`, `mono`, `.label()`, `.caption()`, `.muted()`, `.code()`)
//! - [`blockquote`] — quoted block
//! - [`code_block`] — fenced code with optional chrome
//! - [`button`] — `button(label)` / `button_with_icon(...)` / `icon_button(...)`; `.primary()` / `.secondary()` / `.ghost()` / `.destructive()`
//!
//! **Structural primitives**
//! - [`separator`] — `separator()` / `vertical_separator()` (1px line, content-aware)
//! - [`resize_handle`] — `resize_handle(Axis::Row).key(...)` + `resize_handle::apply_event_fixed` / `apply_event_weights` for draggable splitters
//!
//! # Symmetry invariant
//!
//! These modules are pure compositions of the public widget-kit surface
//! (`El` builders, style profiles, focus opt-in). They ship no privileged
//! internals: an app crate can fork any of them and produce an equivalent
//! widget against the same public API. The invariant — *stock widgets get
//! no APIs that user widgets don't* — is what makes the library a
//! substrate rather than a fixed component library; everything here is
//! its proof.