Skip to content

v0.20.0

Choose a tag to compare

@github-actions github-actions released this 19 Oct 04:50
· 268 commits to main since this release
a94e2b2

Added

KDE Plasma

  • New crate teksilo-theme-kde, the KDE Plasma preset. light() and
    dark() are Breeze Light and Breeze Dark (ids kde.light, kde.dark);
    light_with_accent and dark_with_accent apply an accent as Plasma's
    colour settings do, PlasmaAccent lists Plasma's ten accent swatches with
    stable names for saving a choice, and from_scheme themes 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).
    KdePalette carries the whole resolved scheme.
  • Breeze chrome for the stock controls. Buttons (Filled as the default
    button, Ghost and Link flat), 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_desktop builds 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 its breezerc settings. native_theme
    gives that theme on a desktop using the Breeze widget style, None on 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-fonts feature embeds Noto Sans and Hack (about 5.6 MB; pass
    font_registrar() to TeksiloAppBuilder::register_fonts), and
    system-fonts uses 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 in math.
  • The theme-kde feature of teksilo, the preset in
    teksilo::prelude::kde. Its font features are not forwarded.
  • native_theme_kde() on TeksiloAppBuilder (TeksiloAppBuilderKdeExt,
    in the prelude). A window built in ThemeMode::Native on 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::FollowSystem is unaffected,
    and switching to Native at runtime re-tints but keeps the shapes the
    windows were built with.

Theming

  • PaintProjection. A theme registered with with_paint_projection
    paints its own colours in an inactive window and under the OS increase
    contrast preference; BuildContext::prefers_high_contrast reads the
    preference at build time.
  • A negative ShapeTokens::focus_ring_offset draws the focus ring
    partly or wholly inside the control; every stock ring follows it.
  • Style hooks for sizes and states. StandardItemStyle, TableStyle,
    TabStyle, ScrollBarStyle and ProgressBarStyle declare their row,
    header, tab, thumb and bar sizes at the active density;
    StandardItemStyle::selection_emphasis says whether a selection mutes
    with view focus or only with the window, and
    MenuItemStyle::pressed_label_role colours a pressed row's label.
    StandardItemStyle::min_height_decorated sets the height of a row with a
    check box or leading slot, and ProgressBarStyle::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::contrast and MotionTokens::scaled (durations
    times a desktop's animation-speed factor).

Platform and app

  • os_theme::query_native_desktop gives the desktop's colour report
    and, on KDE Plasma, the KDE desktop itself; OsThemeWatch reports each
    appearance change on Linux, reconnecting when the session bus goes away.
  • Native and follow-system themes update live. Under ThemeMode::Native
    or ThemeMode::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_theme answers each NativeThemeRequest
    with the app's own Native-mode theme, or None for IntUI in the desktop's
    colours; resolve_native_theme gives the theme a request resolves to,
    configured_native_theme() returns the installed factory, and
    presets::intui::from_os is 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-light and --theme kde-dark for Breeze's chrome,
    and --theme system for 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 update brings what is already installed to the tool's
    release: the probe harness, the project's agent instructions, and the
    teksilo-automation-mcp and cargo-teksilo-fmt binaries on PATH. It lists
    the changes and asks first; -y skips the question, -i asks per action
    and shows the equivalent command, --dry-run only lists. --agent limits
    it to the project's agent instructions, --user updates 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 status reports cargo-teksilo-fmt on a Fmt line, and the
    tool's own version on a Tool line; --json adds formatter,
    tool_outdated and tool_update_command.

Changed

Theming

  • Breaking. OsThemeColors is #[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 new OsThemeColors::new(scheme) or
    OsThemeColors::default() and assign fields, not a struct literal. It
    now implements PartialEq.
  • Breaking. MacOsMenuItemStyle and FluentMenuItemStyle are no
    longer unit structs
    ; they hold their MenuItemRecipe in recipe. Use
    ::default() for the compact sizes, ::for_tokens for a density's or
    ::new with 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::Native also 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 without busctl installed 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_DESKTOP must list KDE or KDE_FULL_SESSION be true,
    checked before GNOME. A name merely containing KDE no longer counts.
  • Native mode on KDE reads all of KDE's configuration.
    Behaviour change: every kdeglobals KDE reads, kdedefaults and
    XDG_CONFIG_DIRS included, 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 own kdeglobals was 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
    chosen AccentColor applies to a scheme the profile never wrote. The
    portal's accent is used only when no kdeglobals can 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
    and follow_system_theme keep 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 status prints the cargo install command 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 JSON state can now be older.
  • cargo teksilo update --user replaces agent install --user --force as the
    remedy status gives for a differing user-scope copy.
  • cargo teksilo init and update no longer ask when $CI or $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_height and
    recipe_tab_style::TAB_TOOL_WINDOW_HEIGHT.
    Nothing read them. Drop
    tool_window_height from a TabRecipe struct 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 a tab_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: a Filled button'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 and ArrowUp moves 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 a max_visible_items cap 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

  • feat: KDE Plasma (Breeze) theme preset and native KDE theming by @jacquetc in #17

Full Changelog: v0.19.0...v0.20.0