facett roadmap — incoming components, guest wrappers, the rest
What's queued, grouped. Phase rule still holds: copy + fix in facett; cut the source over only for knut (quiescent), copy-only for nornir/znippy/osm.
Done (the uniformity + look pass)
The component-uniformity design set is now built:
- ✅ Capability model —
FacetCaps(10 flags) + defaultedFacetsurface; deck queries caps for its toolbar/shortcuts (2b5b68e). Seeadding-a-component.md. - ✅ Uniform clipboard — Ctrl-C/X/V routed by the deck, gated on caps, deferring to focused
TextEdits; sharedrows_to_tsv(2b5b68e). Seedesign/clipboard.md. - ✅ Table copy —
facett-tableselectable rows → TSV copy (the highest-value ask), virtualized viaegui_extras::TableBuilder(2b5b68e). - ✅ Striking palettes —
nordic_aurora/cyberpunk_neon/amber_crt/deep_space/hugin_noir+ theglowfield +Theme::ALL/names/by_nameenumeration (ce91f1f). Seetheming.md. - ✅ Effects — easing,
glow_rect/glow_text/shimmer/ParticleBurst, and the signatureRavenSprite(bezier arc + ease-out-back perch + idle bob), glow-backend-only (ce91f1f). Seeeffects.md. - ✅
facett-form—FormView<T>overegui_form0.8 +garde: validated fields, sections, dirty-tracking, submit/reset, JSON copy/paste (64c92d4). Seecomponents.md.
Remaining
- ✅
facett-card— DONE (ce91f1f.., migrated to Elm in2ef3c25): YouTrack-style cards with a typedCardFieldgrid and nestable sub-cards (recursive, collapsible),facett-card/src/lib.rs; tested (facett-card/src/tests.rs); demo-wired (facett-demo/src/lib.rs). - ✅
facett-menu— DONE: context menus (context_menu), aCommandPaletteoverlay (Ctrl-K / Ctrl-Shift-P), and classic dropdownmenu_bars, all sharing oneCommandset (facett-menu/src/lib.rs); demo- and testmatrix-wired (0bf5b21,facett-demo/tests/mega_matrix.rs). - ✅
facett-plotters— DONE: five chart types beyondegui_plot— boxplot, candlestick, heatmap, ramp, treemap, violin (facett-plotters/src/), migrated to Elm in9b427ce; demo-wired (facett-demo/src/data.rs,facett-demo/src/lib.rs). - ✅
facett-pipelineglow-up — pipeline DAG brought up to the new look: themeable+resizable caps, theme-driven colours (Status::theme_coloroffaccent/point/red), animated flowing edges (marching-antsedge_phaseshowing dataflow direction;with_speed), per-stage status glow (running pulse / done steady / failed red bloom viaeffects::glow_rect,status_glow), and throughput labels on edges (with_throughput). Back-compat:PipelineView::new/with_progress/countsunchanged (korp builds clean); animationwith_animation(false)for still/headless. Examplepipeline_demoanimates under every palette. - ✅ fx-deck-integration —
DeckFx(palette override + glow toggle/speed),FacetDeck::palette_picker/set_palette/cycle_palette, andFacetDeck::send_raven(rect)(launches aRavenSpriteto perch on any rect through the deck, drawn on a foreground layer). Strictly opt-in, off by default, cheap when off. Exampledeck_fx_demo. Pure phase/cycle math is unit tested (deckfx.rs). facett-flow— deferred:egui_xyflowis on egui 0.31, facett on 0.34 (see below +notes/egui-xyflow-eval.md).
Components to bring in
| Source | Component | Notes |
nornir src/viz/callgraph.rs |
3D CallGraph | ✅ DONE — the port landed and this row was still queuing it on 2026-08-27. It is facett-graph3d, a workspace member (7 299 lines across 9 modules), and CallGraphLayout (callgraph_layouts.rs:38) carries all 7 layouts the row asked for, by name: Force, ClusterZ (Louvain communities → z-shells), Topo, Spectral, Mds, Centrality (hubs front), Helix. Consumed, not shelved — facett-demo's demo_codevault/demo_systemmap/vg_lab_tab mount facett_graph3d::{CodeVault, SystemMap, Graph3D} as Facets. The old text is kept below the line so the ask that produced it is still readable: "Big port → a facett-graph3d (or facett-callgraph) component. Copy-only." |
nornir src/viz/funnel_tab.rs |
snarl funnel DAG | uses egui-snarl (interactive node editor). Either wrap egui-snarl (guest) or port. Copy-only. |
nornir src/viz/graph.rs |
dep-graph | ✓ already copied → DepGraphView (incl. the drill-down; my copy is current). |
Guest wrappers (use best-in-class egui crates where we don't have our own)
Policy: thin Facet wrappers around good egui crates, added to the MEGA matrix. Candidates:
| Crate | Wrap as | For |
egui_xyflow 0.4.3 |
facett-flow |
a React-Flow-style interactive node/flow editor. Blocked: it's on egui 0.31; facett is on 0.34 (chosen to match osm-viewer/wgpu). The wrapper is written + works except the egui-version mismatch (two egui trees → Ui/Pos2 don't unify). Wait for an egui_xyflow 0.34 release, then re-add. |
egui_extras::TableBuilder |
upgrade facett-table |
✓ done — facett-table is now virtualized (only visible rows built), so a million-row Arrow batch scrolls at 60 fps. The "Arrow data, perfect for scrolling" ask. |
egui_plot |
facett-plot |
✅ DONE — shipped, and this row was still listing it as a candidate on 2026-08-27. facett-plot is a workspace member (src/lib.rs, 613 lines) and is consumed by facett-warehousedeck, facett-plotters, facett-demo, facet-wrapped/src/tabular.rs and facett's own surface tests — i.e. the warehouse bar-charts this row was written for are drawn through it. |
egui-snarl |
facett-flow alt |
node editor (also nornir's funnel) |
The egui bump — ✓ done (facett on 0.35, not 0.34)
facett's workspace egui / eframe / egui_extras went to 0.34 in 8c79c20 (Rounding→CornerRadius, rect_stroke StrokeKind), which unblocked the virtualized table and egui_plot. Corrected 2026-08-27: the workspace pin is now egui = "0.35" (Cargo.toml:25). Every "facett is on 0.34" above and below is one bump behind; they are left standing because the xyflow argument they make does not change — an 0.31 crate does not unify with 0.34 or with 0.35.
The two things the bump was for:
egui_xyflowis still on egui 0.31 (two egui trees →Ui/Pos2don't unify), sofacett-flowwaits for an xyflow release on facett's egui — the wrapper is written and works except the mismatch. Still true; there is nofacett-flowcrate in the tree.- The wgpu kernel — ✅ LANDED, and this bullet was still calling it pending on 2026-08-27. It is
facett-core/src/render/gpu/(9 720 lines of Rust + 15.wgslshaders:cull,draw,pick,oit,taa,blur,colorgrade,msdf,sdf,particles,label_collide,label_draw,line,graphcloud,common), scaffolded in2e55446aand grown since. The workspace pinswgpu = "29"withglesdropped from the default feature set, andfacett-core/tests/webgl_free_law.rsred-fires ifglow/khronos-eglre-enter any normal dependency graph — LAW 4 by construction, not by intention. ⚠ The link this bullet and step 4 carried,wgpu-plan.md, does not exist in.nornir/and appears never to have been committed; a reader following it got a 404, which is how the bullet stayed "pending" while the lane shipped.
The historical decision was to do the bump as one bundled, GUI-verified pass (bump → xyflow → wgpu); the bump and the wgpu halves are done, xyflow remains.
Plan (mechanical):
- ✓ Bump workspace
egui/eframe/egui_extras→0.34(8c79c20), and since to 0.35. (knut'segui-snarl→0.9follows when knut is touched.) - ✓ Fix the breakage:
Rounding→CornerRadius,rect_strokeStrokeKind. The headless matrix is the regression net — green matrix + sane vertex counts = components still render. - Add
facett-flowwrappingegui_xyflow0.4.3; add to the matrix. (waiting on an xyflow release on facett's egui — the one step here still open) - ✓ Land the wgpu kernel — done,
facett-core/src/render/gpu/; see above. - ✓ The GUIs render on a machine with a GPU (oden, RTX 4090).
Arrow data viewer (scrolling)
facett-table → virtualized via egui_extras::TableBuilder (only visible rows built) + a facett-arrow adapter RecordBatch → rows, so a million-row Arrow batch scrolls at 60 fps. Pairs with facett-osm (already streams 6.3M pts/s).
Audio (future 🔊)
A facett-audio lane — sonify the data (ingest progress ticks, alert tones on a failed pipeline stage, a sweep as the map loads). Likely cpal/rodio behind a Facet-adjacent trait (fn audio(&self) -> AudioCue). Sketch only; revisit after the visual layers settle.
Themable + striking palettes ✓
Done — Theme + seven palettes (default/sci_fi/nordic_aurora/ cyberpunk_neon/amber_crt/deep_space/hugin_noir), the glow field, and the Theme::ALL/names/by_name enumeration; every component reads theme(ui); korp defaults to sci-fi (ce91f1f). The CPU effects (glow/raven/shimmer) ship glow-backend-only. Next: wire the theme picker + effects into FacetDeck (fx-deck-integration above), and true HDR bloom once wgpu lands (theming.md, effects.md).