Introduces a multi-layered testing strategy for the libcosmic widget toolkit:
- Visual snapshot testing: Renders widgets via tiny-skia software renderer and
compares pixel output against reference PNGs. Generates diff images on failure.
Covers containers, dividers, text styles, progress bars, and layouts.
- Widget unit tests: Thorough behavioral tests for segmented button model
(selection, ordering, data storage, enable/disable, closable, indent),
calendar model (month navigation, year wrapping, date selection, grid layout),
spin button (clamping, increment/decrement, float support), and color picker.
- Property-based tests (proptest): Randomized input testing for spin button
bounds invariants, calendar first-day-of-week correctness, segmented model
length/clear/toggle invariants, and theme spacing monotonicity.
- Theme consistency tests: Validates all four theme variants (dark, light,
high-contrast dark/light) have valid spacing, corner radii ordering,
non-zero-alpha colors, visible text-on-background, and RON round-trip
serialization.
- Expanded inline tests: 16 new spin_button unit tests covering increment,
decrement, clamping, float types, and constructor value bounds.
- CI integration: New visual-tests job runs snapshot, theme, property, and
widget tests with artifact upload on failure for snapshot diffs.
https://claude.ai/code/session_01P3WLXMif9wmNXbWDo5FhRQ
This sets the main content and the header bar to transparent when `content_container` is true, so that things aren't colored twice and overlayed on top of each other.
This ensures that modifying color alpha behaves as expected, especially for frosted glass.
This converts `ScrollDelta::Pixels` and `ScrollDelta::Lines` into
integer values, accumulating partial scrolls until a full integer is
reached.
It also has a configurable rate-limit, so discrete integer events can
occur at a certain maximum frequency. This may need tuning for different
use cases, though I haven't tried using it for things other than
changing workspaces so far.
Implement get_config_dir() and get_state_dir() helper functions that detect
Flatpak sandboxing via FLATPAK_ID and use HOST_XDG_CONFIG_HOME/HOST_XDG_STATE_HOME
environment variables or fallback to HOME-based paths.
This allows libcosmic apps running in Flatpak sandboxes to properly read
system-wide COSMIC configuration (themes, corner radii, etc.) from the host.
#[cfg(not(unix))] applies to the host machine (since that's where the
build script is running) rather than the compilation target. Instead,
environment variables are available to provide the information relevant
to the build target at the build script's runtime.
* fix: compiling on windows requires cosmic-icons in project root
crabtime provides crabtime::WORKSPACE_PATH to refer to the
CARGO_MANIFEST_DIR of the top level crate being built, which means when
building libcosmic directly, crabtime::WORKSPACE_PATH will work, but
when building it as a dependency of another crate,
crabtime::WORKSPACE_PATH will no longer refer to the path to libcosmic.
I don't think there's a good workaround, since when in the context of
crabtime, CARGO_MANIFEST_DIR refers to the path to the crate generated
by crabtime rather than to libcosmic.
This replaces crabtime with a simple build.rs script that generates a
file in OUT_DIR.
* fix: do not generate icon bundle for unix targets
---------
Co-authored-by: Michael Aaron Murphy <michael@mmurphy.dev>
calendar.rs had some left over icon! macro_rules macros referencing now
deleted files.
bundle::get was defined twice on non-unix platforms.
A known remaining issue is that projects using libcosmic need to have
cosmic-icons in their project root, since the crabtime macro uses
crabtime::WORKSPACE_PATH rather than the path to wherever cargo puts
libcosmic's git submodule.
See: 639326fcc3