Repository navigation
v0.20.0
Added
KDE Plasma
- New crate
teksilo-theme-kde, the KDE Plasma preset.light()and
dark()are Breeze Light and Breeze Dark (idskde.light,kde.dark);
light_with_accentanddark_with_accentapply an accent as Plasma's
colour settings do,PlasmaAccentlists Plasma's ten accent swatches with
stable names for saving a choice, andfrom_schemethemes any KDE colour
scheme. Breeze's colours, radius, focus ring, text sizes and motion, the
scheme's muted colours in an inactive window, and the preset's own colours
under the OS increase contrast preference (7:1 text, 4.5:1 outlines).
KdePalettecarries the whole resolved scheme. - Breeze chrome for the stock controls. Buttons (
Filledas the default
button,GhostandLinkflat), tool and split buttons, check boxes,
radio buttons, switches, line edits (TextInput, an editable
RichTextEditor), combo and spin boxes, sliders, menus, popups, tooltips,
list and tree rows, tables, tabs, scroll bars and progress bars are drawn
and sized as Breeze's, growing to the density's target size; other widgets
keep Teksilo's chrome in Breeze's colours and shapes. - Breeze made readable. Where stock Breeze or the user's scheme falls
short of WCAG (secondary text, links, status and focus colours, outlines,
the scroll-bar thumb, text on the accent, an inactive window's shading, a
translucent colour), the preset lifts the colour, keeping its hue, and
check box, radio and table rows are 24 px to stay target sizes. The crate
documentation lists every deviation from Breeze and the known limitations. - The theme of the live KDE desktop.
from_desktopbuilds it from a
KdeDesktop: the colour scheme with the user's accent, the desktop's
fonts as the text styles (the controls grow with them), its animation
speed (0 means reduced motion) and itsbreezercsettings.native_theme
gives that theme on a desktop using the Breeze widget style,Noneon any
other. - Plasma's fonts, optionally. The themes write in the bundled Inter and
JetBrains Mono at the sizes of Plasma's Noto Sans and Hack. The
bundled-fontsfeature embeds Noto Sans and Hack (about 5.6 MB; pass
font_registrar()toTeksiloAppBuilder::register_fonts), and
system-fontsuses the desktop's installed copies. Neither changes a size. - New crate
teksilo-kde-scheme. Reads a KDE desktop from contents the
caller supplies, touching no file or environment and running no command:
the configuration cascade (KConfig), colour schemes (KdeColorScheme,
resolved into KDE's palette, accented as Plasma does), fonts and the whole
desktop (KdeDesktop), with KDE's colour arithmetic inmath. - The
theme-kdefeature ofteksilo, the preset in
teksilo::prelude::kde. Its font features are not forwarded. native_theme_kde()onTeksiloAppBuilder(TeksiloAppBuilderKdeExt,
in the prelude). A window built inThemeMode::Nativeon a KDE desktop
with the Breeze style shows Breeze's chrome in the desktop's live colours,
fonts and animation speed, at the window's density; elsewhere it keeps
IntUI in the desktop's colours.ThemeMode::FollowSystemis unaffected,
and switching to Native at runtime re-tints but keeps the shapes the
windows were built with.
Theming
PaintProjection. A theme registered withwith_paint_projection
paints its own colours in an inactive window and under the OS increase
contrast preference;BuildContext::prefers_high_contrastreads the
preference at build time.- A negative
ShapeTokens::focus_ring_offsetdraws the focus ring
partly or wholly inside the control; every stock ring follows it. - Style hooks for sizes and states.
StandardItemStyle,TableStyle,
TabStyle,ScrollBarStyleandProgressBarStyledeclare their row,
header, tab, thumb and bar sizes at the active density;
StandardItemStyle::selection_emphasissays whether a selection mutes
with view focus or only with the window, and
MenuItemStyle::pressed_label_rolecolours a pressed row's label.
StandardItemStyle::min_height_decoratedsets the height of a row with a
check box or leading slot, andProgressBarStyle::paints_busy_indicator
lets a style draw an indeterminate bar's motion in place of the sweep.
Every default keeps an existing style as it was. ComponentStyleSlots::NAMES, the name of every theme-wide style slot.- More desktop colours in the native theme.
ColorTokens::from_os_colors
uses a report's view, link, status and focus colours, made readable where
they fall short. teksilo_tokens::contrastandMotionTokens::scaled(durations
times a desktop's animation-speed factor).
Platform and app
os_theme::query_native_desktopgives the desktop's colour report
and, on KDE Plasma, the KDE desktop itself;OsThemeWatchreports each
appearance change on Linux, reconnecting when the session bus goes away.- Native and follow-system themes update live. Under
ThemeMode::Native
orThemeMode::FollowSystem, every window takes the desktop's new accent,
colour scheme or light or dark setting without a restart, and reduced
motion follows the desktop's animation speed. On a KDE session with no
bus, changed KDE files are read when a window takes focus. TeksiloAppBuilder::native_themeanswers eachNativeThemeRequest
with the app's own Native-mode theme, orNonefor IntUI in the desktop's
colours;resolve_native_themegives the theme a request resolves to,
configured_native_theme()returns the installed factory, and
presets::intui::from_osis the IntUI default on its own.
Demos and documentation
- The widget catalog offers KDE: KDE Light and KDE Dark in the theme
switcher,--theme kde-lightand--theme kde-darkfor Breeze's chrome,
and--theme systemfor Native mode, which is Breeze on a Breeze desktop. - A guide to Native mode, and the KDE preset in the README, the styling
guide and the application guide.
cargo-teksilo
cargo teksilo updatebrings what is already installed to the tool's
release: the probe harness, the project's agent instructions, and the
teksilo-automation-mcpandcargo-teksilo-fmtbinaries on PATH. It lists
the changes and asks first;-yskips the question,-iasks per action
and shows the equivalent command,--dry-runonly lists.--agentlimits
it to the project's agent instructions,--userupdates the ones under the
home directory instead. It ends by saying to restart the agent session or
the MCP server when it replaced what they run.cargo teksilo statusreportscargo-teksilo-fmton aFmtline, and the
tool's own version on aToolline;--jsonaddsformatter,
tool_outdatedandtool_update_command.
Changed
Theming
- Breaking.
OsThemeColorsis#[non_exhaustive]and has ten new
fields (view_bg,view_fg,alternate_bg,inactive_fg,link,
link_visited,error,warning,success,focus). Outside
teksilo-tokens, build it with the newOsThemeColors::new(scheme)or
OsThemeColors::default()and assign fields, not a struct literal. It
now implementsPartialEq. - Breaking.
MacOsMenuItemStyleandFluentMenuItemStyleare no
longer unit structs; they hold theirMenuItemRecipeinrecipe. Use
::default()for the compact sizes,::for_tokensfor a density's or
::newwith a recipe. - The native theme takes more of a GTK theme's colours.
Behaviour change: with a GTK theme that ships its CSS (Breeze GTK, for
example),ThemeMode::Nativealso follows its content surface, editor
text, link, error, warning and success colours, and Breeze GTK's focus
colour.
Platform
- Linux desktop settings are read without
busctl. The portal and the
screen reader flag are read over the session bus directly; a silent bus
delays startup by at most a second, where each read waited up to 25 seconds.
They are now also read withoutbusctlinstalled and from portals older
than version 2 of the settings interface. - A Linux session is KDE only when it says so. Behaviour change:
XDG_CURRENT_DESKTOPmust listKDEorKDE_FULL_SESSIONbetrue,
checked before GNOME. A name merely containing KDE no longer counts. - Native mode on KDE reads all of KDE's configuration.
Behaviour change: everykdeglobalsKDE reads,kdedefaultsand
XDG_CONFIG_DIRSincluded, with administrator locks honoured; without
colours of its own, the look-and-feel package's or named scheme's, as in
KDE. Before, only the user's ownkdeglobalswas read. - Native mode on KDE takes the user's accent. Behaviour change: the
accent is KDE's selection colour, as KDE applications show it, and a
chosenAccentColorapplies to a scheme the profile never wrote. The
portal's accent is used only when nokdeglobalscan be read. The view,
link, error, warning, success and focus colours are read from the scheme
too, so a desktop with another widget style shows them in IntUI. - Light or dark on KDE follows the colours. Behaviour change: a
scheme is dark when its window background is, not when its name says
"dark", so Breeze Twilight is no longer taken for light. - Reduced motion follows KDE's animation speed. Behaviour change: an
instant speed (AnimationDurationFactor=0) turns on
AccessibilityPreferences::reduced_motion.
App
- A theme that follows the OS keeps the app's density.
Behaviour change: under Native and FollowSystem, a window's theme and
each OS change keep the app's density instead of resetting to compact. - A Native window opens in the window system's light or dark state when
the desktop states neither. Behaviour change: before, it always
opened light. - A FollowSystem window opens in the desktop's light or dark preference.
Behaviour change: before, it went by the window system alone, which Linux
never gives, so it opened light on a dark desktop. - A Native theme keeps the desktop's colours without a light or dark
preference. Behaviour change: on GNOME's default style, an OS change
andfollow_system_themekeep its accent and GTK colours, not plain IntUI. - An OS theme event that changes nothing no longer relays out and
repaints every window.
cargo-teksilo
cargo teksilo statusprints thecargo installcommand for a tool, an
automation server or a formatter that is older than the app's Teksilo,
including a patch-level difference, which it previously reported as
matching. The server's JSONstatecan now beolder.cargo teksilo update --userreplacesagent install --user --forceas the
remedystatusgives for a differing user-scope copy.cargo teksilo initandupdateno longer ask when$CIor$CLAUDECODE
is set, even on a terminal: they print the listing and exit with an error
naming-y, which now tells an agent to show the list to the user first.
Removed
- Breaking.
TabRecipe::tool_window_heightand
recipe_tab_style::TAB_TOOL_WINDOW_HEIGHT. Nothing read them. Drop
tool_window_heightfrom aTabRecipestruct literal.
Fixed
- Builds without link-time optimisation embed each bundled font once,
4.8 MB less in a debug build of an app with text input.
Theming
- List and tree rows are as tall as the active style says.
Behaviour change: a self-measuring row is 24 px under macOS and 40 px
under Fluent at the compact density, rising to the density's target size
above it. Before, every row was at least 28 px (44 px with a subtitle). - Table rows and headers are as tall as the active style says.
Behaviour change: 24 px under macOS and 40 px under Fluent at the
compact density, rising to the target size above it (Int UI rows to 32 px
at comfortable, 44 px at touch), where every table had 28 px rows under a
32 px header. A height the app sets still wins, here and for rows. - Tabs are as tall and as padded as the active style says.
Behaviour change: without atab_bar_height, 26 px under macOS and
32 px under Fluent (8 px padding) at the compact density and 44 px at
touch, where every tab was 50 px with 12 px padding. Int UI tabs stay
50 px, their padding growing with the density. - Scroll-bar thumbs are as long as the active style says.
Behaviour change: at least 28 px under macOS and 30 px under Fluent at
the compact density, where every thumb was held at 24 px. - Accent chrome a recipe builds follows high contrast.
Behaviour change: aFilledbutton's fill and a button's focus border
take the high-contrast palette, as the other accent controls did. - High contrast keeps each theme's own colours and reaches its targets.
Behaviour change: Int UI, macOS, Fluent and Material 3 lift their own
accent, focus ring, secondary text and selection until text reaches 7:1
and the ring 4.5:1. Before, every dark theme took Int UI's teal, and macOS
and Fluent kept black text on their accent below 4:1. - macOS and Fluent sliders under right-to-left layout.
Behaviour change: a horizontal slider runs from the right, so the knob
stays under the pointer and moves the way the arrow keys point. - macOS and Fluent vertical sliders. Behaviour change: the minimum
is at the bottom andArrowUpmoves the knob up; the knob used to sit
opposite to the value. - macOS and Fluent menus at touch densities. Behaviour change: the
separators, the shortcut column and amax_visible_itemscap follow the
density, as the rows did. macOS rows stay 22 px. - A menu row shows its pressed state while a pointer holds it.
Behaviour change: before, only Enter or Space showed it. - A breadcrumb crumb shows its hover, focus and link colours.
Behaviour change: before, every crumb painted in the secondary text
colour, and assistive technology could neither click nor focus it.
What's Changed
Full Changelog: v0.19.0...v0.20.0