Repository navigation
native-theme v0.6.0 — egui connector, gpui-kit 0.7.0, the Basic page
Added
- native-theme-egui, the egui toolkit connector (egui 0.36.2). A
ThemeAtlascompiles a theme into egui's two base styles, a style per widget role and appearance variant, and a frame per container surface;installputs them into anegui::Context, andnative_scope,native_set_style,role_modifierandsurface_frameapply the per-widget ones through egui's own seams. Icons follow the theme's icon set and, per colour scheme, its freedesktop icon theme; the platform's typeface is installed with featuresystem-fonts(default); aThemeWatcher(featurewatch) rebuilds on an OS theme change.mapping.tomlstates where every theme value lands, and the crate's docs render it. Every border colour is painted as stated:defaults.border.opacityis already folded into it, and no connector multiplies a colour by it. The showcase,showcase-egui, is the gpui showcase's application in egui, with per-instance Widget Info generated from the manifest; with--screenshotit captures the window with its title bar on macOS and Windows (through xcap), as the gpui and iced showcases' captures do, and refuses elsewhere, where the capture scripts take the window. - native-theme-egui-widgets, a companion crate of the egui connector: the widgets egui's own cannot draw from a theme — a switch, a slider whose knob is not its rail, a spinner at the theme's stroke and a segmented control — and egui's links, drop-down, radio button, progress bar and expander wrapped in what the theme states for them. Everything it draws comes from the
ResolvedThemeof the atlasnative-theme-eguiinstalled. Targets egui 0.36.2. - native-theme: font matching by family, weight and style —
fonts::select_faceoverfonts::FaceTraits, and behind the newsystem-fontsfeaturefonts::system_face, whoseSystemFace::familyis the family the font database records for the face;fonts::is_macos_system_ui_family. - native-theme:
IconIdconverts from any&TwhoseTimplementsIconProvider, so a loader takes a generated icon enum by reference —MaterialLoader::new(&AppIcon::PlayPause), as native-theme-build's README shows; it needed a cast to&dyn IconProviderbefore. - native-theme:
SystemTheme::icon_theme_for(mode), the icon theme of either variant. - native-theme:
icons::colorize_monochrome_svg, one colouriser for every connector. - native-theme:
SfSymbolsLoader::color/color_optandSegoeIconsLoader::color/color_optdraw the system sets' monochrome glyphs in a chosen colour, keeping their alpha, asFreedesktopLoader::colordoes for symbolic icons. Without a colour the output is unchanged (Segoe glyphs white, SF Symbols black); full-colour stock icons (SIID_*,IDI_QUESTION) ignore it. - native-theme-iced: the
system-fontsfeature (default) andsystem_font_family, the family iced's font database holds for the stated face — on macOS the system UI font's own name for "SF Pro". - Showcases:
--pointer X,Yholds the pointer at a point of the window and--pressholds the primary button down there, so a capture shows a control hovered or pressed where nothing can move the real pointer, as in a nested compositor. A value that is notX,Yis reported, and the showcase exits with 1. - Showcases: a Basic page in all three, their default page and the one every capture shows: the controls all three draw — buttons, checkboxes, radio buttons, text and a link, text fields, a drop-down, a slider, a progress bar and a tooltip — in the same order, labels and states, packed onto one screen, so the three captures compare control by control. Each page is laid out by the theme: groups and columns
layout.section_gapapart and inset bylayout.window_margin, headings intext_scale.section_heading, body text indefaults.line_height; buttons, text fields and the drop-down at the theme's minimum sizes (in egui per call, since the connector leavesbutton.min_widthandinput.min_heightto the application; in iced throughat_leastandcontrol_line_height); the link underlined wherelink.underline_enabledsays so, and unpadded, as the theme states no padding for a link; the gpui tooltip built by the application and refined bygeometry::tooltip, and the iced one padded as the theme states where all four sides agree. - native-theme-gpui:
geometry::input_fill(n, disabled), anInput's fill frominput.background_colororinput.disabled_background(gpui-component fills a light-theme field with the window background, and noThemeColorfield reaches it), andgeometry::link, which honourslink.underline_enabled(gpui-component underlines every link at rest) and carrieslink.font's size and weight. The showcase applies both. - native-theme-gpui:
geometry::button_disabled, a disabledButton's fill and label colour frombutton.disabled_background(orbutton.background_color) andbutton.disabled_text_color: gpui-component paints its own faded literals and then replays the caller's refinement over them, so the platform's pair arrives. The showcase applies it to its disabled Buttons (kde-breeze:#f0f0f0and#a8a9aa; the window showed through at half opacity). - native-theme-iced: minimum sizes.
control_line_heightgives a text input's or a pick list's text the line height that makes the controlinput.min_heightorcombo_box.min_heighttall inside its padding (iced has no minimum-height setter);button_content_min_sizeandat_leastput a floor ofbutton.min_width×button.min_heightunder a button's label.combo_box_paddingis the pick list's padding,padding_inside_borderthe rule the padding helpers share. - native-theme:
checkbox.radio_dot_diameter_px(CheckboxTheme::radio_dot_diameter), the dot a selected radio button draws, an optional size likemenu.row_height: KDE 6, GNOME 8 and Windows 12 (docs/platform-facts.md§2.5: Breeze'srenderRadioButton, libadwaita'sbullet.svg, WinUI'sRadioButtonCheckGlyphSize). macOS publishes none, so there it stays unstated and each toolkit draws its own dot. The kde-breeze, adwaita and windows-11 presets, their live presets, and the KDE and Windows readers state it. - native-theme-gpui:
widgets::Radiodraws that dot, incheckbox.indicator_colorand centred in the circle, instead of gpui-component's check glyph. - native-theme-iced:
radio(&resolved, radio(..), is_selected), a radio at the platform's indicator size and label gap instyles::radio, with the stated dot laid over iced's own (iced draws its dot at half the circle, andradio::Stylehas no size for it). - native-theme-egui-widgets:
radio_button::RadioButton, egui's radio button in the checkbox role's scope with the stated dot (egui sizes its dot from the check mark's box); the egui showcase's Basic page uses it. - native-theme:
checkbox.radio_indicator_width_px(CheckboxTheme::radio_indicator_width), the radio circle's width where it differs from the check box'sindicator_width: Material 20 against its 18 (comp.radio-buttonicon-size,docs/platform-facts.md§2.5); KDE, GNOME, Windows and macOS size both alike, so there it is unstated and the radio isindicator_widthacross. gpui'swidgets::Radio, the iced connector'sradioand egui-widgets'RadioButtondraw it. - native-theme:
switch.unchecked_thumb_diameter_pxandswitch.unchecked_thumb_background(SwitchTheme), an off switch's thumb where the platform draws it apart from the on one (docs/platform-facts.md§2.21): Material 16 across inoutline(#79747e, dark#938f99) against 24 inon-primary; WindowsToggleSwitchKnobFillOff,TextFillColorSecondary(#0000009e, dark#ffffffc5); GNOME dark libadwaita's$slider_color, white 80 % over the view background (#d2d2d2). Unstated, the off thumb isthumb_diameteracross inthumb_background. gpui'swidgets::Switch, the iced connector'sswitchandstyles::toggler, and egui-widgets'Switchdraw it; egui's thumb grows as it travels. - native-theme: the active tab's indicator line (
docs/platform-facts.md§2.11):tab.active_indicator_color,tab.active_indicator_width_pxandtab.active_indicator_side(a new enum,TabIndicatorSide::Top/Bottom). Breeze fills aTabBar_ActiveEffectSize3 strip ofHighlightalong a North tab's top edge; libadwaita's GtkNotebook insets 4 of--accent-bg-colorat the bottom; Material's primary tabs a 3primaryindicator at the bottom; WinUI's TabView and AppKit's NSTabView mark the active tab by fill and border alone, so there all three stay unstated. The kde-breeze, adwaita and material presets state them, the live presets the width and side, and the KDE and GNOME readers the colour (the selection background, the portal accent). - native-theme-gpui:
widgets::TabBardraws the line across the selected tab's outer edge (TabLook::indicator,widgets::TabIndicator). - native-theme:
button.checked_backgroundandbutton.checked_text_color, a toggle button that is on (docs/platform-facts.md§2.3): Breeze's button colour mixed an eighth towards the button text (#e1e1e2, dark#43464a) in the button text; WinUI'sToggleButtonBackgroundChecked, the accent fill, inTextOnAccentFillColorPrimary; libadwaita's$button_checked_color, the pressed fill's 30 %, in the button's own text; Material'slatesttonalselected-container-colorsecondaryinon-secondary. AppKit states none, so there a toggle that is on shows the pressed pair, as every toggle did before. The KDE reader computes the pair fromkdeglobals, the Windows reader the fill from the accent. - native-theme-gpui:
geometry::button_checked, a selected Button's fill and label from the checked pair (the pressed pair where unstated); the showcases' Basic toggleOnshows the checked pair in all three. - native-theme-iced:
tab_indicator, a tab with the line stacked over it where it is active, andtab_indicator_line, the line alone; the iced showcase's tab rows use the first, itsiced_awBasic tab bar the second. - native-theme-egui-widgets:
progress_bar::ProgressBar, egui's progress bar roundedprogress_bar.border.corner_radiusand outlined asprogress_bar.borderstates (egui's draws no outline); the egui showcase's Basic page uses it. - native-theme-iced:
pick_list_handle, the drop-down arrow as the open chevron KDE, GNOME and Windows draw — iced's ownIced-Iconschevron glyph (U+E803) atcombo_box.arrow_icon_size, whereHandle::Arrowis a filled triangle; the iced showcase's drop-downs use it. - native-theme:
docs/platform-facts.md§2.10 states the progress bar's border: Breeze strokes groove and contents with a 1.001px pen, the groove in the window text atframeContrast0.2 (#23262933, dark#fcfcfc33); libadwaita and WinUI draw none. kde-breeze states that colour and a 1px width, adwaita and windows-11 a width of 0; the KDE reader derives the colour fromkdeglobals. - native-theme:
tab.item_gap_px(TabTheme::item_gap), the space between neighbouring tabs, an optional size liketoolbar.item_gap: 0 on KDE (QTabBar lays tabs edge to edge), GNOME (GtkNotebook) and Windows (TabView), none on macOS (docs/platform-facts.md§2.11). egui writes it into the tab scope'sitem_spacing.x; gpui'swidgets::TabBarand the iced showcase's tab rows lay their tabs that far apart. - native-theme:
checkbox.check_mark_stroke_width_px(CheckboxTheme::check_mark_stroke_width), the check mark's line: KDE 2 (Breeze's check pen,PenWidth::Frame * 2), GNOME 2 (libadwaita 1.10.0'scheck.svg; 1.7–1.9 draw 2.5), none on Windows (a font glyph) and macOS (docs/platform-facts.md§2.5). egui strokes its check in the checkbox scope'sfg_stroke, which carries it; gpui'swidgets::Checkboxpaints gpui-component's own check polyline at that width; the iced showcase paints a tick at it over iced's glyph. - native-theme: the expander's structure (
docs/platform-facts.md§2.27), KDE's expander being KWidgetsAddons'KCollapsibleGroupBox:expander.arrow_side(a new enum,ArrowSide::Leading/Trailing; KDE and macOS lead, GNOME'sAdwExpanderRowand WinUI trail),arrow_gap_px(KDE 9, GNOME 9, Windows 30),content_indent_px(KDE 20, GNOME 0, Windows 16) andframe_enabled(KDE no, GNOME and Windows yes), all optional. - native-theme:
[text_area](TextAreaTheme), the multi-line field's padding, which differs from the single-line field's: KDE 5 (Breeze's QTextEdit frame 2 plus QTextDocument'sdocumentMargin4, less the frame line; measured on a real Breeze QTextEdit), GNOME 0 (GtkTextView), Windows 10 / 6 / 5 / 6 (the same TextBox), none on macOS (docs/platform-facts.md§2.29). Its border's colour, radius, width and shadow inheritinput.border's; everything else of a text area isinput's. - native-theme-egui:
text_area_marginandtext_area_frame, a multi-lineTextEdit's margin and frame fromtext_area.border, asinput_marginandinput_frameare the single-line field's. - native-theme-egui-widgets:
expander::Expander, an expander laid out asexpander.arrow_side,arrow_gap,content_indentandframe_enabledstate (egui'sCollapsingHeaderties the arrow, the title and the body to one indent, always leads with the arrow and frames the header alone); egui's ownCollapsingHeaderwhere the theme states none. The egui showcase's Basic page uses it. - native-theme-gpui:
geometry::text_area, the refinement for a multi-lineInputorTextareafromtext_area.border: the root padded by the rest of each stated side past the editor padding upstream gives the field in render (a side below it stays upstream's). - native-theme-iced:
text_area_padding, aTextEditor's padding fromtext_area.border, iced's own 5 on a side the theme leaves unstated. - Showcases: the expanders follow
expander.arrow_side,arrow_gap,content_indentandframe_enabledin all three, and the text areas the text area's own padding. - native-theme:
fonts::substitute_family(family), the family a system withoutfamilydraws it in: fontconfig's substitute (fc-match) on Linux,Noneon macOS and Windows, whose fallback has no documented source to follow. - native-theme-egui: a theme font family the system lacks is drawn in
fonts::substitute_family's substitute, as every native Linux application gets it, instead of egui's own face;Note::FontFamilyUnavailablegainssubstitute, the family drawn instead. - native-theme-gpui:
font_family, the family gpui draws a theme family in — the substitute where the system lacks it — behind the newsystem-fontsfeature (default). - native-theme-gpui:
widgets::Partandwidgets::PartBounds:on_part_boundsonCheckbox,Radio,Switch,Slider,ProgressBarandTabBarreports the rectangle each part was painted in. - native-theme-egui-widgets:
parts::Parts, the rectangles a widget painted its parts in. - Showcases:
docs/showcase-elements.toml, one list of the elements the three showcases share — chrome and Basic page, each with the theme leaves it draws. Widget Info shows the hovered element from it in one format in all three: its name and state, a row per leaf with the resolved value and one line on how that toolkit applies it, insidebar.font.--dump-layout FILEwrites every listed element's rectangle,--open-menu themeopens the Theme menu for a capture, andscripts/check_showcase_parity.pycompares the three showcases' dumps and captures element by element — sizes, positions and sampled colours — failing on any differencedocs/showcase-exceptions.toml[parity]does not give a reason for. - native-theme-iced: the
advanced-shapingfeature (default) kerns every text of the application, as Qt, GTK, WinUI and AppKit do: it turns oniced_core'sadvanced-shaping, which makesShaping::Advancedthe default of every text that sets none, where iced's own default shapes ASCII text with the glyphs' advances alone (Shaping::AutopicksBasic). Cargo builds oneiced_corefor the application and the connector, so depending on the connector is enough; the README and crate docs say so under Kerning. - native-theme-gpui: icon mappings for gpui-component 0.7.0's
IconName::Ban,CircleAlertandRefreshCw(Lucideban,circle-alert,refresh-cw; Materialblock,error,refresh; freedesktopaction-unavailable,emblem-important,view-refresh), andicon_name(IconRole::ActionRefresh)now returnsRefreshCw. - Showcases (gpui): the Buttons page shows gpui-component's
Toolbarwith two labelledToolbarGroups; the Inputs page aTimeFieldand anInputholding an inline token; every chart states the tooltip and guide line it draws on hover; the icon gallery has gpui-component's 104 icons.
Changed
-
native-theme:
defaults.border.opacityis the share of the text colour already folded into every stated border colour — Breeze'sframeContrast0.2, libadwaita's--border-opacity0.15, WinUI none (docs/platform-facts.md§2.1.6) — andborder.coloris the final line colour: no connector multiplies a colour by it. native-theme-egui no longer folds it into the strokes ofdefaults.border.color, which on kde-breeze faded#bcc0bfto 20 %. -
native-theme: one disabled mechanism per platform, and connectors apply both. A disabled widget is painted in its disabled colours and faded by its
disabled_opacity; the data makes the one the platform does not use an identity (docs/platform-facts.md§2.1.6). kde-breeze and windows-11 (and their live presets) statedefaults.disabled_opacity = 1.0(was 0.5 and 0.3): Breeze and WinUI dim by colour alone; so does material (was 0.38), whose disabled colours carry Material 3's per-part 0.12 and 0.38. adwaita states no disabled fills (aNonedisabled fill is the enabled one) and its enabled text colours as the disabled ones (defaults.disabled_text_color#2e3436/#ffffff, was#cccccc/#4a4a4e): libadwaita dims by--disabled-opacity50 % alone. A widget with nodisabled_opacityof its own (menu, list, link) fades by the defaults'. -
native-theme: kde-breeze's disabled colours are Breeze's Disabled palette, computed with KColorScheme 6.30.0 from
[ColorEffects:Disabled](docs/platform-facts.md§2.1.6): text#a0a1a3/ dark#686a6c(was#bcc0bf/#4d545b); button and drop-down#f0f0f0on#a8a9aa/ dark#272a2eon#6d6f72(dark was#3a3f44on#4d545b); text field#f3f3f3on#aaabac/ dark#131517on#606263(was#f0f0f0,#282c30); checkbox box#f0f0f0/#272a2e, label#a0a1a3/#686a6c; menu#a0a1a3/#686a6c; list#aaabac/#606263; link#a3cae2/#164160. -
native-theme: kde-breeze's
combo_box.arrow_icon_size_pxis 10, Breeze'sArrowSize(renderArrowdrawsmin(w, h, 10)), in the 20px arrow columnarrow_area_widthstates (was 20).docs/platform-facts.md§2.24 records that the drop-down arrow is an open chevron on KDE, GNOME and Windows. -
native-theme: kde-breeze's
progress_bar.fill_coloris Breeze's, the accent at alpha 0.7 over the window,#72c2eb/ dark#3584ae(KColorUtils::overlayColors, computed with Qt 6.11.2); the KDE reader computes it fromkdeglobalsin Qt's own arithmetic. -
native-theme: windows-11's list item padding is 16 left / 12 right, WinUI's
DefaultListViewItemStylePadding="16,0,12,0"(was 12 / 12,ListViewItemExpanded's); the Windows reader agrees. -
native-theme:
docs/platform-facts.md§2.26: GNOME's.cardhas no CSS border — its outline is a 1px box shadow at 3 % — so itsborder.colorandborder.line_widthare none. -
native-theme-egui: a
Disabledcell carries its role'sdisabled_opacityasdisabled_alpha(the defaults' for menu, list and link), which egui fades a disabled widget by on top of the disabled colours; it was1.0. A primary button with no stated disabled fill keeps its own pair, faded. -
native-theme-egui-widgets: the drop-down's arrow is an open chevron over egui's arrow rectangle, stroked in the state's
fg_stroke, where egui fills a triangle; on kde-breeze, with its 10px arrow, the drop-down iscombo_box.min_height, 32, tall (it was 34). A widget added to a disabledUiopens itsDisabledscope too. Disabled widgets are faded by their role'sdisabled_opacity. -
native-theme-iced: every disabled style multiplies the alpha of each colour it emits by the widget's
disabled_opacity(iced has no widget opacity): buttons, links, text fields and editors, checkboxes, togglers andiced_awselection lists. A disabled checkbox with no stated disabled fill is its enabled box; a disabled class button (primary, danger, …) with none keeps its own pair. -
native-theme-gpui:
widgets::Checkbox,Radio,SwitchandSliderfade a disabled control by itsdisabled_opacity(CheckboxLook,SwitchLookandSliderLookgainopacity); a disabled checkbox with no stated disabled fill is its enabled box.geometry::button_disabledandgeometry::input_fill(n, true)carrydisabled_opacityas the refinement's opacity, and a disabled field with no stated disabled fill takes its enabled fill (it kept gpui-component's own). -
native-theme: kde-breeze's checkbox and radio button are Breeze's: a checked indicator is the button colour under the selection colour at
Metrics::Blend_Value0.3 (#c2e4f6, dark#2f5368), outlined in the selection colour, with its mark in the View text colour (#232629, dark#fcfcfc); an unchecked one is outlined in Breeze'sseparatorColor()(#c6c8c9, dark#4c4e51), and the dark one is filled with the button colour (#292c30). They were a solid accent box with a white mark. The KDE reader computes them fromkdeglobals. -
native-theme: in
docs/platform-facts.md§2.5, GNOME'sindicator_widthis 20 — libadwaita's 14px minimum plus its 3px padding on each side, as GTK sizes it — which the adwaita preset already stated. -
native-theme: in
IconSet::SegoeIcons,ActionSearch,ActionSettings,ActionDeleteandActionPrintare the Segoe Fluent glyphsSearch(U+E721),Settings(U+E713),Delete(U+E74D) andPrint(U+E749), like the other action roles; they were the full-colour shell stock iconsSIID_FIND,SIID_SETTINGS,SIID_DELETEandSIID_PRINTER. -
Showcases: all three open at 1280 × 720. With
--screenshot, or the new--capturefor a capture another tool takes, the window opens at that size whatever size the desktop remembers for it, and every capture path fails, with the measured and the expected size, unless the capture is of a window at that size. The macOS screenshot runner's display is switched to 1920 × 1080, which no longer clamps the window to 1024px. -
native-theme-gpui: on macOS, a family that names the system UI font — "SF Pro", or the name the live reader reports — is drawn as gpui's
.SystemUIFont. -
native-theme-gpui:
geometry::tooltipcarriestooltip.background_colorandtooltip.border.color: gpui-component paints a tooltip with the popover's fill and the window's border, so kde-breeze's#f7f7f7tooltip was white and adwaita's dark one light. -
native-theme-iced:
button_paddingandinput_paddingadd the border's line width to each side the theme states: the theme's padding lies inside the border, while iced lays content out from the widget's edge and paints the border over the padding, so a themed button's or field's content sat one border width closer to the edge than the platform's. -
Showcases: the iced showcase lays its text out in the theme's line boxes: body text at
defaults.line_heightand text-role text at the role'sline_height(iced's own is 1.3 times the size). -
Showcases: the gpui showcase sets its section headings in the theme's section-heading role (
text_scale.section_heading: size, line height and weight), as the iced showcase does; they were semibold body text (kde-breeze: 16px regular, was 13.33px semibold). -
native-theme-iced:
custom_icon_to_svg_handleandcustom_icon_to_image_handleload a provider's system-set icon throughFreedesktopLoader,SfSymbolsLoaderorSegoeIconsLoaderincolor;custom_icon_to_image_handlegains thatcolor: Option<Color>parameter, so an SF Symbol or a Segoe glyph arrives in it instead of its fixed black or white. -
native-theme: the kde-breeze, adwaita and macos-sonoma presets state
link.hover_backgroundas transparent: the platforms draw no background under a hovered link (docs/platform-facts.md§2.28 gives none for macOS, KDE and GNOME), and the presets stated the accent at 9% alpha (#3daee918,#3584e418,#007aff18), which the iced showcase painted. -
Development: an MSRV job in CI (the workspace floor
1.88.0, and the connectors' own floors); the egui connector in every gate that names connectors; the widget-coverage script covers egui and egui_extras; the screenshot pipeline captures the egui showcase; the scripts are named by task group (check_,update_,generate_), andpre-release-check.shis nowscripts/check_release.sh. -
native-theme: kde-breeze states no toolbar frame (
toolbar.border.line_width_px0, Breeze'sToolBar_FrameWidth,docs/platform-facts.md§2.13); it inherited the default border's 1px. -
native-theme-iced:
combo_box_paddingalso centres the arrow incombo_box.arrow_area_width(docs/platform-facts.md§2.24). -
Showcases: the Basic page holds every control all three toolkits draw, in five columns: buttons (with a toggle pair), checkboxes, radio buttons, a drop-down; text inputs (with a focused one), a text area, a slider; switches, a number input, a spinner, a segmented control, a card; typography (caption to display, a link, monospace), a separator, a progress bar, a list; icon buttons and icons, tabs, an expander and a table. The list shows three of its eight rows and the table two rows, the second selected. Where a preset's controls are too wide for five columns the page takes four, or three, counted from the theme alone in all three showcases: the most columns whose width holds
combo_box.min_width, the two tabs attab.min_width, and the page's own control widths, in the content panel lesslayout.window_marginand thescrollbar.groove_widtha scrolling page keeps free (material: four); the fifth column's groups then end the other four. A row of controls wider than its column wraps onto a further line, the drop-down is at leastcombo_box.min_widthwide in all three, and a page taller than its panel scrolls vertically, at rest at the top, never sideways. -
native-theme-gpui:
widgets::TabBar::wrap, tabs that wrap onto a further row where the bar is too narrow, instead of scrolling sideways. -
native-theme-egui-widgets:
segmented_control::SegmentedControl::wrap, segments that wrap onto a further line inside the one outline where theUiis too narrow. -
Development:
scripts/check_showcase_parity.pytakes a colour sample only where it is visible: inside the window and inside every ancestor the element list marksclip = true(the content panel a page scrolls in); a sample elsewhere is counted as "not visible" and left out of the comparison, while geometry is compared from the dumps, which hold off-screen elements too. -
native-theme: kde-breeze's single-line input pads 7 horizontally and 6 vertically inside its frame line (was 6 / 3): Breeze insets a line edit's contents
LineEdit_FrameWidth6 from its outer edge, the 1px line the outermost of those, and QLineEdit sets its text 2 across and 1 down further in; a real Breeze QLineEdit measured 2026-09-28 agrees (docs/platform-facts.md§2.4). The KDE reader agrees. -
native-theme: material's outlined text field, text area and drop-down pad 15 inside their 1px outline (the drop-down 15 leading, 11 trailing), where material-web sets their content 16 (and the arrow's 12) from the field's edge and lays the outline over that space (
field/internal/_outlined-field.scss,outline-width1;docs/platform-facts.md§2.4, §2.24, §2.29); they stated 16 and 12, which the connectors draw inside the outline, so the fields were 2px taller and wider than Material's. -
native-theme-gpui: requires gpui-component and gpui-base 0.7.0 and gpui-pre 0.3.7 (gpui-kit 0.7.0 for the showcase).
ThemeColor::chart_grid, new in gpui-component 0.7.0, takeslist.grid_color, on the direct and the config path; the nativeSwitchdraws the keyboard focus ring while focused, as gpui-component 0.7.0's own switch does;geometry::toolbarsets the height to the content's (at leasttoolbar.bar_height), which replaces the fixedh_8of gpui-component's newToolbar. -
native-theme-gpui: documented which resize handles the splitter colours reach — groups built with gpui-base's
h_resizable/v_resizable, at gpui-base's 1px; not gpui-component's,Settings' divider or the dock's edges, which install gpui-component's own renderer — and thatgpui_kit::initmust run before the first window opens, or the window's first dialog, sheet or notification panics in gpui-component and its rem stays gpui's default (gpui_kit::open_windowin the Quick start).
Fixed
- native-theme-gpui, native-theme-iced, native-theme-egui-widgets: a disabled switch, check box or radio button on a platform that dims by opacity (GNOME,
docs/platform-facts.md§2.1.6) fades as one widget over what lies under it, as libadwaita'sfilter: Opacity(..)does: its thumb or mark keeps its colour on the track or fill, and the whole fades over the backdrop, the window'sdefaults.background_colorunless the caller names another. Each toolkit faded every part on its own, so the thumb showed through the faded track (adwaita's disabled switch thumb#cbdff7, dark#95a9c2; now#fcfcfdand#909092). gpui'sCheckbox,RadioandSwitchgainbackdrop(CheckboxLook::faded_over,SwitchLook::faded_over); the iced connector gainsswitch_over,styles::checkbox_overandstyles::toggler_over; egui-widgets'SwitchandRadioButtongainbackdrop, andfade::fade_as_onedoes the same for egui's own check box. - native-theme-egui-widgets: the painted
Spinnerarc always sweeps 240°, as the iced and gpui spinners do; egui's240° · sin(t)shrank it to a dot twice a cycle, which a capture could catch — on adwaita, whose icon theme (adwaita-icon-theme 50.0) ships noprocess-workingindicator, so that every connector paints the arc, the egui Basic page's spinner showed as a short tick. - Showcases: the egui showcase frames an open menu in
popover.border's colour, line width and radius, as the gpui and iced showcases do; it framed it indefaults.border's, so material's menu had an outline Material's has not. - Showcases: the egui showcase's toolbar is
toolbar.bar_heighttall where the theme states one, itslayout.container_marginpadding inside that height as in the gpui and iced showcases (material: 64, it was 72). - native-theme: dropping a GNOME or Budgie theme subscription returns at once instead of waiting for the next portal signal.
- native-theme-gpui:
custom_icon_to_image_sourcedraws a provider's SF Symbols and Segoe glyphs incolor; they were black and white whatevercolorwas. The provider's freedesktop icons load throughFreedesktopLoader::colortoo. - Showcases (gpui): on gpui-kit 0.7.0, whose dialogs and sheets sit beside the view, the command palette's entries and the keyboard shortcuts work while a dialog or sheet has the focus (the actions are handled by a root plugin around the whole window); the capture pointer shield covers dialogs, menus and popovers, which it never covered.
- Development: the visual-assets provenance stamp (
scripts/update_provenance.sh) and the egui compatibility stamp (scripts/update_compatibility.sh, which now also runs its tests, clippy and docs) covernative-theme-egui-widgets, which the egui showcase draws with; before, a change there left both stamps fresh. - Showcases (egui): the theme settings' drop-down rows are truncated to the drop-down's width, the whole text on hover: the icon-theme row naming why the system's theme is unavailable could carry a reader's whole error and widen the popup far past the window, where nothing in it could be clicked.