Compare commits

..

No commits in common. "29ed971e6497c84c11c479f31bb7e011df87604a" and "fc630ae7954f2212b1eb2753f34308f8e8565ffd" have entirely different histories.

38 changed files with 650 additions and 988 deletions

1255
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,25 +1,20 @@
cargo-target-dir := env('CARGO_TARGET_DIR', 'target') cargo-target-dir := env('CARGO_TARGET_DIR', 'target')
# Compile with debug profile # Compile with debug profile
[no-cd]
build-debug *args: build-debug *args:
cargo build {{args}} cargo build {{ args }}
# Compile with release profile # Compile with release profile
[no-cd]
build-release *args: (build-debug '--release' args) build-release *args: (build-debug '--release' args)
# Compile with a vendored tarball # Compile with a vendored tarball
[no-cd]
build-vendored *args: vendor-extract (build-release '--frozen --offline' args) build-vendored *args: vendor-extract (build-release '--frozen --offline' args)
# Check for errors and linter warnings # Check for errors and linter warnings
[no-cd]
check *args: check *args:
cargo clippy --all-features {{args}} -- -W clippy::pedantic cargo clippy --all-features {{ args }} -- -W clippy::pedantic
# Runs a check with JSON message format for IDE integration # Runs a check with JSON message format for IDE integration
[no-cd]
check-json: (check '--message-format=json') check-json: (check '--message-format=json')
# Remove Cargo build artifacts # Remove Cargo build artifacts
@ -33,38 +28,25 @@ clean-dist: clean
rm -rf .cargo vendor vendor.tar target rm -rf .cargo vendor vendor.tar target
# Run the application for testing purposes # Run the application for testing purposes
[no-cd]
run *args: run *args:
cargo run {{args}} env RUST_LOG=debug RUST_BACKTRACE=full cargo run {{ args }} --release
# Run `cargo test` # Run `cargo test`
[no-cd]
test *args: test *args:
cargo test {{args}} cargo test {{ args }}
# Vendor Cargo dependencies locally # Vendor Cargo dependencies locally
[no-cd] [no-cd]
vendor: vendor:
#!/usr/bin/env bash
mkdir -p .cargo mkdir -p .cargo
cargo vendor --locked | head -n -1 > .cargo/config.toml cargo vendor --locked | head -n -1 > .cargo/config.toml
echo 'directory = "vendor"' >> .cargo/config.toml echo 'directory = "vendor"' >> .cargo/config.toml
echo >> .cargo/config.toml tar pcf vendor.tar vendor
echo '[env]' >> .cargo/config.toml rm -rf vendor
if [ -n "${SOURCE_DATE_EPOCH}" ]
then
source_date="$(date -d "@${SOURCE_DATE_EPOCH}" "+%Y-%m-%d")"
echo "VERGEN_GIT_COMMIT_DATE = \"${source_date}\"" >> .cargo/config.toml
fi
if [ -n "${SOURCE_GIT_HASH}" ]
then
echo "VERGEN_GIT_SHA = \"${SOURCE_GIT_HASH}\"" >> .cargo/config.toml
fi
tar pcf vendor.tar .cargo vendor
rm -rf .cargo vendor
# Extracts vendored dependencies # Extracts vendored dependencies
[no-cd] [no-cd]
[private]
vendor-extract: vendor-extract:
rm -rf vendor rm -rf vendor
tar pxf vendor.tar tar pxf vendor.tar

View file

@ -1,6 +1,6 @@
[package] [package]
name = "cosmic-settings" name = "cosmic-settings"
version = "1.7.0" version = "1.5.0"
edition = "2024" edition = "2024"
license = "GPL-3.0-only" license = "GPL-3.0-only"
publish = false publish = false

View file

@ -4,7 +4,6 @@ use cosmic::iced::stream;
use cosmic::theme::CosmicTheme; use cosmic::theme::CosmicTheme;
use cosmic::widget::{dropdown, settings, text}; use cosmic::widget::{dropdown, settings, text};
use cosmic::{Apply, Element, Task, surface}; use cosmic::{Apply, Element, Task, surface};
use cosmic_comp_config::CosmicCompConfig;
pub use cosmic_comp_config::ZoomMovement; pub use cosmic_comp_config::ZoomMovement;
use cosmic_config::CosmicConfigEntry; use cosmic_config::CosmicConfigEntry;
use cosmic_settings_a11y_manager_subscription as cosmic_a11y_manager; use cosmic_settings_a11y_manager_subscription as cosmic_a11y_manager;
@ -37,21 +36,11 @@ pub struct Page {
daemon_helper: cosmic_config::Config, daemon_helper: cosmic_config::Config,
dbus_sender: Option<UnboundedSender<a11y_bus::Request>>, dbus_sender: Option<UnboundedSender<a11y_bus::Request>>,
reader_enabled: bool, reader_enabled: bool,
comp_config: CosmicCompConfig,
comp_helper: cosmic_config::Config,
} }
impl Default for Page { impl Default for Page {
fn default() -> Self { fn default() -> Self {
let daemon_helper = CosmicSettingsDaemonConfig::config().unwrap(); let daemon_helper = CosmicSettingsDaemonConfig::config().unwrap();
let comp_helper = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap();
let comp_config =
CosmicCompConfig::get_entry(&comp_helper).unwrap_or_else(|(errs, config)| {
for err in errs {
tracing::warn!(?err, "error while reading cosmic-comp config");
}
config
});
Page { Page {
dbus_sender: None, dbus_sender: None,
entity: page::Entity::default(), entity: page::Entity::default(),
@ -76,8 +65,6 @@ impl Default for Page {
.unwrap_or_default(), .unwrap_or_default(),
daemon_helper, daemon_helper,
reader_enabled: false, reader_enabled: false,
comp_config,
comp_helper,
} }
} }
} }
@ -90,7 +77,6 @@ pub enum Message {
ProtocolUnavailable, ProtocolUnavailable,
Return, Return,
ScreenReaderEnabled(bool), ScreenReaderEnabled(bool),
SetCursorShakeToFind(bool),
SetScreenFilterActive(bool), SetScreenFilterActive(bool),
SetScreenFilterSelection(ColorFilter), SetScreenFilterSelection(ColorFilter),
SetScreenInverted(bool), SetScreenInverted(bool),
@ -201,8 +187,6 @@ pub fn vision() -> section::Section<crate::pages::Message> {
invert_colors = fl!("accessibility", "invert-colors"); invert_colors = fl!("accessibility", "invert-colors");
color_filters = fl!("accessibility", "color-filters"); color_filters = fl!("accessibility", "color-filters");
color_filter_type = fl!("color-filter"); color_filter_type = fl!("color-filter");
shake_cursor = fl!("accessibility", "shake-cursor");
shake_cursor_desc = fl!("accessibility", "shake-cursor-desc");
}); });
Section::default() Section::default()
@ -292,13 +276,6 @@ pub fn vision() -> section::Section<crate::pages::Message> {
settings::item::builder(&descriptions[color_filter_type]).control(dropdown) settings::item::builder(&descriptions[color_filter_type]).control(dropdown)
}) })
.add(
settings::item::builder(&descriptions[shake_cursor])
.description(&descriptions[shake_cursor_desc])
.toggler(page.comp_config.cursor_shake_to_find, |enabled| {
Message::SetCursorShakeToFind(enabled).into()
}),
)
.into() .into()
}) })
} }
@ -439,14 +416,6 @@ impl Page {
Message::Surface(a) => { Message::Surface(a) => {
return cosmic::task::message(crate::app::Message::Surface(a)); return cosmic::task::message(crate::app::Message::Surface(a));
} }
Message::SetCursorShakeToFind(enabled) => {
if let Err(err) = self
.comp_config
.set_cursor_shake_to_find(&self.comp_helper, enabled)
{
tracing::error!(?err, "failed to set cursor_shake_to_find");
}
}
Message::SetSoundMono(active) => { Message::SetSoundMono(active) => {
if let Err(err) = self if let Err(err) = self
.daemon_config .daemon_config

View file

@ -12,7 +12,7 @@ use futures::channel::oneshot;
use futures::{SinkExt, StreamExt}; use futures::{SinkExt, StreamExt};
use slotmap::SlotMap; use slotmap::SlotMap;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::sync::{Arc, LazyLock}; use std::sync::Arc;
use std::time::Duration; use std::time::Duration;
use zbus::zvariant::OwnedObjectPath; use zbus::zvariant::OwnedObjectPath;
@ -20,8 +20,6 @@ use zbus::zvariant::OwnedObjectPath;
use crate::service_manager::MockServiceManager; use crate::service_manager::MockServiceManager;
use crate::service_manager::ServiceManagerHandle; use crate::service_manager::ServiceManagerHandle;
static BLUETOOTH_PAGE_LABEL: LazyLock<String> = LazyLock::new(|| fl!("bluetooth"));
enum Dialog { enum Dialog {
RequestConfirmation { RequestConfirmation {
device: String, device: String,
@ -175,19 +173,6 @@ impl page::Page<crate::pages::Message> for Page {
.description(fl!("xdg-entry-bluetooth-comment")) .description(fl!("xdg-entry-bluetooth-comment"))
} }
fn header(&self) -> Option<Element<'_, crate::pages::Message>> {
if self.model.adapters.len() > 1 {
let (_, adapter) = self.model.get_selected_adapter()?;
return Some(crate::widget::sub_page_header(
&adapter.alias,
BLUETOOTH_PAGE_LABEL.as_str(),
Message::SelectAdapter(None).into(),
));
}
None
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
@ -407,30 +392,6 @@ impl From<Event> for Message {
} }
impl Page { impl Page {
fn update_heading(&mut self) {
self.heading = if let Some((_, adapter)) = self.model.get_selected_adapter() {
fl!(
"bluetooth",
"status",
aliases = format!("“{}”", adapter.alias)
)
} else {
fl!(
"bluetooth",
"status",
aliases = self
.model
.adapters
.values()
.map(|adapter| format!("“{}”", adapter.alias))
.collect::<HashSet<String>>()
.into_iter()
.collect::<Vec<String>>()
.join(", ")
)
};
}
pub fn update(&mut self, message: Message) -> cosmic::Task<crate::Message> { pub fn update(&mut self, message: Message) -> cosmic::Task<crate::Message> {
let span = tracing::span!(tracing::Level::INFO, "bluetooth::update"); let span = tracing::span!(tracing::Level::INFO, "bluetooth::update");
let _span = span.enter(); let _span = span.enter();
@ -476,7 +437,28 @@ impl Page {
Event::SetAdapters(adapters) => { Event::SetAdapters(adapters) => {
let select_adapter = self.model.set_adapters(adapters); let select_adapter = self.model.set_adapters(adapters);
self.update_heading();
if let Some((_, adapter)) = self.model.get_selected_adapter() {
self.heading = fl!(
"bluetooth",
"status",
aliases = format!("“{}”", adapter.alias)
);
} else {
self.heading = fl!(
"bluetooth",
"status",
aliases = self
.model
.adapters
.values()
.map(|adapter| format!("“{}”", adapter.alias))
.collect::<HashSet<String>>()
.into_iter()
.collect::<Vec<String>>()
.join(", ")
);
}
if let Some(adapter) = select_adapter { if let Some(adapter) = select_adapter {
return cosmic::task::message(Message::SelectAdapter(Some(adapter))); return cosmic::task::message(Message::SelectAdapter(Some(adapter)));
@ -759,7 +741,6 @@ impl Page {
Message::SelectAdapter(adapter_maybe) => { Message::SelectAdapter(adapter_maybe) => {
tracing::debug!("Adapter selected: {adapter_maybe:?}"); tracing::debug!("Adapter selected: {adapter_maybe:?}");
self.model.selected_adapter = adapter_maybe; self.model.selected_adapter = adapter_maybe;
self.update_heading();
self.model.update_status(); self.model.update_status();
let Some(connection) = self.connection.as_ref() else { let Some(connection) = self.connection.as_ref() else {
tracing::error!("No DBus connection ready"); tracing::error!("No DBus connection ready");
@ -1177,51 +1158,6 @@ impl Page {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use cosmic_settings_page::Page as _;
fn adapter(path: &str, alias: &str) -> (OwnedObjectPath, Adapter) {
(
OwnedObjectPath::try_from(path).unwrap(),
Adapter {
alias: alias.to_owned(),
..Adapter::default()
},
)
}
fn page_with_two_adapters() -> Page {
let mut page = Page::default();
let adapters = [
adapter("/org/bluez/hci0", "Adapter 0"),
adapter("/org/bluez/hci1", "Adapter 1"),
]
.into_iter()
.collect();
let _task = page.update(Message::BluetoothEvent(Event::SetAdapters(adapters)));
page
}
#[test]
fn bluetooth_header_is_absent_at_adapter_chooser() {
let page = page_with_two_adapters();
assert!(page.header().is_none());
}
#[test]
fn bluetooth_header_tracks_adapter_selection_and_clearing() {
let mut page = page_with_two_adapters();
let selected = OwnedObjectPath::try_from("/org/bluez/hci1").unwrap();
let _task = page.update(Message::SelectAdapter(Some(selected)));
assert!(page.header().is_some());
assert!(page.heading.contains("Adapter 1"));
let _task = page.update(Message::SelectAdapter(None));
assert!(page.header().is_none());
assert!(page.heading.contains("Adapter 0"));
assert!(page.heading.contains("Adapter 1"));
}
#[test] #[test]
fn test_dbus_service_unknown_with_installed_service_queries_manager() { fn test_dbus_service_unknown_with_installed_service_queries_manager() {

View file

@ -1103,12 +1103,6 @@ impl Page {
.arg(itoa::Buffer::new().format(x)) .arg(itoa::Buffer::new().format(x))
.arg("--pos-y") .arg("--pos-y")
.arg(itoa::Buffer::new().format(y)) .arg(itoa::Buffer::new().format(y))
.arg("--refresh")
.arg(format!(
"{}.{:03}",
current.refresh_rate / 1000,
current.refresh_rate % 1000
))
.arg(name) .arg(name)
.arg(itoa::Buffer::new().format(current.size.0)) .arg(itoa::Buffer::new().format(current.size.0))
.arg(itoa::Buffer::new().format(current.size.1)); .arg(itoa::Buffer::new().format(current.size.1));

View file

@ -118,8 +118,8 @@ pub enum SourceContext {
MoveDown(DefaultKey), MoveDown(DefaultKey),
MoveUp(DefaultKey), MoveUp(DefaultKey),
Remove(DefaultKey), Remove(DefaultKey),
// Settings(DefaultKey), Settings(DefaultKey),
// ViewLayout(DefaultKey), ViewLayout(DefaultKey),
} }
pub type Locale = String; pub type Locale = String;
@ -211,7 +211,6 @@ fn popover_menu_row(
id: DefaultKey, id: DefaultKey,
label: String, label: String,
message: impl Fn(DefaultKey) -> SourceContext + 'static, message: impl Fn(DefaultKey) -> SourceContext + 'static,
disabled: bool,
) -> cosmic::Element<'static, Message> { ) -> cosmic::Element<'static, Message> {
let spacing = theme::spacing(); let spacing = theme::spacing();
widget::text::body(label) widget::text::body(label)
@ -220,54 +219,37 @@ fn popover_menu_row(
.padding([spacing.space_xxxs, spacing.space_xs]) .padding([spacing.space_xxxs, spacing.space_xs])
.width(Length::Fill) .width(Length::Fill)
.class(theme::Button::MenuItem) .class(theme::Button::MenuItem)
.on_press_maybe(if disabled { .on_press(Message::SourceContext(message(id)))
None
} else {
Some(Message::SourceContext(message(id)))
})
.apply(Element::from) .apply(Element::from)
} }
fn popover_menu( fn popover_menu(id: DefaultKey) -> cosmic::Element<'static, Message> {
id: DefaultKey,
is_first: bool,
is_last: bool,
) -> cosmic::Element<'static, Message> {
widget::column::with_children([ widget::column::with_children([
popover_menu_row( popover_menu_row(
id, id,
fl!("keyboard-sources", "move-up"), fl!("keyboard-sources", "move-up"),
SourceContext::MoveUp, SourceContext::MoveUp,
is_first,
), ),
popover_menu_row( popover_menu_row(
id, id,
fl!("keyboard-sources", "move-down"), fl!("keyboard-sources", "move-down"),
SourceContext::MoveDown, SourceContext::MoveDown,
is_last,
), ),
widget::divider::horizontal::default() widget::divider::horizontal::default()
.apply(widget::container) .apply(widget::container)
.padding(8) .padding(8)
.into(), .into(),
// popover_menu_row(
// id,
// fl!("keyboard-sources", "settings"),
// SourceContext::Settings,
// false,
// ),
// popover_menu_row(
// id,
// fl!("keyboard-sources", "view-layout"),
// SourceContext::ViewLayout,
// false,
// ),
popover_menu_row( popover_menu_row(
id, id,
fl!("keyboard-sources", "remove"), fl!("keyboard-sources", "settings"),
SourceContext::Remove, SourceContext::Settings,
false,
), ),
popover_menu_row(
id,
fl!("keyboard-sources", "view-layout"),
SourceContext::ViewLayout,
),
popover_menu_row(id, fl!("keyboard-sources", "remove"), SourceContext::Remove),
]) ])
.width(Length::Fixed(200.0)) .width(Length::Fixed(200.0))
.apply(widget::container) .apply(widget::container)
@ -276,12 +258,7 @@ fn popover_menu(
.into() .into()
} }
fn popover_button( fn popover_button(id: DefaultKey, expanded: bool) -> cosmic::Element<'static, Message> {
id: DefaultKey,
expanded: bool,
is_first: bool,
is_last: bool,
) -> cosmic::Element<'static, Message> {
let on_press = Message::ExpandInputSourcePopover(if expanded { None } else { Some(id) }); let on_press = Message::ExpandInputSourcePopover(if expanded { None } else { Some(id) });
let button = button::icon(icon::from_name("view-more-symbolic")) let button = button::icon(icon::from_name("view-more-symbolic"))
@ -291,7 +268,7 @@ fn popover_button(
if expanded { if expanded {
widget::popover(button) widget::popover(button)
.position(widget::popover::Position::Bottom) .position(widget::popover::Position::Bottom)
.popup(popover_menu(id, is_first, is_last)) .popup(popover_menu(id))
.on_close(Message::ExpandInputSourcePopover(None)) .on_close(Message::ExpandInputSourcePopover(None))
.into() .into()
} else { } else {
@ -303,12 +280,10 @@ fn input_source(
id: DefaultKey, id: DefaultKey,
description: &str, description: &str,
expanded_source_popover: Option<DefaultKey>, expanded_source_popover: Option<DefaultKey>,
is_first: bool,
is_last: bool,
) -> cosmic::Element<'_, Message> { ) -> cosmic::Element<'_, Message> {
let expanded = expanded_source_popover.is_some_and(|expanded_id| expanded_id == id); let expanded = expanded_source_popover.is_some_and(|expanded_id| expanded_id == id);
settings::item(description, popover_button(id, expanded, is_first, is_last)).into() settings::item(description, popover_button(id, expanded)).into()
} }
fn special_char_radio_row<'a>( fn special_char_radio_row<'a>(
@ -546,13 +521,15 @@ impl Page {
let _removed = self.active_layouts.remove(pos); let _removed = self.active_layouts.remove(pos);
self.update_xkb_config(); self.update_xkb_config();
} }
} // SourceContext::Settings(_id) => { }
// eprintln!("settings not implemented");
// }
// SourceContext::ViewLayout(_id) => { SourceContext::Settings(_id) => {
// eprintln!("view layout not implemented"); eprintln!("settings not implemented");
// } }
SourceContext::ViewLayout(_id) => {
eprintln!("view layout not implemented");
}
} }
} }
@ -770,17 +747,12 @@ fn input_sources() -> Section<crate::pages::Message> {
// TODO Need something more custom, with drag and drop // TODO Need something more custom, with drag and drop
let mut section = settings::section().title(&section.title); let mut section = settings::section().title(&section.title);
for (position, id) in page.active_layouts.iter().enumerate() { for id in &page.active_layouts {
if let Some((_locale, _variant, description, _source)) = if let Some((_locale, _variant, description, _source)) =
page.keyboard_layouts.get(*id) page.keyboard_layouts.get(*id)
{ {
section = section.add(input_source( section =
*id, section.add(input_source(*id, description, page.expanded_source_popover));
description,
page.expanded_source_popover,
position == 0,
position + 1 == page.active_layouts.len(),
));
} }
} }

6
debian/changelog vendored
View file

@ -1,9 +1,3 @@
cosmic-settings (1.7.0) noble; urgency=medium
* Epoch 1.7.0 version update
-- Michael Murphy <michael@mmurphy.dev> Fri, 21 Aug 2026 20:44:57 +0200
cosmic-settings (1.0.12) noble; urgency=medium cosmic-settings (1.0.12) noble; urgency=medium
* release: 1.0.12 * release: 1.0.12

View file

@ -1,6 +1,4 @@
tar-ignore=.github tar-ignore=.github
tar-ignore=target/.rustc_info.json tar-ignore=.vscode
tar-ignore=target/CACHEDIR.TAG
tar-ignore=target/debug
tar-ignore=target/release
tar-ignore=vendor tar-ignore=vendor
tar-ignore=target

View file

@ -86,10 +86,10 @@ dock = Dok
## Desktop: Panel ## Desktop: Panel
panel = Panel panel = Panel
panel-behavior-and-position = Chování a umístění panel-behavior-and-position = Chování a pozice
.autohide = Automaticky skrýt panel .autohide = Automaticky skrýt panel
.dock-autohide = Automaticky skrýt dok .dock-autohide = Automaticky skrýt dok
.position = Umístění na obrazovce .position = Pozice na obrazovce
.display = Zobrazit na obrazovce .display = Zobrazit na obrazovce
panel-top = Nahoře panel-top = Nahoře
panel-bottom = Dole panel-bottom = Dole
@ -215,8 +215,7 @@ sound-alerts = Upozornění
.volume = Hlasitost upozornění .volume = Hlasitost upozornění
.sound = Zvuk pro upozornění .sound = Zvuk pro upozornění
sound-applications = Aplikace sound-applications = Aplikace
.desc = Hlasitosti a nastavení aplikací .desc = Hlasitosti aplikací a nastavení
.none = Žádné aplikace nepoužívají zvuk
## System ## System
@ -370,10 +369,8 @@ accessibility = Přístupnost
.unavailable = Nedostupné .unavailable = Nedostupné
.screen-reader = Čtečka obrazovky .screen-reader = Čtečka obrazovky
.high-contrast = Vysoký kontrast .high-contrast = Vysoký kontrast
.invert-colors = Inverze barev .invert-colors = Převrátit barvy
.color-filters = Barevné filtry .color-filters = Barevné filtry
.shake-cursor = Nalezení ukazatele zatřesením
.shake-cursor-desc = Rychlým zatřesením myší se ukazatel dočasně zvětší
hearing = Sluch hearing = Sluch
.mono = Přehrávat stereo zvuk jako mono .mono = Přehrávat stereo zvuk jako mono
default = Výchozí default = Výchozí
@ -465,13 +462,13 @@ container-background = Pozadí kontejneru
control-tint = Odstín ovládacích prvků control-tint = Odstín ovládacích prvků
.desc = Používá se pro pozadí standardních tlačítek, vyhledávacích polí, textových vstupů a podobných komponent .desc = Používá se pro pozadí standardních tlačítek, vyhledávacích polí, textových vstupů a podobných komponent
frosted = Efekt ledového skla na systémovém rozhraní frosted = Efekt ledového skla na systémovém rozhraní
.desc = Použít rozmazané pozadí pro panel, dok, applety, spouštěč a knihovnu aplikací .desc = Použije rozmazané pozadí pro panel, dok, applety, spouštěč a knihovnu aplikací
enable-export = Použít aktuální motiv v aplikacích GNOME enable-export = Použít aktuální motiv v aplikacích GNOME
.desc = Ne všechny toolkity podporují automatické přepínání. Aplikace, které nejsou postaveny na COSMIC toolkitu mohou vyžadovat restart po změně motivu. .desc = Ne všechny toolkity podporují automatické přepínání. Aplikace, které nejsou postaveny na COSMIC toolkitu mohou vyžadovat restart po změně motivu.
password-mismatch = Heslo a jeho potvrzení se musí shodovat password-mismatch = Heslo a jeho potvrzení se musí shodovat
invalid-username = Neplatné uživatelské jméno invalid-username = Neplatné uživatelské jméno
icon-theme = Motiv ikon icon-theme = Motiv ikon
.desc = Použít jinou sadu ikon pro aplikace .desc = Použije jinou sadu ikon pro aplikace
monospace-font = Písmo s pevnou šířkou monospace-font = Písmo s pevnou šířkou
window-management = Správa oken window-management = Správa oken
window-tiling = Dlaždicový režim oken window-tiling = Dlaždicový režim oken
@ -524,7 +521,7 @@ magnifier = Lupa
.show_overlay = Zobrazit překrytí lupy .show_overlay = Zobrazit překrytí lupy
.increment = Krok přiblížení .increment = Krok přiblížení
.signin = Spustit lupu při přihlášení .signin = Spustit lupu při přihlášení
.applet = Lupu lze přepnout (zap/vyp) v nabídce zobrazené po kliknutí na applet přímo v panelu .applet = Lupu lze přepnout v appletu na panelu
.movement = Pohyb přiblíženého zobrazení .movement = Pohyb přiblíženého zobrazení
.continuous = Neustále s ukazatelem .continuous = Neustále s ukazatelem
.onedge = Když ukazatel dosáhne okraje .onedge = Když ukazatel dosáhne okraje
@ -532,9 +529,9 @@ magnifier = Lupa
color-filter = Typ barevného filtru color-filter = Typ barevného filtru
.unknown = Neznámý filtr aktivní .unknown = Neznámý filtr aktivní
.greyscale = Stupně šedi .greyscale = Stupně šedi
.deuteranopia = Zelená/červená (oslabené vnímání zelené, deuteranopie) .deuteranopia = Zeleno/Červená (oslabení zelené, Deuteranopie)
.protanopia = Červená/zelená (oslabené vnímání červené, protanopie) .protanopia = Červeno/Zelená (oslabení červené, Protanopie)
.tritanopia = Modrá/žlutá (oslabené vnímání modré, tritanopie) .tritanopia = Modro/Žlutá (oslabení modré, Tritanopie)
text-tint = Odstín textu rozhraní text-tint = Odstín textu rozhraní
.desc = Používá se k odvození barev textu rozhraní, které mají dostatečný kontrast na různých površích .desc = Používá se k odvození barev textu rozhraní, které mají dostatečný kontrast na různých površích
experimental-settings = Experimentální nastavení experimental-settings = Experimentální nastavení
@ -555,13 +552,13 @@ style = Styl
.square = Hranatý .square = Hranatý
.frosted-glass = Efekt ledového skla .frosted-glass = Efekt ledového skla
.frosted-system-interface = Rozhraní systému .frosted-system-interface = Rozhraní systému
.frosted-system-interface-desc = Použít efekt ledového skla pro spouštěč, knihovnu aplikací, přehled pracovních ploch a ovládací prvky na obrazovce .frosted-system-interface-desc = Použije efekt ledového skla na spouštěč, knihovnu aplikací, přehled pracovních ploch a ovládací prvky na obrazovce
.frosted-windows = Okna .frosted-windows = Okna
.frosted-windows-desc = Použít efekt ledového skla pro okna a dialogy .frosted-windows-desc = Použije efekt ledového skla na okna a dialogy
.frosted-panels = Panely .frosted-panels = Panely
.frosted-panels-desc = Použít efekt ledového skla pro dok a panel .frosted-panels-desc = Použije efekt ledového skla na dok a panel
.frosted-applets = Applety .frosted-applets = Applety
.frosted-applets-desc = Použít efekt ledového skla pro nabídky appletů na panelu a doku .frosted-applets-desc = Použije efekt ledového skla na nabídky appletů v doku a na panelu
.frosted-thickness = Tloušťka ledu .frosted-thickness = Tloušťka ledu
.less = menší .less = menší
.more = větší .more = větší

View file

@ -514,7 +514,7 @@ show-extended-input-sources = Vis udvidede inputkilder
keyboard-shortcuts = Tastaturgenveje keyboard-shortcuts = Tastaturgenveje
.desc = Se og tilpas genveje .desc = Se og tilpas genveje
cancel = Afbryd cancel = Annuller
command = Kommando command = Kommando
custom = Brugerdefineret custom = Brugerdefineret
debug = Debug debug = Debug

View file

@ -124,8 +124,6 @@ accessibility = Barrierefreiheit
.high-contrast = Modus für hohen Kontrast .high-contrast = Modus für hohen Kontrast
.invert-colors = Farben invertieren .invert-colors = Farben invertieren
.color-filters = Farbfilter .color-filters = Farbfilter
.shake-cursor = Mauszeiger schütteln, um ihn zu finden
.shake-cursor-desc = Schüttle die Maus kurz, um den Mauszeiger vorübergehend zu vergrößern
hearing = Hören hearing = Hören
.mono = Stereo-Audio als Mono abspielen .mono = Stereo-Audio als Mono abspielen
default = Standard default = Standard
@ -433,7 +431,6 @@ sound-alerts = Alarmsignale
.sound = Alarmsignalklang .sound = Alarmsignalklang
sound-applications = Anwendungen sound-applications = Anwendungen
.desc = Lautstärken und Einstellungen von Anwendungen .desc = Lautstärken und Einstellungen von Anwendungen
.none = Keine Anwendungen verwenden einen Klang
## Energie ## Energie

View file

@ -603,7 +603,6 @@ connected-devices = Συνδεδεμένες συσκευές
icons-and-toolkit = Εικονίδια και θέματα συνόλου εργαλείων icons-and-toolkit = Εικονίδια και θέματα συνόλου εργαλείων
sound-applications = Εφαρμογές sound-applications = Εφαρμογές
.desc = Ένταση και ρυθμίσεις ήχου εφαρμογών .desc = Ένταση και ρυθμίσεις ήχου εφαρμογών
.none = Καμία εφαρμογή δεν χρησιμοποιεί ήχο
time-zone = Ζώνη ώρας time-zone = Ζώνη ώρας
.auto = Αυτόματη ζώνη ώρας .auto = Αυτόματη ζώνη ώρας
.auto-info = Απαιτεί τη χρήση υπηρεσιών τοποθεσίας και πρόσβαση στο διαδίκτυο .auto-info = Απαιτεί τη χρήση υπηρεσιών τοποθεσίας και πρόσβαση στο διαδίκτυο

View file

@ -275,8 +275,6 @@ accessibility = Accessibility
.high-contrast = High contrast mode .high-contrast = High contrast mode
.invert-colors = Invert colors .invert-colors = Invert colors
.color-filters = Color filters .color-filters = Color filters
.shake-cursor = Shake pointer to find it
.shake-cursor-desc = Quickly shake the mouse to temporarily enlarge the pointer
hearing = Hearing hearing = Hearing
.mono = Play stereo audio as mono .mono = Play stereo audio as mono

View file

@ -791,8 +791,6 @@ accessibility = Esteettömyys
.high-contrast = Suurikontrastinen tila .high-contrast = Suurikontrastinen tila
.invert-colors = Käänteiset värit .invert-colors = Käänteiset värit
.color-filters = Värisuodattimet .color-filters = Värisuodattimet
.shake-cursor = Ravista osoitinta paikantaaksesi sen
.shake-cursor-desc = Ravista nopeasti hiirtä suurentaaksesi osoittimen väliaikaisesti
debug = Vianjäljitys debug = Vianjäljitys
system-shortcut = Järjestelmä system-shortcut = Järjestelmä
.app-library = Avaa sovelluskirjasto .app-library = Avaa sovelluskirjasto

View file

@ -441,7 +441,6 @@ sound-alerts = Alertes
.sound = Alertes sonores .sound = Alertes sonores
sound-applications = Applications sound-applications = Applications
.desc = Volumes et paramètres d'application .desc = Volumes et paramètres d'application
.none = Aucune application n'utilise le son
## Printers ## Printers
@ -896,8 +895,6 @@ accessibility = Accessibilité
.high-contrast = Mode contraste élevé .high-contrast = Mode contraste élevé
.invert-colors = Inverser les couleurs .invert-colors = Inverser les couleurs
.color-filters = Filtres de couleurs .color-filters = Filtres de couleurs
.shake-cursor = Secouer le curseur pour le localiser
.shake-cursor-desc = Secouez rapidement la souris pour agrandir temporairement le curseur
color-filter = Type de filtre de couleurs color-filter = Type de filtre de couleurs
.unknown = Filtre inconnu actif .unknown = Filtre inconnu actif
.greyscale = Niveaux de gris .greyscale = Niveaux de gris

View file

@ -211,7 +211,7 @@ bluetooth-display-pin = Emparellamento Bluetooth
.description = Introduce o seguinte PIN en { $device } e preme Intro .description = Introduce o seguinte PIN en { $device } e preme Intro
bluetooth-available = Dispositivos próximos bluetooth-available = Dispositivos próximos
bluetooth-adapters = Adaptadores Bluetooth bluetooth-adapters = Adaptadores Bluetooth
accessibility = Accessibilidade accessibility = Accessibility
.vision = Visión .vision = Visión
.on = Activado .on = Activado
.off = Desactivado .off = Desactivado
@ -502,7 +502,6 @@ sound-alerts = Alertas
.sound = Son das alertas .sound = Son das alertas
sound-applications = Aplicacións sound-applications = Aplicacións
.desc = Volumes e configuracións das aplicacións .desc = Volumes e configuracións das aplicacións
.none = Ningún aplicativo esta a soar
sound-device-port-unplugged = Desconectado sound-device-port-unplugged = Desconectado
sound-hd-audio = Audio HD sound-hd-audio = Audio HD
sound-usb-audio = Audio USB sound-usb-audio = Audio USB

View file

@ -182,8 +182,6 @@ accessibility = Akadálymentesség
.high-contrast = Magas kontraszt mód .high-contrast = Magas kontraszt mód
.invert-colors = Színek invertálása .invert-colors = Színek invertálása
.color-filters = Színszűrők .color-filters = Színszűrők
.shake-cursor = Mutató rázása a megtalálásához
.shake-cursor-desc = Az egér gyors megrázásával ideiglenesen megnövelhető a mutató mérete
hearing = Hallás hearing = Hallás
.mono = Sztereó hang lejátszása monóként .mono = Sztereó hang lejátszása monóként
default = Alapértelmezett default = Alapértelmezett
@ -485,8 +483,7 @@ sound-alerts = Figyelmeztetések
.volume = Figyelmeztetések hangereje .volume = Figyelmeztetések hangereje
.sound = Figyelmeztető hang .sound = Figyelmeztető hang
sound-applications = Alkalmazások sound-applications = Alkalmazások
.desc = Alkalmazások hangereje és beállításai .desc = Alkalmazások hangerejei és beállításai
.none = Egyetlen alkalmazás sem használ hangot
## Power ## Power

View file

@ -116,8 +116,6 @@ accessibility = Aksesibilitas
.high-contrast = Mode kontras tinggi .high-contrast = Mode kontras tinggi
.invert-colors = Balikkan warna .invert-colors = Balikkan warna
.color-filters = Filter warna .color-filters = Filter warna
.shake-cursor = Goyangkan penunjuk untuk menemukannya
.shake-cursor-desc = Goyangkan tetikus dengan cepat untuk memperbesar penunjuk untuk sementara
hearing = Pendengaran hearing = Pendengaran
.mono = Mainkan audio stereo sebagai mono .mono = Mainkan audio stereo sebagai mono
default = Bawaan default = Bawaan
@ -399,7 +397,6 @@ sound-alerts = Peringatan
.sound = Suara peringatan .sound = Suara peringatan
sound-applications = Aplikasi sound-applications = Aplikasi
.desc = Volume dan pengaturan aplikasi .desc = Volume dan pengaturan aplikasi
.none = Tidak ada aplikasi yang menggunakan suara
sound-device-port-unplugged = Tercabut sound-device-port-unplugged = Tercabut
sound-hd-audio = Audio HD sound-hd-audio = Audio HD
sound-usb-audio = Audio USB sound-usb-audio = Audio USB

View file

@ -116,8 +116,6 @@ accessibility = Арнайы мүмкіндіктер
.high-contrast = Жоғары контраст режимі .high-contrast = Жоғары контраст режимі
.invert-colors = Түстерді инверсиялау .invert-colors = Түстерді инверсиялау
.color-filters = Түс сүзгілері .color-filters = Түс сүзгілері
.shake-cursor = Шайқаған кезде курсорды үлкейту
.shake-cursor-desc = Курсорды уақытша үлкейту үшін, тышқанды жылдам шайқаңыз
hearing = Есту қабілеті hearing = Есту қабілеті
.mono = Стерео аудионы моно ретінде ойнату .mono = Стерео аудионы моно ретінде ойнату
default = Әдепкі default = Әдепкі
@ -396,7 +394,6 @@ sound-alerts = Ескертулер
.sound = Ескертулер дыбысы .sound = Ескертулер дыбысы
sound-applications = Қолданбалар sound-applications = Қолданбалар
.desc = Қолданбалардың дыбыс деңгейі мен баптаулары .desc = Қолданбалардың дыбыс деңгейі мен баптаулары
.none = Ешбір қолданба дыбысты қолданып жатқан жоқ
sound-device-port-unplugged = Ажыратылған sound-device-port-unplugged = Ажыратылған
sound-hd-audio = HD аудио sound-hd-audio = HD аудио
sound-usb-audio = USB аудио sound-usb-audio = USB аудио

View file

@ -121,8 +121,6 @@ accessibility = Gihîştin
.high-contrast = Awayê berevajiya bilind .high-contrast = Awayê berevajiya bilind
.invert-colors = Rengan berevajî bike .invert-colors = Rengan berevajî bike
.color-filters = Parzûnên rengan .color-filters = Parzûnên rengan
.shake-cursor = Nîşanderê bihejîne da ku wê bibînî
.shake-cursor-desc = Ji bo ku nîşander demkî mezin bibe, mişkê bi lez bihejîne
container-background = Paşrûyê konteynirê container-background = Paşrûyê konteynirê
.desc-detail = Rengê paşrûyêa konteynirê ji bo gerandina darika kêlekê, kaşoya alî, gotûbêj û alavokên wekhev tê bikaranîn. Bi berdestî, rengê paşrûya konteynirê xweber ji paşrûyê çarçoveyê tê girtin. .desc-detail = Rengê paşrûyêa konteynirê ji bo gerandina darika kêlekê, kaşoya alî, gotûbêj û alavokên wekhev tê bikaranîn. Bi berdestî, rengê paşrûya konteynirê xweber ji paşrûyê çarçoveyê tê girtin.
.reset = Vegere awayê xweber .reset = Vegere awayê xweber
@ -563,7 +561,6 @@ connected-devices = Amûrên girêdayî
icons-and-toolkit = Rûkara îkon û amûran icons-and-toolkit = Rûkara îkon û amûran
sound-applications = Sepan sound-applications = Sepan
.desc = Dengê sepanan û sazkarî .desc = Dengê sepanan û sazkarî
.none = Tu sepan dengê bi kar nayîne
time-zone = Herêma demê time-zone = Herêma demê
.auto = Herêma dema xweber .auto = Herêma dema xweber
.auto-info = Pêdiviya wê bi rajekarên cîh û gihîştina înternetê heye .auto-info = Pêdiviya wê bi rajekarên cîh û gihîştina înternetê heye

View file

@ -180,8 +180,6 @@ accessibility = Dostępność
.high-contrast = Tryb wysokiego kontrastu .high-contrast = Tryb wysokiego kontrastu
.invert-colors = Odwróć kolory .invert-colors = Odwróć kolory
.color-filters = Filtry kolorów .color-filters = Filtry kolorów
.shake-cursor = Porusz energicznie kursorem by go znaleźć
.shake-cursor-desc = Szybko ruszaj myszką by czasowo powiększyć kursor
hearing = Słuchanie hearing = Słuchanie
.mono = Odtwarzaj dźwięk stereo jako mono .mono = Odtwarzaj dźwięk stereo jako mono
default = Domyślne default = Domyślne
@ -498,7 +496,6 @@ sound-alerts = Alerty
.sound = Dźwięk alertów .sound = Dźwięk alertów
sound-applications = Aplikacje sound-applications = Aplikacje
.desc = Ustawienia i głośność aplikacji .desc = Ustawienia i głośność aplikacji
.none = Żadna z aplikacji nie wydaje dźwięków
## Power ## Power

View file

@ -124,8 +124,6 @@ accessibility = Acessibilidade
.high-contrast = Modo de alto contraste .high-contrast = Modo de alto contraste
.invert-colors = Inverter cores .invert-colors = Inverter cores
.color-filters = Filtros de cor .color-filters = Filtros de cor
.shake-cursor = Agite o ponteiro para encontrá-lo
.shake-cursor-desc = Agite rapidamente o mouse para ampliar temporariamente o ponteiro
hearing = Audição hearing = Audição
.mono = Reproduzir áudio estéreo como mono .mono = Reproduzir áudio estéreo como mono
default = Padrão default = Padrão
@ -428,9 +426,8 @@ amplification = Amplificação
sound-alerts = Alertas sound-alerts = Alertas
.volume = Volume dos alertas .volume = Volume dos alertas
.sound = Som dos alertas .sound = Som dos alertas
sound-applications = Aplicativos sound-applications = Aplicações
.desc = Volumes e configurações de aplicativo .desc = Volume e configurações das aplicações
.none = Nenhum aplicativo está usando som
## Power ## Power

View file

@ -277,8 +277,7 @@ sound-alerts = Предупреждения
.volume = Громкость предупреждений .volume = Громкость предупреждений
.sound = Звук предупреждений .sound = Звук предупреждений
sound-applications = Приложения sound-applications = Приложения
.desc = Громкость приложений и настройки .desc = Громкость и настройки приложений
.none = Нет приложений, использующих звук
## System ## System
@ -649,8 +648,6 @@ accessibility = Специальные возможности
.high-contrast = Режим высокой контрастности .high-contrast = Режим высокой контрастности
.invert-colors = Инвертирование цвета .invert-colors = Инвертирование цвета
.color-filters = Цветовые фильтры .color-filters = Цветовые фильтры
.shake-cursor = Увеличивать курсор при встряхивании
.shake-cursor-desc = Быстро встряхните мышь, чтобы временно увеличить курсор
hearing = Слух hearing = Слух
.mono = Проигрывать стереозвук как монозвук .mono = Проигрывать стереозвук как монозвук
default = По умолчанию default = По умолчанию

View file

@ -206,8 +206,6 @@ accessibility = Tillgänglighet
.high-contrast = Högkontrastläge .high-contrast = Högkontrastläge
.invert-colors = Invertera färger .invert-colors = Invertera färger
.color-filters = Färgfilter .color-filters = Färgfilter
.shake-cursor = Skaka muspekaren för att hitta den
.shake-cursor-desc = Skaka musen snabbt för att tillfälligt förstora muspekaren
hearing = Hörsel hearing = Hörsel
.mono = Spela stereoljud som mono .mono = Spela stereoljud som mono
default = Standard default = Standard
@ -492,7 +490,6 @@ sound-alerts = Larm
.sound = Larmljud .sound = Larmljud
sound-applications = Program sound-applications = Program
.desc = Programvolym och inställningar .desc = Programvolym och inställningar
.none = Inga program använder ljud
## System ## System

View file

@ -267,7 +267,6 @@ sound-alerts = Попередження
.sound = Звук попереджень .sound = Звук попереджень
sound-applications = Застосунки sound-applications = Застосунки
.desc = Гучність та налаштування для застосунків .desc = Гучність та налаштування для застосунків
.none = Жоден застосунок не відтворює звук
## Power ## Power
@ -653,10 +652,8 @@ accessibility = Доступність
.unavailable = Недоступно .unavailable = Недоступно
.screen-reader = Екранний читач .screen-reader = Екранний читач
.high-contrast = Висока контрастність .high-contrast = Висока контрастність
.invert-colors = Інверсія кольорів .invert-colors = Інвертація кольорів
.color-filters = Фільтри кольорів .color-filters = Фільтри кольорів
.shake-cursor = Потрусіть вказівником, щоб знайти його
.shake-cursor-desc = Швидко потрусіть мишею, щоби тимчасово збільшити вказівник
hearing = Слух hearing = Слух
.mono = Відтворювати стерео звук у моно .mono = Відтворювати стерео звук у моно
default = Типовий default = Типовий

View file

@ -184,8 +184,6 @@ accessibility = 无障碍
.high-contrast = 高对比度模式 .high-contrast = 高对比度模式
.invert-colors = 颜色反转 .invert-colors = 颜色反转
.color-filters = 色彩滤镜 .color-filters = 色彩滤镜
.shake-cursor = 晃动指针来寻找它
.shake-cursor-desc = 快速晃动鼠标以暂时放大指标
hearing = 听觉 hearing = 听觉
.mono = 播放立体声音频为单声道 .mono = 播放立体声音频为单声道
default = 默认 default = 默认
@ -488,7 +486,6 @@ sound-alerts = 警告音
.sound = 警告音效 .sound = 警告音效
sound-applications = 应用程序 sound-applications = 应用程序
.desc = 应用程序音量和设置 .desc = 应用程序音量和设置
.none = 没有任何应用程序正在使用声音
## Power ## Power

View file

@ -124,8 +124,6 @@ accessibility = 無障礙功能
.high-contrast = 高對比模式 .high-contrast = 高對比模式
.invert-colors = 反轉顏色 .invert-colors = 反轉顏色
.color-filters = 色彩濾鏡 .color-filters = 色彩濾鏡
.shake-cursor = 晃動指標以能找到所在
.shake-cursor-desc = 快速晃動游標來暫時性地放大指標
hearing = 聽覺 hearing = 聽覺
.mono = 將立體聲播放為單聲道 .mono = 將立體聲播放為單聲道
default = 預設 default = 預設
@ -428,7 +426,6 @@ sound-alerts = 提示音
.sound = 提示音音效 .sound = 提示音音效
sound-applications = 應用程式 sound-applications = 應用程式
.desc = 應用程式音量與設定 .desc = 應用程式音量與設定
.none = 無應用程式使用音效
## Power ## Power

View file

@ -1,6 +1,6 @@
[package] [package]
name = "cosmic-settings-page" name = "cosmic-settings-page"
version = "1.7.0" version = "1.0.7"
edition = "2024" edition = "2024"
[dependencies] [dependencies]

View file

@ -1,6 +1,6 @@
[package] [package]
name = "cosmic-settings-sound" name = "cosmic-settings-sound"
version = "1.7.0" version = "0.1.0"
edition = "2024" edition = "2024"
rust-version.workspace = true rust-version.workspace = true

View file

@ -1,6 +1,6 @@
[package] [package]
name = "cosmic-settings-wallpaper" name = "cosmic-settings-wallpaper"
version = "1.7.0" version = "1.0.7"
edition = "2024" edition = "2024"
rust-version.workspace = true rust-version.workspace = true

View file

@ -1,3 +1,3 @@
[toolchain] [toolchain]
channel = "1.95.0" channel = "1.93.0"
components = ["clippy", "rustfmt"] components = ["clippy", "rustfmt"]

View file

@ -1,6 +1,6 @@
[package] [package]
name = "cosmic-settings-a11y-manager-subscription" name = "cosmic-settings-a11y-manager-subscription"
version = "1.7.0" version = "1.0.7"
edition = "2024" edition = "2024"
license = "MPL-2.0" license = "MPL-2.0"
rust-version.workspace = true rust-version.workspace = true

View file

@ -1,6 +1,6 @@
[package] [package]
name = "cosmic-settings-accessibility-subscription" name = "cosmic-settings-accessibility-subscription"
version = "1.7.0" version = "1.0.7"
edition = "2024" edition = "2024"
license = "MPL-2.0" license = "MPL-2.0"
rust-version.workspace = true rust-version.workspace = true

View file

@ -1,6 +1,6 @@
[package] [package]
name = "cosmic-settings-airplane-mode-subscription" name = "cosmic-settings-airplane-mode-subscription"
version = "1.7.0" version = "1.0.7"
edition = "2024" edition = "2024"
license = "MPL-2.0" license = "MPL-2.0"
rust-version.workspace = true rust-version.workspace = true

View file

@ -1,6 +1,6 @@
[package] [package]
name = "cosmic-settings-bluetooth-subscription" name = "cosmic-settings-bluetooth-subscription"
version = "1.7.0" version = "1.0.7"
edition = "2024" edition = "2024"
license = "MPL-2.0" license = "MPL-2.0"
rust-version.workspace = true rust-version.workspace = true

View file

@ -1,6 +1,6 @@
[package] [package]
name = "cosmic-settings-daemon-subscription" name = "cosmic-settings-daemon-subscription"
version = "1.7.0" version = "1.0.7"
edition = "2024" edition = "2024"
rust-version.workspace = true rust-version.workspace = true
publish = true publish = true

View file

@ -1,6 +1,6 @@
[package] [package]
name = "cosmic-settings-upower-subscription" name = "cosmic-settings-upower-subscription"
version = "1.7.0" version = "1.0.7"
edition = "2024" edition = "2024"
license = "MPL-2.0" license = "MPL-2.0"
rust-version.workspace = true rust-version.workspace = true