1786188233

This commit is contained in:
2026-08-08 13:23:53 +02:00
parent 8ff5cce9b2
commit 6ca45a3cd6
8 changed files with 61 additions and 528 deletions

4
build
View File

@@ -6,3 +6,7 @@ if [ $? -ne 0 ]; then
fi
scp target/release/dashboard trekstor:~/dashboard
ssh -t trekstor -- "systemctl --user restart dashboard"
git add .
git commit -am "$(date +%s)"
git push

View File

@@ -10,14 +10,35 @@ use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender};
slint::include_modules!();
#[derive(Clone)]
enum C2sMessage {
CallService(String, String, Option<Value>),
}
fn apply_state(app: &Weak<AppWindow>, state: State) {
app.upgrade_in_event_loop(move |app| {
// Lights
let lights = state
.domain("light")
.iter()
.filter(|light| {
!(light.entity_id.ends_with("screen")
|| light.entity_id.chars().any(char::is_numeric))
})
.map(Into::into)
.collect::<Vec<LightData>>();
app.set_lights(ModelRc::new(VecModel::from(lights)));
#[derive(Clone)]
enum S2cMessage {
EntityUpdated,
// Thermometers
let thermometers = state
.domain("sensor")
.iter()
.filter(|sensor| sensor.entity_id.ends_with("thermometer_temperature"))
.map(Into::into)
.collect::<Vec<ThermometerData>>();
app.set_thermometers(ModelRc::new(VecModel::from(thermometers)));
// Clock
if let Some(date_time_iso) = state.get("sensor.date_time_iso").as_ref() {
app.set_date_time(date_time_iso.into());
}
})
.ok();
}
#[tokio::main]
@@ -80,43 +101,14 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
Ok(())
}
fn apply_state(app: &Weak<AppWindow>, state: State) {
app.upgrade_in_event_loop(move |app| {
// Lights
let lights = state
.domain("light")
.iter()
.filter_map(|light| {
if light.entity_id.ends_with("screen")
|| light.entity_id.find(|c: char| c.is_numeric()).is_some()
{
return None;
}
#[derive(Clone)]
enum C2sMessage {
CallService(String, String, Option<Value>),
}
Some(light.into())
})
.collect::<Vec<LightData>>();
app.set_lights(ModelRc::new(VecModel::from(lights)));
// Thermometers
let badges = state
.domain("sensor")
.iter()
.filter_map(|sensor| {
if sensor.entity_id.ends_with("thermometer_temperature") {
return Some(sensor.into());
}
None
})
.collect::<Vec<ThermometerData>>();
app.set_badges(ModelRc::new(VecModel::from(badges)));
// Clock
if let Some(date_time_iso) = state.get("sensor.date_time_iso").as_ref() {
app.set_date_time(date_time_iso.into());
}
})
.ok();
#[derive(Clone)]
enum S2cMessage {
EntityUpdated,
}
#[derive(Default, Debug, Clone)]

View File

@@ -0,0 +1,3 @@
export component Calendar inherits Rectangle {
// ..
}

View File

@@ -0,0 +1,3 @@
export component Climate inherits Rectangle {
// ..
}

View File

@@ -0,0 +1,3 @@
export component Energy inherits Rectangle {
// ..
}

View File

@@ -8,6 +8,10 @@ import {
StandardTableView,
} from "std-widgets.slint";
import { Climate } from "./climate.slint";
import { Calendar } from "calendar.slint";
import { Energy } from "energy.slint";
export struct LightData {
id: string,
name: string,
@@ -54,7 +58,7 @@ component Clock {
}
component Thermometer inherits Rectangle {
in property <ThermometerData> badge;
in property <ThermometerData> thermometer;
border-radius: 16px + 19px;
border-width: 2px;
border-color: Palette.alternate-background;
@@ -66,13 +70,13 @@ component Thermometer inherits Rectangle {
padding-right: parent.border-radius / 2;
Text {
text: badge.name;
text: thermometer.name;
height: 16px;
font-weight: 100;
}
Text {
text: "\{badge.value} \{badge.unit}";
text: "\{thermometer.value} \{thermometer.unit}";
height: 19px;
font-size: 19px;
font-weight: 500;
@@ -88,7 +92,7 @@ export component AppWindow inherits Window {
property <int> page: 0;
in property <DateTimeData> date-time;
in property <[ThermometerData]> badges;
in property <[ThermometerData]> thermometers;
in property <[LightData]> lights;
callback toggle-light(string);
@@ -107,8 +111,8 @@ export component AppWindow inherits Window {
height: parent.height;
}
for badge[index] in root.badges: Thermometer {
badge: badge;
for thermometer[index] in root.thermometers: Thermometer {
thermometer: thermometer;
}
Rectangle {
@@ -126,40 +130,9 @@ export component AppWindow inherits Window {
Rectangle {
preferred-width: root.width;
VerticalLayout {
if root.page == 0: Rectangle {
StandardTableView {
width: parent.width;
height: parent.height;
columns: [
{ title: "Header 1" },
{ title: "Header 2" },
];
rows: [
[
{ text: "Item 1" },
{ text: "Item 2" },
],
[
{ text: "Item 1" },
{ text: "Item 2" },
],
[
{ text: "Item 1" },
{ text: "Item 2" },
]
];
}
}
if root.page == 1: Rectangle {
background: red;
// pages go here
}
if root.page == 2: Rectangle {
background: yellow;
// pages go here
}
if root.page == 0: Climate { }
if root.page == 1: Calendar { }
if root.page == 2: Energy { }
Rectangle {
height: 64px;

152
samples
View File

@@ -1,152 +0,0 @@
Status Sample name
[G...] aarch64-ol7u9-linux-gnu
[G...] aarch64-ol8u10-linux-gnu
[G...] aarch64-ol8u6-linux-gnu
[G...] aarch64-ol8u7-linux-gnu
[G...] aarch64-ol8u8-linux-gnu
[G...] aarch64-ol8u9-linux-gnu
[G...] aarch64-ol9u2-linux-gnu
[G...] aarch64-ol9u3-linux-gnu
[G...] aarch64-ol9u4-linux-gnu
[G...] aarch64-ol9u5-linux-gnu
[G...] aarch64-rpi3-linux-gnu
[G...] aarch64-rpi4-linux-gnu
[G...] aarch64-unknown-linux-gnu
[G...] aarch64-unknown-linux-musl
[G...] aarch64-unknown-linux-uclibc
[G...] alphaev56-unknown-linux-gnu
[G...] alphaev67-unknown-linux-gnu
[G...] arc-arc700-linux-uclibc
[G...] arc-archs-linux-gnu
[G...] arc-multilib-elf32
[G...] arc-multilib-linux-gnu
[G...] arc-multilib-linux-uclibc
[G...] arm-bare_newlib_cortex_m3_nommu-eabi
[G...] arm-cortex_a15-linux-gnueabihf
[G..X] arm-cortexa5-linux-uclibcgnueabihf
[G...] arm-cortex_a8-linux-gnueabi
[G..X] arm-cortexa9_neon-linux-gnueabihf
[G..X] x86_64-w64-mingw32,arm-cortexa9_neon-linux-gnueabihf
[G...] armeb-unknown-eabi
[G...] armeb-unknown-linux-gnueabi
[G...] armeb-unknown-linux-uclibcgnueabi
[G...] arm-multilib-linux-uclibcgnueabi
[G...] arm-nano-eabi
[G...] arm-none-eabi
[G...] arm-ol7u9-linux-gnueabi
[G...] arm-ol7u9-linux-gnueabihf
[G..X] arm-picolibc-default
[G..X] arm-picolibc-eabi
[G..X] x86_64-unknown-linux-gnu,arm-picolibc-eabi
[G...] arm-unknown-eabi
[G...] arm-unknown-linux-gnueabi
[G..X] arm-unknown-linux-musleabi
[G...] arm-unknown-linux-uclibcgnueabi
[G..X] arm-unknown-linux-uclibcgnueabihf
[G...] armv6-nommu-linux-uclibcgnueabi
[G...] armv6-unknown-linux-gnueabi
[G...] armv6-unknown-linux-gnueabihf
[G...] armv7-rpi2-linux-gnueabihf
[G...] armv8-rpi3-linux-gnueabihf
[G...] armv8-rpi4-linux-gnueabihf
[G...] avr
[G...] bpf-unknown-none
[G..X] hppa-unknown-linux-gnu
[G...] i586-geode-linux-uclibc
[G...] i686-centos6-linux-gnu
[G...] i686-centos7-linux-gnu
[G...] i686-nptl-linux-gnu
[G...] i686-ol8u6-linux-gnu
[G...] i686-ol8u7-linux-gnu
[G...] i686-ol8u8-linux-gnu
[G...] i686-ol9u2-linux-gnu
[G...] i686-ubuntu14.04-linux-gnu
[G...] i686-ubuntu16.04-linux-gnu
[G..X] i686-w64-mingw32
[G..X] lm32-unknown-elf
[G..X] loongarch64-unknown-linux-gnu
[G..X] loongarch64-unknown-linux-musl
[G...] m68k-unknown-elf
[G...] m68k-unknown-linux-gnu
[G...] m68k-unknown-uclinux-uclibc
[G...] powerpc-unknown-linux-uclibc,m68k-unknown-uclinux-uclibc
[G...] mips64el-multilib-linux-uclibc
[G...] mips64-ol9u5-linux-gnu
[G...] mips64-unknown-linux-gnu
[G...] mips-ar2315-linux-gnu
[G...] mipsel-multilib-linux-gnu
[G...] mipsel-sde-elf
[G...] mipsel-unknown-linux-gnu
[G...] mips-malta-linux-gnu
[G...] mips-unknown-elf
[G...] mips-unknown-linux-gnu
[G...] mips-unknown-linux-uclibc
[G..X] moxie-unknown-elf
[G..X] moxie-unknown-moxiebox
[G..X] x86_64-multilib-linux-uclibc,moxie-unknown-moxiebox
[G..X] msp430-unknown-elf
[G...] nios2-altera-linux-gnu
[G..X] i686-w64-mingw32,nios2-spico-elf
[G...] nios2-unknown-elf
[G..X] or1k-unknown-elf
[G..X] or1k-unknown-linux-gnu
[G..X] or1k-unknown-linux-musl
[G...] powerpc-405-linux-gnu
[G...] powerpc64le-unknown-linux-gnu
[G...] powerpc64-multilib-linux-gnu
[G...] powerpc64-unknown-linux-gnu
[G...] powerpc64-unknown-linux-musl
[G...] powerpc-8540-linux-gnu
[G...] powerpc-860-linux-gnu
[G...] powerpc-e300c3-linux-gnu
[G...] powerpc-e500v2-linux-gnuspe
[G...] x86_64-multilib-linux-uclibc,powerpc-unknown-elf
[G...] powerpc-unknown-linux-gnu
[G...] powerpc-unknown-linux-uclibc
[G...] powerpc-unknown_nofpu-linux-gnu
[G...] pru
[G...] riscv32-hifive1-elf
[G...] riscv32-picolibc-elf
[G...] riscv32-unknown-elf
[G...] riscv64-multilib-elf
[G...] riscv64-unknown-elf
[G...] riscv64-unknown-linux-gnu
[G..X] rx-unknown-elf
[G..X] s390-ibm-linux-gnu
[G..X] s390-unknown-linux-gnu
[G...] s390x-ibm-linux-gnu
[G...] s390x-unknown-linux-gnu
[G...] sh4-multilib-linux-gnu
[G...] sh4-multilib-linux-uclibc
[G...] sh-unknown-elf
[G...] sparc64-multilib-linux-gnu
[G...] sparc-leon-linux-uclibc
[G...] sparc-unknown-linux-gnu
[G..X] tic6x-uclinux
[G..X] tricore-none-eabi
[G...] x86_64-centos7-linux-gnu
[G...] x86_64-multilib-linux-gnu
[G...] x86_64-multilib-linux-musl
[G...] x86_64-multilib-linux-uclibc
[G...] x86_64-ol8u10-linux-gnu
[G...] x86_64-ol8u6-linux-gnu
[G...] x86_64-ol8u7-linux-gnu
[G...] x86_64-ol8u8-linux-gnu
[G...] x86_64-ol8u9-linux-gnu
[G...] x86_64-ol9u2-linux-gnu
[G...] x86_64-ol9u3-linux-gnu
[G...] x86_64-ol9u4-linux-gnu
[G...] x86_64-ol9u5-linux-gnu
[G..X] x86_64-w64-mingw32,x86_64-pc-linux-gnu
[G...] x86_64-ubuntu14.04-linux-gnu
[G...] x86_64-ubuntu16.04-linux-gnu
[G...] x86_64-unknown-linux-gnu
[G...] x86_64-unknown-linux-uclibc
[G..X] x86_64-w64-mingw32
[G..X] xtensa-fsf-elf
[G...] xtensa-fsf-linux-uclibc
L (Local) : sample was found in current directory
G (Global) : sample was installed with crosstool-NG
X (EXPERIMENTAL): sample may use EXPERIMENTAL features
B (BROKEN) : sample is currently broken
O (OBSOLETE) : sample needs to be upgraded

293
tree
View File

@@ -1,293 +0,0 @@
arrayvec v0.7.8
├── kurbo v0.13.1
│ ├── svgtypes v0.16.1
│ │ ├── resvg v0.47.0
│ │ │ ├── i-slint-common v1.17.1
│ │ │ │ ├── i-slint-core v1.17.1
│ │ │ │ │ ├── i-slint-backend-selector v1.17.1
│ │ │ │ │ │ └── slint v1.17.1
│ │ │ │ │ │ ├── dashboard v0.1.0 (/home/avii/source/rust/trekstor/dashboard)
│ │ │ │ │ │ └── trekstor v0.1.0 (/home/avii/source/rust/trekstor/trekstor)
│ │ │ │ │ │ └── dashboard v0.1.0 (/home/avii/source/rust/trekstor/dashboard)
│ │ │ │ │ ├── i-slint-renderer-software v1.17.1
│ │ │ │ │ │ └── slint v1.17.1 (*)
│ │ │ │ │ └── slint v1.17.1 (*)
│ │ │ │ ├── i-slint-renderer-software v1.17.1 (*)
│ │ │ │ └── slint v1.17.1 (*)
│ │ │ └── i-slint-core v1.17.1 (*)
│ │ └── usvg v0.47.0
│ │ └── resvg v0.47.0 (*)
│ └── usvg v0.47.0 (*)
├── lyon_geom v1.0.19
│ ├── i-slint-core v1.17.1 (*)
│ └── lyon_path v1.0.19
│ ├── i-slint-core v1.17.1 (*)
│ ├── i-slint-renderer-software v1.17.1 (*)
│ ├── lyon_algorithms v1.0.20
│ │ └── i-slint-core v1.17.1 (*)
│ └── lyon_extra v1.1.0
│ └── i-slint-core v1.17.1 (*)
├── polycool v0.4.0
│ └── kurbo v0.13.1 (*)
├── taffy v0.10.1
│ └── i-slint-core v1.17.1 (*)
└── tiny-skia v0.12.0
└── resvg v0.47.0 (*)
arrayvec v0.7.8
└── lyon_geom v1.0.19
└── lyon_path v1.0.19
├── i-slint-compiler v1.17.1
│ └── slint-macros v1.17.1 (proc-macro)
│ └── slint v1.17.1 (*)
└── lyon_extra v1.1.0
└── i-slint-compiler v1.17.1 (*)
euclid v0.22.14
├── i-slint-core v1.17.1 (*)
├── i-slint-renderer-software v1.17.1 (*)
└── lyon_geom v1.0.19 (*)
euclid v0.22.14
└── lyon_geom v1.0.19 (*)
font-types v0.11.3
└── read-fonts v0.39.2
├── fontique v0.10.0
│ ├── i-slint-common v1.17.1 (*)
│ └── parley v0.10.0
│ └── i-slint-core v1.17.1 (*)
├── harfrust v0.8.4
│ └── parley v0.10.0 (*)
└── skrifa v0.42.1
├── i-slint-common v1.17.1 (*)
├── i-slint-core v1.17.1 (*)
├── i-slint-renderer-software v1.17.1 (*)
└── parley v0.10.0 (*)
font-types v0.12.2
└── read-fonts v0.41.0
└── skrifa v0.44.0
└── swash v0.2.10
├── i-slint-core v1.17.1 (*)
└── i-slint-renderer-software v1.17.1 (*)
hashbrown v0.14.5
└── rowan v0.16.1
└── i-slint-compiler v1.17.1 (*)
hashbrown v0.16.1
└── clru v0.6.3
├── i-slint-core v1.17.1 (*)
└── i-slint-renderer-software v1.17.1 (*)
hashbrown v0.17.1
└── indexmap v2.14.0
└── toml_edit v0.25.13+spec-1.1.0
└── proc-macro-crate v3.5.0
└── num_enum_derive v0.7.6 (proc-macro)
└── num_enum v0.7.6
└── i-slint-compiler v1.17.1 (*)
hashbrown v0.17.1
├── fontique v0.10.0 (*)
└── parley v0.10.0 (*)
i-slint-common v1.17.1 (*)
i-slint-common v1.17.1
└── i-slint-compiler v1.17.1 (*)
[build-dependencies]
└── i-slint-backend-selector v1.17.1 (*)
lyon_extra v1.1.0 (*)
lyon_extra v1.1.0 (*)
lyon_geom v1.0.19 (*)
lyon_geom v1.0.19 (*)
lyon_path v1.0.19 (*)
lyon_path v1.0.19 (*)
num-traits v0.2.19
├── chrono v0.4.45
│ └── i-slint-core v1.17.1 (*)
├── euclid v0.22.14 (*)
├── i-slint-core v1.17.1 (*)
├── i-slint-renderer-software v1.17.1 (*)
├── image v0.25.10
│ └── i-slint-core v1.17.1 (*)
├── integer-sqrt v0.1.5
│ └── i-slint-renderer-software v1.17.1 (*)
├── lyon_algorithms v1.0.20 (*)
├── lyon_geom v1.0.19 (*)
├── lyon_path v1.0.19 (*)
├── moxcms v0.8.1
│ └── image v0.25.10 (*)
└── slint v1.17.1 (*)
num-traits v0.2.19
├── euclid v0.22.14 (*)
├── lyon_geom v1.0.19 (*)
└── lyon_path v1.0.19 (*)
read-fonts v0.39.2 (*)
read-fonts v0.41.0 (*)
skrifa v0.42.1 (*)
skrifa v0.44.0 (*)
smallvec v1.15.2
└── idna v1.1.0
└── url v2.5.8
└── i-slint-compiler v1.17.1 (*)
smallvec v1.15.2
├── fixed_decimal v0.7.2
│ └── icu_decimal v2.2.0
│ └── i-slint-common v1.17.1 (*)
├── fontique v0.10.0 (*)
├── harfrust v0.8.4 (*)
├── icu_normalizer v2.2.0
│ ├── i-slint-compiler v1.17.1 (*)
│ ├── i-slint-core v1.17.1 (*)
│ ├── idna_adapter v1.2.2
│ │ └── idna v1.1.0 (*)
│ └── parley v0.10.0 (*)
├── kurbo v0.13.1 (*)
└── rustybuzz v0.20.1
└── usvg v0.47.0 (*)
syn v2.0.119
├── const-field-offset-macro v0.2.0 (proc-macro)
│ └── const-field-offset v0.2.0
│ ├── i-slint-core v1.17.1 (*)
│ ├── slint v1.17.1 (*)
│ └── vtable v0.4.0
│ ├── i-slint-core v1.17.1 (*)
│ └── slint v1.17.1 (*)
├── derive_more-impl v2.1.1 (proc-macro)
│ └── derive_more v2.1.1
│ ├── i-slint-common v1.17.1 (*)
│ ├── i-slint-common v1.17.1 (*)
│ ├── i-slint-compiler v1.17.1 (*)
│ ├── i-slint-core v1.17.1 (*)
│ └── i-slint-renderer-software v1.17.1 (*)
├── i-slint-core-macros v1.17.1 (proc-macro)
│ ├── i-slint-backend-selector v1.17.1 (*)
│ ├── i-slint-core v1.17.1 (*)
│ └── slint v1.17.1 (*)
├── num_enum_derive v0.7.6 (proc-macro) (*)
├── pin-project-internal v1.1.13 (proc-macro)
│ └── pin-project v1.1.13
│ └── i-slint-core v1.17.1 (*)
├── strum_macros v0.28.0 (proc-macro)
│ └── strum v0.28.0
│ ├── i-slint-compiler v1.17.1 (*)
│ └── i-slint-core v1.17.1 (*)
├── synstructure v0.13.2
│ ├── yoke-derive v0.8.2 (proc-macro)
│ │ └── yoke v0.8.3
│ │ ├── icu_collections v2.2.0
│ │ │ ├── icu_locale v2.2.0
│ │ │ │ ├── icu_decimal v2.2.0 (*)
│ │ │ │ └── icu_segmenter v2.2.0
│ │ │ │ └── parley v0.10.0 (*)
│ │ │ ├── icu_normalizer v2.2.0 (*)
│ │ │ ├── icu_properties v2.2.0
│ │ │ │ ├── idna_adapter v1.2.2 (*)
│ │ │ │ ├── parley v0.10.0 (*)
│ │ │ │ └── parley_data v0.10.0
│ │ │ │ └── parley v0.10.0 (*)
│ │ │ └── icu_segmenter v2.2.0 (*)
│ │ ├── icu_provider v2.2.0
│ │ │ ├── i-slint-common v1.17.1 (*)
│ │ │ ├── icu_decimal v2.2.0 (*)
│ │ │ ├── icu_locale v2.2.0 (*)
│ │ │ ├── icu_normalizer v2.2.0 (*)
│ │ │ ├── icu_properties v2.2.0 (*)
│ │ │ └── icu_segmenter v2.2.0 (*)
│ │ ├── zerotrie v0.2.4
│ │ │ ├── icu_properties v2.2.0 (*)
│ │ │ └── icu_provider v2.2.0 (*)
│ │ └── zerovec v0.11.6
│ │ ├── icu_collections v2.2.0 (*)
│ │ ├── icu_decimal v2.2.0 (*)
│ │ ├── icu_locale v2.2.0 (*)
│ │ ├── icu_locale_core v2.2.0
│ │ │ ├── i-slint-common v1.17.1 (*)
│ │ │ ├── icu_decimal v2.2.0 (*)
│ │ │ ├── icu_locale v2.2.0 (*)
│ │ │ ├── icu_properties v2.2.0 (*)
│ │ │ └── icu_provider v2.2.0 (*)
│ │ ├── icu_normalizer v2.2.0 (*)
│ │ ├── icu_properties v2.2.0 (*)
│ │ ├── icu_provider v2.2.0 (*)
│ │ ├── icu_segmenter v2.2.0 (*)
│ │ ├── potential_utf v0.1.5
│ │ │ ├── icu_collections v2.2.0 (*)
│ │ │ ├── icu_locale v2.2.0 (*)
│ │ │ └── icu_segmenter v2.2.0 (*)
│ │ └── tinystr v0.8.3
│ │ ├── icu_locale v2.2.0 (*)
│ │ └── icu_locale_core v2.2.0 (*)
│ └── zerofrom-derive v0.1.7 (proc-macro)
│ └── zerofrom v0.1.8
│ ├── icu_collections v2.2.0 (*)
│ ├── icu_provider v2.2.0 (*)
│ ├── yoke v0.8.3 (*)
│ ├── zerotrie v0.2.4 (*)
│ └── zerovec v0.11.6 (*)
├── vtable-macro v0.4.0 (proc-macro)
│ └── vtable v0.4.0 (*)
├── yoke-derive v0.8.2 (proc-macro) (*)
├── zerofrom-derive v0.1.7 (proc-macro) (*)
└── zerovec-derive v0.11.3 (proc-macro)
└── zerovec v0.11.6 (*)
syn v3.0.3
├── auto_enums v0.8.10 (proc-macro)
│ └── i-slint-core v1.17.1 (*)
├── bytemuck_derive v1.12.0 (proc-macro)
│ └── bytemuck v1.25.2
│ ├── font-types v0.11.3 (*)
│ ├── font-types v0.12.2 (*)
│ ├── harfrust v0.8.4 (*)
│ ├── i-slint-renderer-software v1.17.1 (*)
│ ├── image v0.25.10 (*)
│ ├── read-fonts v0.39.2 (*)
│ ├── read-fonts v0.41.0 (*)
│ ├── rgb v0.8.53
│ │ ├── i-slint-core v1.17.1 (*)
│ │ └── resvg v0.47.0 (*)
│ ├── rustybuzz v0.20.1 (*)
│ ├── skrifa v0.42.1 (*)
│ ├── skrifa v0.44.0 (*)
│ ├── tiny-skia v0.12.0 (*)
│ └── tiny-skia-path v0.12.0
│ ├── tiny-skia v0.12.0 (*)
│ └── usvg v0.47.0 (*)
├── derive_utils v0.16.0
│ └── auto_enums v0.8.10 (proc-macro) (*)
├── displaydoc v0.2.7 (proc-macro)
│ ├── fixed_decimal v0.7.2 (*)
│ ├── icu_collections v2.2.0 (*)
│ ├── icu_decimal v2.2.0 (*)
│ ├── icu_locale_core v2.2.0 (*)
│ ├── icu_provider v2.2.0 (*)
│ ├── tinystr v0.8.3 (*)
│ └── zerotrie v0.2.4 (*)
└── thiserror-impl v2.0.19 (proc-macro)
├── thiserror v2.0.19
│ └── lyon_extra v1.1.0 (*)
└── thiserror v2.0.19
└── lyon_extra v1.1.0 (*)
thiserror v2.0.19 (*)
thiserror v2.0.19 (*)