egui Component Inventory — built-ins + third-party survey
Status: DESIGN (2026-06-12). Companion to component-uniformity.md.
facett targets egui 0.34 (workspace pin) with egui_plot 0.35 already in facett-plot. Practical note: the third-party ecosystem releases against a moving egui; at any moment a given crate may target 0.34 or 0.35. Because facett-plot already depends on egui_plot 0.35 while the workspace pins egui = "0.34", 0.34 and 0.35 are wire-compatible enough for facett's use (egui's public surface is stable across these minors), so "needs 0.35" is rarely a blocker — but each adopted crate's exact egui req is called out below and must be re-verified at cargo add time.
A. Built-in egui widgets facett can rely on
These ship in egui itself (no extra dep) and are the default building blocks. A new facet should reach for these before pulling a crate.
| Widget / API | What it gives | Notes for facett |
Label, RichText, Hyperlink |
text, styled text, links | already used in table/pop |
Button, ImageButton, SelectableLabel |
actions, tab-like toggles | FacetDeck uses selectable_value |
TextEdit::singleline/multiline |
text input | basis of facett-form text fields |
DragValue, Slider |
numeric input | form number fields; the scale control |
Checkbox, RadioButton, radio_value |
booleans / enums | form bool + select fallback |
ComboBox |
dropdown select | form select field |
Grid |
label/field two-column layout | form section layout (no extra dep) |
CollapsingHeader, collapsing |
foldable sections | form sections, tree-ish views |
ScrollArea |
scroll/virtualise | table already virtualises via egui_extras |
ProgressBar |
progress | facett-pop |
Window, Area, Order::Foreground |
floating/layered surfaces | command palette + modal overlay (facett-menu) |
menu_button, Response::context_menu |
dropdown + right-click menus | core of facett-menu |
Painter (ui.painter_at) |
custom 2D drawing | graph/map/graph3d render path |
ui.ctx().copy_text(..), Event::Copy/Cut/Paste |
clipboard | see clipboard.md |
Key + Modifiers via ctx.input |
shortcuts (Ctrl+/Ctrl-, Ctrl-C) | scale + clipboard routing |
Sense, Response, interact |
hit-testing for selection | selectable facets |
Verdict: build forms' field primitives, sections, the scale control, context menus and the command-palette shell entirely from built-ins. Only the validation report (forms) and a few niche viewers justify a crate.
B. Third-party crate survey (curated)
Recommendation legend: KEEP = adopt as-is behind a facett wrapper; ADAPT = adopt but wrap/extend meaningfully; SKIP = don't adopt now (note why).
Plotting
| Crate | Adds | egui status | License | Rec |
egui_plot |
interactive line/bar/scatter, zoom/pan, legends | tracks egui; 0.35 in use | MIT/Apache | KEEP — already in facett-plot. The default for interactive charts. |
plotters + plotters-backend (egui canvas) |
publication-grade static charts (many series types, fine styling) | backend-agnostic; render to an egui Painter/texture |
MIT | ADAPT, later — only when a facet needs chart types egui_plot lacks (candlesticks, complex axes) or pixel-perfect export. Heavier, non-interactive. Keep behind a facett-plot feature flag; not a default. |
When each: interactive dashboard panel → egui_plot. Static, richly-styled, or export-to-PNG report figure → plotters. Don't pull plotters until a concrete facet needs it.
Tables
| Crate | Adds | egui status | License | Rec |
egui_extras::TableBuilder |
virtualised header+body table, resizable cols | ships with egui (0.34) | MIT/Apache | KEEP — already in facett-table; million-row virtualised scroll. |
egui_table |
two-axis virtualisation, sticky rows+cols, cell spans | ~0.3–0.5, tracks egui | MIT/Apache | ADAPT, conditional — only if facett needs frozen columns / huge column counts / spreadsheet-like spans. Otherwise egui_extras is simpler and already integrated. Revisit when a consumer asks for frozen columns. |
When each: current striped data grid → egui_extras. Spreadsheet / pinned columns / 2-D virtualisation → egui_table.
Forms (administrative / CRUD apps)
| Crate | Adds | egui status | License | Rec |
egui_form (hello_egui) |
Form/FormField with validation report + per-field error styling; garde or validator backends |
0.8.0 → egui ^0.34 | MIT/Apache | ADAPT → basis of facett-form. Solves the hard part (validation→error display). |
egui_form_kit |
higher-level form scaffolding | smaller/less proven | (varies) | SKIP — narrower ecosystem, fewer eyes than hello_egui; egui_form + our wrapper covers it. |
Decision and full spec in facett-form.md.
Docking / tiling
| Crate | Adds | egui status | License | Rec |
egui_tiles |
tiling layout: drag-to-split, tabs, resizable panes; container tree you own | tracks egui (emilk) | MIT/Apache | ADAPT — the right backend for a future FacetDeck upgrade from a flat tab bar to draggable/splittable panes. It's by egui's author, so it tracks versions best. Wrap so each tile hosts a Box<dyn Facet>. |
egui_dock |
ready-made dockable tab UI (VS-Code-ish) | ~0.19.x, tracks egui | MIT/Apache | KEEP-as-alt — faster to a polished dock UI than egui_tiles, but more opinionated. Pick egui_tiles as the primary direction (more control, same author as egui); keep egui_dock as the drop-in if we want batteries-included docking sooner. |
Direction: keep the current simple tab FacetDeck as the default; design a FacetDeck "layout backend" seam so a tiles-backed deck can be added behind a feature without changing the Facet contract. Not urgent.
Modals / toasts
| Crate | Adds | egui status | License | Rec |
egui-notify |
stacked toast notifications, threadsafe Toasts |
tracks egui | MIT/Apache | KEEP — adopt for transient feedback (copy succeeded, form saved). Lives in facett-menu (or a tiny facett-core re-export) so every app gets uniform toasts. |
egui-toast |
similar toast notifications | ~0.17, tracks egui | MIT/Apache | SKIP (alt) — pick one; egui-notify's threadsafe Toasts fits background jobs (pipelines/pop). |
egui-modal |
blocking modal dialogs | ~0.6, may lag a minor | MIT/Apache | ADAPT/optional — a modal is cheap to build from Area + Order::Foreground + a scrim (see facett-menu), so prefer build for the confirm-dialog case and keep egui-modal only if we want its dialog ergonomics. |
Icons
| Crate | Adds | egui status | License | Rec |
egui-phosphor |
Phosphor icon font + name constants | 0.12.0 → egui ^0.34 | MIT (+ Phosphor MIT) | KEEP — one icon set used uniformly across toolbars, menus, form buttons. Install the font once on the context next to set_theme. |
Node graphs
| Crate | Adds | egui status | License | Rec |
egui-snarl |
interactive node-graph editor (ports, wires, drag, custom node UI) | tracks egui | MIT/Apache | ADAPT, future — the right tool if facett-pipeline/facett-graph ever needs an editable node graph (wire things up), vs today's read-only DAG painter. Heavier; adopt only when editing is a requirement. |
egui_graphs |
graph layout+interaction over petgraph |
tracks egui | MIT/Apache | SKIP — facett-core already owns layout (Circular/Force) and a lean Scene; pulling petgraph+this duplicates that. Revisit only if we need advanced layouts we won't write ourselves. |
| egui-xyflow | React-Flow-style flow editor port | early/less proven | (varies) | SKIP — immature relative to egui-snarl; reconsider if it matures. |
Direction: keep the read-only painter for viewing. For editing graphs/DAGs, adopt egui-snarl behind a future facett-graph editor feature — not now.
Markdown
| Crate | Adds | egui status | License | Rec |
egui_commonmark |
render CommonMark/Markdown (headings, lists, code, tables, images) | tracks egui | MIT/Apache | KEEP — small, focused; ideal for a facett-doc/help facet, form help text, and rendering nornir/skade docs in-app. Adopt when the first markdown-rendering need lands (help panels, README viewer). |
Summary of verdicts
- Adopt now / already in:
egui_plot,egui_extras(in use),egui_form(forms),egui-phosphor(icons),egui-notify(toasts),egui_commonmark(markdown — on first need). - Adopt later, behind a seam/feature:
egui_tiles(deck layout backend),egui-snarl(editable graphs),egui_table(frozen-column tables),plotters(static/export charts). - Skip:
egui_form_kit,egui-toast,egui_graphs, egui-xyflow,egui-modal(build modals from primitives instead).
Sources: 3rd-party egui crates wiki, egui_form docs.rs, egui-phosphor docs.rs, egui_dock docs.rs, egui_tiles crates.io, egui_table docs.rs, egui-notify, egui-snarl crates.io, egui_commonmark crates.io.