Changelog
What changed in each version of patina-ui, newest first. Upgrading lists what an app has to
change, or should, to take the version; an app that skips it still builds unless it says
otherwise. The other headings say what's new or different. Why each change was made is in the ADR
it names, in docs/adr.
Sector F apps build on develop, so they get changes before a release: after
cargo update -p patina-ui, read Unreleased as well. Each change that alters what apps write
is added there in the same commit (ADR-0025).
Unreleased
Upgrading
- Source drawn on
code_bg_colorby the app itself: useextreme_bg_color, to match code blocks. Only the Default skin looks different; skins set both tosurface(ADR-0026). - Apps with a highlighter of their own: use
patina::highlight(featurehighlight, on withmarkdown), so code looks the same everywhere. Apps callingegui_extras::syntax_highlightingneedegui_extras'syntectfeature themselves now; Patina no longer turns it on (ADR-0027).
Added
patina::highlight, behind thehighlightfeature: Text Editor's highlighter, a line at a time and kept between edits, over bat's syntaxes (Highlighter,layout_job,detect,language_for,languages) (ADR-0027).
Changed
- Code blocks (
markdown::embeds::code) are filled withextreme_bg_color, the text-field background, notcode_bg_color: white or near-black in Default instead of grey (ADR-0026). - Code blocks and
embeds::code_fileare coloured bypatina::highlight: bat's languages (TOML, TypeScript, Dockerfile...), plain text in the skin's text colour (ADR-0027). make testandmake checkbuild every feature.
0.1.11 — 2026-10-24
Upgrading
TitleBarwith.menu_bar(true): add.span(frame::header_span(ui)), called inside the header panel, so the menus fill the bar's height. Apps with aTabStripalready compute the span; pass the same one to both. Without it the menus fill only the 25 px row (ADR-0024).- Drop your own Ctrl+T and Ctrl+W.
tabs::keysnow returnsTabAction::Newfor Ctrl+T andTabAction::Close(shown)for Ctrl+W, and no longer takes Ctrl+Shift+T. A terminal, whose Ctrl+T and Ctrl+W belong to the shell, callstabs::terminal_keysinstead, which takes them with Shift and otherwise matcheskeys(ADR-0020). - Context menus: use
patina::menu::context(&response, |ui| ...)in place ofresponse.context_menu(...), so every menu shares one style Patina can change in one place (ADR-0022, ADR-0023).
Added
TitleBar::span(range)andframe::header_span(ui): the header bar's full height, for its menus and tabs (ADR-0024).TitleBar::minimise(false)leaves the minimise button out, for a desktop with nowhere to minimise to.TabStrip::movable(&mut |from, to| ...): tabs can be dragged into another order; the app reorders its own list (ADR-0021).TabStrip::launchers(&[bool]): those tabs show only their icon, at half strength, with no close button, and are never filled as the shown tab (ADR-0021).tabs::terminal_keys(ADR-0020).patina::menu:style, egui's menu style, andcontext(ADR-0022, ADR-0023).
Changed
- The menu bar's menus fill the bar's height, have 10 px either side of their names and no gaps between them, and light square in the bar's hover colour. The first menu's name stays where it was, and the divider before the tabs stays the row's height (ADR-0024).
TabStrip's+hint says Ctrl+T (ADR-0020).- Menus are egui's own size. 0.1.11 briefly made menu items 24 px high (ADR-0022); that was reversed before the release (ADR-0023). The 24×24 minimum stays for other clickable elements.
Fixed
- A short panel at a window corner, such as the status bar, keeps the window's full corner radius, so its background no longer shows outside the border's curve.
0.1.10 — 2026-10-19
Upgrading
- Markdown: enable the
markdownfeature to usepatina::markdown, and callpatina::markdown::install(ctx)once at start-up for its fonts and image loaders (ADR-0015). - Touchpad scrolling: call
patina::kinetic::glide(ctx, raw_input)fromApp::raw_input_hook, before anything else reads the scroll events, so a flick keeps scrolling after the fingers lift (ADR-0019). - Every app has a status bar along the bottom: the version, then the latest message coloured by level, then the app's own status. Menus don't report; their results go to the bar. Apps build it themselves for now (ADR-0016).
- The skin menu lists every skin, then Follow desktop / Light / Dark, then Reload skins, Copy built-in skins to folder and Open skins folder, the same in every app, with no messages in it (ADR-0017).
Added
patina::markdown, behind themarkdownfeature: Notebook's markdownEditor, with a read-only mode, find (set_search,find) and the model, embeds and fonts it's built on.embeds::code_fileandembeds::markshow a file's code with marked lines (ADR-0015).patina::kinetic::glide(ADR-0019).TabStrip::iconsandTabStrip::label(TabLabel): tabs with icons, titles or both (ADR-0018).TabStrip::tab_menu: an app's own items in each tab's menu, before Close.TabStrip::own_menu: the app opens a tab's menu itself, where it has no room for one.TabStrip::own_tooltip: the app shows a hovered tab's title itself.TabStrip::separator(false): tabs that stand alone, without the line before them.
Changed
TabStrip::showtakesmut self; callers are unchanged.
Fixed
- A tab's icon is drawn on whole pixels, so it isn't blurred.
0.1.9 — 2026-10-16
Added
TabStrip::closable(false): tabs that can't be closed (ADR-0014).
0.1.8 — 2026-10-15
Added
TabStrip::new_tab(false)leaves out the+tab and the menu's New item, andTabStrip::noun("Window")makes the menu and close button say Close Window (ADR-0012).tabs::keys: Alt+1 to Alt+9 show that tab (ADR-0013).
0.1.7 — 2026-10-14
Upgrading
- Load skins from
skin::app_dir("<app>"),~/.config/<app>/skins, named after the app's config folder, and point the skin menu's Copy and Open at it.skin::shared_diris deprecated and apps no longer read~/.config/patina/skins/; skins there have to be moved (ADR-0011).
Added
skin::app_dir(ADR-0011).
0.1.6 — 2026-10-13
Added
patina::open::path(path): opens a file or folder with the desktop's opener, not the browser (ADR-0010).
0.1.5 — 2026-10-13
Added
patina::tabs:TabStrip, tabs in the title bar moved from Teleprinter, withspan,id_salt,new_hintandtab_id;TabAction(New,Show,Close); andtabs::keysfor Ctrl+PageUp/PageDown and Ctrl+Shift+T (ADR-0009).
0.1.4 — 2026-10-13
Added
frame::can_minimise_and_maximise(), for apps that offer minimise or maximise elsewhere (ADR-0008).
Changed
- Where the compositor can't minimise or maximise (dwl for now), the header bar shows only close, and the window menu and double-click leave them out (ADR-0008).
- Adds
libcas a Linux-only dependency.
0.1.3 — 2026-10-12
Upgrading
- Apps with text fields: call
patina::ime::drop_repeated_preedits(ctx, raw_input)fromApp::raw_input_hook. Without it, on GNOME's Wayland, a focused text field keeps an idle window repainting at a full core. See docs/egui-pitfalls.md.
Added
patina::ime::drop_repeated_preedits.- docs/egui-pitfalls.md: finding what keeps an egui app repainting.
0.1.2 — 2026-10-11
Added
- Built-in Calendar, Notebook and Steam Classic skins in
skin::BUILT_IN(ADR-0005).
Changed
TitleBarrecolours its controls when the skin's title bar differs from the panel, and paints the title in the skin'stitle_text. Apps that did this themselves (Calendar, Notebook) can drop it (ADR-0005).
0.1.1 — 2026-10-11
Fixed
- Title bar controls no longer shift when one is hovered under a skin that strokes controls (Dark Orange).
0.1.0 — 2026-10-11
The first release: the frame, folder tree and design language of Photograph and UnAmp.
patina::frame: the app's own window frame, withTitleBar,FrameStyle, GNOME-style window controls, resize edges and rounded corners (ADR-0003).patina::appearance: follows the desktop's light/dark setting.patina::skin: skins in the suite format, with app sections and Dark Orange built in (ADR-0004).patina::tree: a sidebar folder tree that lists folders on worker threads.- Re-exports
egui0.35; apps use the same version.