Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/facett

.nornir/design/egui-inventory-reasoning.md

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

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.