chore: initial studio-theme-sunflower 0.1.0

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-06-02 01:35:53 +02:00
commit df89d9ae79
9 changed files with 196 additions and 0 deletions

93
src/lib.rs Normal file
View file

@ -0,0 +1,93 @@
//! `studio.theme.sunflower` — warm, optimistic Studio theme.
//!
//! Yellow / amber / cream tones designed to feel like working
//! at a sunlit kitchen table. Pairs a saturated amber primary
//! with deep walnut text in light mode; a golden-amber primary
//! over a near-black surface in dark mode.
#![allow(clippy::result_large_err)]
use fai_plugin_sdk::{bindings, export_plugin};
type ColorScheme = bindings::fai::studio_plugin::plugin_types::ColorScheme;
type PluginError = bindings::fai::studio_plugin::plugin_types::PluginError;
type RenderedOutput = bindings::fai::studio_plugin::plugin_types::RenderedOutput;
/// 14 ARGB tokens, Material 3 order. See the SDK docs for
/// the canonical slot ordering.
const SUNFLOWER_LIGHT: [u32; 14] = [
0xFFFFB300, // primary — amber 600
0xFF1B1300, // on_primary — espresso
0xFFFF6F00, // secondary — orange 900
0xFF1B1300, // on_secondary
0xFF8BC34A, // tertiary — leaf green
0xFF1B2900, // on_tertiary
0xFFC62828, // error
0xFFFFFFFF, // on_error
0xFFFFFAF0, // surface — floral white
0xFF2C1F00, // on_surface — dark walnut
0xFFFFF3D6, // surface_variant — light cream
0xFF6B4F00, // on_surface_variant
0xFFC9A86B, // outline
0xFFE6D6A8, // outline_variant
];
const SUNFLOWER_DARK: [u32; 14] = [
0xFFFFCA28, // primary — amber 400
0xFF2C1F00, // on_primary
0xFFFFA726, // secondary — orange 400
0xFF2C1F00, // on_secondary
0xFFAED581, // tertiary — light green 300
0xFF1B2900, // on_tertiary
0xFFEF5350, // error
0xFF2C0000, // on_error
0xFF1F1700, // surface — deep amber-brown
0xFFFFE7A8, // on_surface
0xFF332507, // surface_variant
0xFFC9A86B, // on_surface_variant
0xFF806E40, // outline
0xFF4A3D14, // outline_variant
];
struct SunflowerPlugin;
impl bindings::exports::fai::studio_plugin::theme::Guest for SunflowerPlugin {
fn theme_for(brightness: String) -> Result<ColorScheme, PluginError> {
let tokens = match brightness.as_str() {
"light" => SUNFLOWER_LIGHT.to_vec(),
"dark" => SUNFLOWER_DARK.to_vec(),
other => {
return Err(PluginError::Declined(format!(
"sunflower has no scheme for brightness '{other}' \
(supported: light, dark)"
)));
}
};
Ok(ColorScheme { brightness, tokens })
}
}
impl bindings::exports::fai::studio_plugin::translate::Guest for SunflowerPlugin {
fn translate(
_text: String,
_from_locale: String,
_to_locale: String,
) -> Result<String, PluginError> {
Err(PluginError::Declined(
"sunflower is a theme plugin and does not translate".to_string(),
))
}
}
impl bindings::exports::fai::studio_plugin::output_view::Guest for SunflowerPlugin {
fn render(
_mime_type: String,
_data: Vec<u8>,
) -> Result<RenderedOutput, PluginError> {
Err(PluginError::Declined(
"sunflower is a theme plugin and does not render outputs".to_string(),
))
}
}
export_plugin!(SunflowerPlugin);