egui is an easy-to-use immediate mode GUI for Rust that runs on both web and native.
Try it now: https://www.egui.rs/
egui development is sponsored by Rerun, a startup building an SDK for visualizing streams of multimodal data.
egui 0.34.0 changelog
Highlights from this release
- Sharper text unlocked by switching font rendering crate to
skrifa - Fade out edges of
ScrollAreas - Use
Uias the main entrypoint
Skrifa and font hinting
The font rendering backend was switched from ab_glyph to skrifa + vello_cpu. This enabled us support
font hinting and variations. It also paves the way for more font improvements in the future, like support for color
emojis and adding helpers for variations like RichText::bold.
Font hinting makes text more clear (look at the =):
Screen.Recording.2026-03-26.at.10.49.43.mov
We now support setting variable font parameters:
Screen.Recording.2026-03-26.at.11.37.21.mp4
(Unfortunately there is currently a bug with variations, meaning changing them live like this won't work in practise.
There is a draft PR to fix it, but it didn't make the release)
- Replace ab_glyph with Skrifa + vello_cpu; enable font hinting #7694 by @valadaptive
- Add font variations API #7859 by @valadaptive
More Ui, less Context
egui has long had a confusing overlap in responsibilities between Context and Ui.
In particular, you could add panels to either one (or both!).
In this release, we switch from having Context be the main entrypoint, and instead provide whole-app Ui.
In egui we've replaced Context::run with Context::run_ui, and changed viewports to be given a &mut Ui instead of Context.
In eframe we've deprecated App::update replaced it with App::ui (which provides a &mut Ui instead of a &Context).
In addition to this, Ui now derefs to Context, so all code like ui.ctx().input(…) can now be written ui.input(…).
This means you are much less likely to have to use naked Contexts.
Context can still be useful though, since they implement Clone and can be sent to other threads so you can call .request_repaint on them.
- Add
Context::run_ui#7736 by @emilk - Add
Deref<Target = Context>forUi#7770 by @emilk - Replace
App::updatewithfn logicandfn ui#7775 by @emilk - Rename
Context::styletoglobal_style; avoid confusion w/Ui::style#7772 by @emilk - Rename functions in
Contextto avoid confusion #7773 by @emilk - Viewports: give the caller a
Uiinstead ofContext#7779 by @emilk
Changed panel API
As part of the above work, we have unified the panel API.
SidePanel and TopBottomPanel are deprecated, replaced by a single Panel.
Furthermore, it is now deprecated to use panels directly on Context. Use the show_inside functions instead, acting on Uis.
This unification and simplification will make it easier to maintain and improve panels going forward.
- Add
Panelto replaceSidePanelandTopBottomPanel#5659 by @sharky98 - Deprecate using
Paneldirectly on aContext#7781 by @emilk - Deprecate
CentralPanel::show#7783 by @emilk - Deprecate
Context::used_sizeandContext::available_rect#7788 by @emilk
⭐ Added
- Add
is_scrolling/is_smooth_scrollingutil, checking for active scroll action #7669 by @IsseW - Allow multiple atoms in
Button::shortcut_textandright_text#7696 by @emilk - Add
ScrollArea::content_margin#7722 by @emilk - Per-widget style #7667 by @AdrienZianne
- Plugin: export
TypedPluginGuardandTypedPluginHandle#7780 by @apekros - Add
ViewportInfo::occludedandvisible#7948 by @emilk - Add
Atomprefix/suffix support toDragValue#7949 by @lucasmerlin - ⚠️ Atom improvements:
Atom::id,align,closure,max_size#7958 by @lucasmerlin - Add
DebugOptions::warn_if_rect_changes_id#7984 by @emilk TextEditAtomprefix/suffix #7587 by @lucasmerlin- Add
Button::left_text#7955 by @rustbasic - Add
Response::parent_id#8010 by @lucasmerlin - Add
Context::text_edit_focused#8014 by @emilk - Add
Context::time#8017 by @emilk - Add
Ui::is_tooltip#8016 by @emilk - Add
UiStack::bg_color#8020 by @emilk - Make
egui::IdSetpublic #8019 by @lucasmerlin - Add raw key methods to TypeIdMap #8007 by @AlexanderSchuetz97
🔧 Changed
- Remove
accesskitfeature and always depend onaccesskit#7701 by @emilk - Update MSRV from 1.88 to 1.92 #7793 by @JasperBRiedel
- Improve modifier handling when scrolling #7678 by @emilk
- Apply preferred font weight when loading variable fonts #7790 by @pmnxis
- Make scroll bars and resize splitters visible to accesskit #7804 by @emilk
- Allow moving existing widgets to the top of interaction stack #7805 by @emilk
- Slightly change interact behavior around thin splitters #7806 by @emilk
- Move window resize interaction to be over contents #7807 by @emilk
- Don't expand widgets on hover #7808 by @emilk
- Make
FrameCache::getreturn a reference instead of cloning the cached value #7834 by @KonaeAkira - Update selected dependencies #7920 by @oscargus
- Make
Galley::pos_from_layout_cursorpub#7864 by @dionb - Update accesskit to 0.24.0 (and related deps) #7850 by @delan
- Quit on Ctrl-Q #7985 by @emilk
- Fade out the edges of
ScrollAreas#8018 by @emilk
🔥 Removed
🐛 Fixed
- Fix: ensure
CentralPanel::show_insideallocates space in parent #7778 by @emilk - Heed constrain rect when auto-positioning windows #7786 by @emilk
- Fix jitter when hovering edge of scroll area close to resize splitter #7803 by @emilk
- Don't focus Areas, Windows and ScrollAreas #7827 by @lucasmerlin
- Fix backspacing leaving last character in IME prediction not removed on macOS native and Safari #7810 by @umajho
- Implemented distance threshold for double/triple clicks #7817 by @bl4ze4447
- Fix
CentralPanel::show_inside_dynto roundpanel_rect#7868 by @ripopov - Stop ctrl+arrow etc from moving focus #7897 by @emilk
- Fix scroll area not consuming scroll events #7904 by @lucasmerlin
- Pass in an explicit id in
UiBuilder, to avoid wrapping passed in ids with Id::new() #7925 by @lucasmerlin - Fix crash when dragging a DragValue through small floats #7939 by @Fyrecean
- Fix emoji icon font #7940 by @Jhynjhiruu
- Fixes the overly aggressive overflow elision in
truncate()and similar for os scaling other than 100% #7867 by @RndUsr123 - Fix text color when selecting newline character #7951 by @emilk
- Fix: repaint on drag-and-drop files #7953 by @emilk
- Fix instable IDs following animated panels #7994 by @emilk
- Enables every combination of
TextEditandLayoutJobalignments #7831 by @RndUsr123 - Fix
horizontal_wrappingrow height after usingtext_edit_multiline#8000 by @optozorax - Fix menu keyboard toggle for open submenus #7957 by @fjkorf
- Fix:
Visuals::interact_cursorsupport inButton#7986 by @mango766
