From 7212a58ba5fe002617f2377a3171b928eb4b9f52 Mon Sep 17 00:00:00 2001 From: flemming-it Date: Tue, 2 Jun 2026 01:35:53 +0200 Subject: [PATCH] chore: initial studio-theme-accessibility 0.1.0 Signed-off-by: flemming-it --- .gitignore | 2 + Cargo.toml | 32 +++++++++++++++ MODULE.de.md | 8 ++++ MODULE.md | 20 ++++++++++ README.md | 22 +++++++++++ module.wasm | Bin 0 -> 53628 bytes module.yaml | 17 ++++++++ rust-toolchain.toml | 4 ++ src/lib.rs | 94 ++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 199 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 MODULE.de.md create mode 100644 MODULE.md create mode 100644 README.md create mode 100644 module.wasm create mode 100644 module.yaml create mode 100644 rust-toolchain.toml create mode 100644 src/lib.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c96eb1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target/ +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..9cc9c87 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,32 @@ +# Standalone Cargo.toml — targets wasm32-wasip2. +# +# Build: +# cargo build --release --target wasm32-wasip2 +# +# Output: target/wasm32-wasip2/release/studio_theme_accessibility.wasm + +[package] +name = "studio_theme_accessibility" +version = "0.1.0" +edition = "2021" +authors = ["Dr. Stefan Flemming "] +license = "Apache-2.0" +publish = false +description = "F∆I Studio plugin — WCAG AA high-contrast Studio theme." +repository = "https://git.flemming.ai/fai-plugins/studio-theme-accessibility" +rust-version = "1.85" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +fai-plugin-sdk = { path = "../../fai_plugin_sdk_rust" } + +[package.metadata.component] +package = "fai:studio-plugin" + +[profile.release] +opt-level = "s" +lto = true +codegen-units = 1 +strip = true diff --git a/MODULE.de.md b/MODULE.de.md new file mode 100644 index 0000000..dc2f84c --- /dev/null +++ b/MODULE.de.md @@ -0,0 +1,8 @@ +# accessibility + +Barrierefreies WCAG-AA-Theme mit starkem Kontrast. + +Eines der mit F∆I Studio gelieferten Theme-Plugins. Nach +Installation erscheint es unter **Einstellungen → Themes** +neben den eingebauten Hell- und Dunkel-Themes. Auswahl +schaltet die gesamte Studio-Oberfläche um — ohne Neustart. diff --git a/MODULE.md b/MODULE.md new file mode 100644 index 0000000..255dfe1 --- /dev/null +++ b/MODULE.md @@ -0,0 +1,20 @@ +# accessibility + +WCAG AA high-contrast Studio theme. + +This is one of F∆I Studio's bundled theme plugins. When +installed, it appears in **Settings → Themes** alongside the +built-in light and dark themes. Select it and the entire +Studio UI re-themes immediately — no restart required. + +## When to pick this theme + +- Operators with low vision or colour-vision deficiency +- Bright-sunlight outdoor / kiosk deployments +- Any deployment where the public sector's accessibility + rules demand a verified high-contrast option + +Every foreground/background pair meets WCAG 2.2 AA +(≥ 4.5:1 for normal text); on-surface pairs hit AAA. Pure +black + pure white surfaces; deep-navy or sky-blue +primary depending on brightness. diff --git a/README.md b/README.md new file mode 100644 index 0000000..55c094f --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# studio-theme-accessibility + +WCAG AA high-contrast Studio theme. + +Ships a Material 3 ColorScheme pair (light + dark) through +the WIT `theme` export. Studio loads it as a +`studio.theme.accessibility` capability and switches the app's +ColorScheme when the operator picks it from the themes +picker. + +## Build + +```bash +cargo build --release --target wasm32-wasip2 +``` + +Output: `target/wasm32-wasip2/release/studio_theme_accessibility.wasm`. + +## Palette + +See `src/lib.rs` for the 14 ARGB tokens per brightness, in +Material 3 order (primary → on_primary → … → outline_variant). diff --git a/module.wasm b/module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..c5f8de7dd52853bfa23702ba4d0b48183e215750 GIT binary patch literal 53628 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 cM!UPzXc+A(y+?iT)?I}x%Ly<~HxT*%0x6vW Result { + let tokens = match brightness.as_str() { + "light" => ACCESSIBILITY_LIGHT.to_vec(), + "dark" => ACCESSIBILITY_DARK.to_vec(), + other => { + return Err(PluginError::Declined(format!( + "accessibility has no scheme for brightness '{other}' \ + (supported: light, dark)" + ))); + } + }; + Ok(ColorScheme { brightness, tokens }) + } +} + +impl bindings::exports::fai::studio_plugin::translate::Guest for AccessibilityPlugin { + fn translate( + _text: String, + _from_locale: String, + _to_locale: String, + ) -> Result { + Err(PluginError::Declined( + "accessibility is a theme plugin and does not translate".to_string(), + )) + } +} + +impl bindings::exports::fai::studio_plugin::output_view::Guest for AccessibilityPlugin { + fn render( + _mime_type: String, + _data: Vec, + ) -> Result { + Err(PluginError::Declined( + "accessibility is a theme plugin and does not render outputs" + .to_string(), + )) + } +} + +export_plugin!(AccessibilityPlugin);