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.
* 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
This moves the title below the header row containing actions and the close button, allowing more room for the title and actions.
Also makes actions an `Element` instead of a `Vec<Element>`, providing more flexibility for developers.
This also changes `widget::column::with_children` and
`widget::row::with_children` to take an `impl IntoIterator` instead
of a `Vec`, like the `iced` variants of these functions do.
This shouldn't be a breaking change since passing in a `Vec` will still
compile and function exactly as before.
(Using `iced::widget::Column::from_vec` or
`iced::widget::Row::from_vec` isn't possible, since the elements of the
`Vec` aren't checked, so the size of the resulting `Column` or `Row`
won't adapt to the size of its children. Perhaps a new function could
be added to mirror `iced`'s?)