增加支持使用light-dark()
输出CSS自定义属性的功能。
This commit is contained in:
parent
7fba372d08
commit
dfbbe2b884
|
@ -81,6 +81,22 @@ impl M2BaselineColors {
|
|||
variable_lines
|
||||
}
|
||||
|
||||
pub fn to_css_auto_scheme_collection(&self) -> HashMap<String, String> {
|
||||
let mut variables = HashMap::new();
|
||||
|
||||
variables.extend(self.primary.to_css_auto_scheme_collection("primary"));
|
||||
variables.extend(self.secondary.to_css_auto_scheme_collection("secondary"));
|
||||
variables.extend(self.error.to_css_auto_scheme_collection("error"));
|
||||
variables.extend(self.background.to_css_auto_scheme_collection("background"));
|
||||
variables.extend(self.surface.to_css_auto_scheme_collection("surface"));
|
||||
variables.insert("shadow".to_string(), self.shadow.clone());
|
||||
for (name, color_set) in &self.custom_colors {
|
||||
variables.extend(color_set.to_css_auto_scheme_collection(&name.to_lowercase()));
|
||||
}
|
||||
|
||||
variables
|
||||
}
|
||||
|
||||
pub fn to_scss_variable(&self) -> Vec<String> {
|
||||
let mut variable_lines = Vec::new();
|
||||
let prefix = if self.dark_set { "dark" } else { "light" };
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use serde::Serialize;
|
||||
|
||||
use crate::{convert::map_hsl_to_srgb_hex, errors};
|
||||
|
@ -82,6 +84,16 @@ impl M2ColorSet {
|
|||
variable_lines
|
||||
}
|
||||
|
||||
pub fn to_css_auto_scheme_collection(&self, name: &str) -> HashMap<String, String> {
|
||||
let mut variables = HashMap::new();
|
||||
|
||||
variables.insert(format!("{}", name), self.root.clone());
|
||||
variables.insert(format!("{}-variant", name), self.variant.clone());
|
||||
variables.insert(format!("on-{}", name), self.on.clone());
|
||||
|
||||
variables
|
||||
}
|
||||
|
||||
pub fn to_scss_variable(&self, prefix: &str, name: &str) -> Vec<String> {
|
||||
let mut variable_lines = Vec::new();
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use std::collections::HashSet;
|
||||
|
||||
use baseline::M2BaselineColors;
|
||||
use palette::Hsl;
|
||||
use serde::Serialize;
|
||||
|
@ -48,6 +50,34 @@ impl SchemeExport for MaterialDesign2Scheme {
|
|||
css_variables.join("\n")
|
||||
}
|
||||
|
||||
fn output_css_auto_scheme_variables(&self) -> String {
|
||||
let mut auto_scheme_variables = Vec::new();
|
||||
let mut keys = HashSet::new();
|
||||
let light_baseline = self.light.to_css_auto_scheme_collection();
|
||||
let dark_baseline = self.dark.to_css_auto_scheme_collection();
|
||||
|
||||
auto_scheme_variables.push(format!("--color-white: #{};", self.white));
|
||||
auto_scheme_variables.push(format!("--color-black: #{};", self.black));
|
||||
|
||||
keys.extend(light_baseline.keys());
|
||||
keys.extend(dark_baseline.keys());
|
||||
for key in keys {
|
||||
match (light_baseline.get(key), dark_baseline.get(key)) {
|
||||
(Some(light), Some(dark)) => {
|
||||
auto_scheme_variables.push(format!(
|
||||
"--color-{}: light-dark(#{}, #{}):",
|
||||
key, light, dark
|
||||
));
|
||||
}
|
||||
(Some(color), None) | (None, Some(color)) => {
|
||||
auto_scheme_variables.push(format!("--color-{}: #{};", key, color));
|
||||
}
|
||||
(None, None) => {}
|
||||
}
|
||||
}
|
||||
auto_scheme_variables.join("\n")
|
||||
}
|
||||
|
||||
fn output_scss_variables(&self) -> String {
|
||||
let mut scss_variables = Vec::new();
|
||||
|
||||
|
|
|
@ -131,6 +131,25 @@ impl M3BaselineColors {
|
|||
css_variables
|
||||
}
|
||||
|
||||
pub fn to_css_auto_scheme_collection(&self) -> HashMap<String, String> {
|
||||
let mut collection = HashMap::new();
|
||||
|
||||
collection.extend(self.primary.to_css_auto_scheme_collection("primary"));
|
||||
collection.extend(self.secondary.to_css_auto_scheme_collection("secondary"));
|
||||
collection.extend(self.tertiary.to_css_auto_scheme_collection("tertiary"));
|
||||
collection.extend(self.error.to_css_auto_scheme_collection("error"));
|
||||
collection.extend(self.surface.to_css_auto_scheme_collection());
|
||||
collection.insert("outline".to_string(), self.outline.clone());
|
||||
collection.insert("outline-variant".to_string(), self.outline_variant.clone());
|
||||
collection.insert("scrim".to_string(), self.scrim.clone());
|
||||
collection.insert("shadow".to_string(), self.shadow.clone());
|
||||
for (name, color_set) in &self.customs {
|
||||
collection.extend(color_set.to_css_auto_scheme_collection(&name.to_lowercase()));
|
||||
}
|
||||
|
||||
collection
|
||||
}
|
||||
|
||||
pub fn to_scss_variables(&self) -> Vec<String> {
|
||||
let mut scss_variables = Vec::new();
|
||||
let prefix = if self.dark_set { "dark" } else { "light" };
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use serde::Serialize;
|
||||
|
||||
use crate::convert::map_lch_to_srgb_hex;
|
||||
|
@ -106,6 +108,25 @@ impl M3ColorSet {
|
|||
variable_lines
|
||||
}
|
||||
|
||||
pub fn to_css_auto_scheme_collection(&self, name: &str) -> HashMap<String, String> {
|
||||
let mut variables = HashMap::new();
|
||||
|
||||
variables.insert(format!("{}", name), self.root.clone());
|
||||
variables.insert(format!("on-{}", name), self.on_root.clone());
|
||||
variables.insert(format!("{}-container", name), self.container.clone());
|
||||
variables.insert(format!("on-{}-container", name), self.on_container.clone());
|
||||
variables.insert(format!("{}-fixed", name), self.fixed.clone());
|
||||
variables.insert(format!("{}-fixed-dim", name), self.fixed_dim.clone());
|
||||
variables.insert(format!("on-{}-fixed", name), self.on_fixed.clone());
|
||||
variables.insert(
|
||||
format!("on-{}-fixed-variant", name),
|
||||
self.fixed_variant.clone(),
|
||||
);
|
||||
variables.insert(format!("inverse-{}", name), self.inverse.clone());
|
||||
|
||||
variables
|
||||
}
|
||||
|
||||
pub fn to_scss_variables(&self, prefix: &str, name: &str) -> Vec<String> {
|
||||
let mut variable_lines = Vec::new();
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use std::collections::HashMap;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::str::FromStr;
|
||||
|
||||
pub use baseline::M3BaselineColors;
|
||||
|
@ -111,6 +111,37 @@ impl SchemeExport for MaterialDesign3Scheme {
|
|||
css_variables.join("\n")
|
||||
}
|
||||
|
||||
fn output_css_auto_scheme_variables(&self) -> String {
|
||||
let mut auto_scheme_variables = Vec::new();
|
||||
let mut keys = HashSet::new();
|
||||
let light_baseline = self.light_baseline.to_css_auto_scheme_collection();
|
||||
let dark_baseline = self.dark_baseline.to_css_auto_scheme_collection();
|
||||
|
||||
auto_scheme_variables.push(format!("--color-white: #{};", self.white));
|
||||
auto_scheme_variables.push(format!("--color-black: #{};", self.black));
|
||||
keys.extend(light_baseline.keys());
|
||||
keys.extend(dark_baseline.keys());
|
||||
for key in keys {
|
||||
match (light_baseline.get(key), dark_baseline.get(key)) {
|
||||
(Some(light), Some(dark)) => {
|
||||
auto_scheme_variables.push(format!(
|
||||
"--color-{}: light-dark(#{}, #{}):",
|
||||
key, light, dark
|
||||
));
|
||||
}
|
||||
(Some(color), None) | (None, Some(color)) => {
|
||||
auto_scheme_variables.push(format!("--color-{}: #{};", key, color));
|
||||
}
|
||||
(None, None) => {}
|
||||
}
|
||||
}
|
||||
for (name, swatch) in &self.swatches {
|
||||
auto_scheme_variables.extend(swatch.to_css_variables(name));
|
||||
}
|
||||
|
||||
auto_scheme_variables.join("\n")
|
||||
}
|
||||
|
||||
fn output_scss_variables(&self) -> String {
|
||||
let mut scss_variables = Vec::new();
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use serde::Serialize;
|
||||
|
||||
use crate::convert::map_lch_to_srgb_hex;
|
||||
|
@ -136,6 +138,35 @@ impl M3SurfaceSet {
|
|||
css_variables
|
||||
}
|
||||
|
||||
pub fn to_css_auto_scheme_collection(&self) -> HashMap<String, String> {
|
||||
let mut auto_scheme_collection = HashMap::new();
|
||||
|
||||
auto_scheme_collection.insert(format!("surface"), self.root.clone());
|
||||
auto_scheme_collection.insert(format!("surface-dim"), self.dim.clone());
|
||||
auto_scheme_collection.insert(format!("surface-bright"), self.bright.clone());
|
||||
auto_scheme_collection.insert(format!("surface-variant"), self.variant.clone());
|
||||
auto_scheme_collection.insert(format!("surface-container"), self.container.clone());
|
||||
auto_scheme_collection.insert(
|
||||
format!("surface-container-lowest"),
|
||||
self.container_lowest.clone(),
|
||||
);
|
||||
auto_scheme_collection.insert(format!("surface-container-low"), self.container_low.clone());
|
||||
auto_scheme_collection.insert(
|
||||
format!("surface-container-high"),
|
||||
self.container_high.clone(),
|
||||
);
|
||||
auto_scheme_collection.insert(
|
||||
format!("surface-container-highest"),
|
||||
self.container_highest.clone(),
|
||||
);
|
||||
auto_scheme_collection.insert(format!("on-surface"), self.on_root.clone());
|
||||
auto_scheme_collection.insert(format!("on-surface-variant"), self.on_root_variant.clone());
|
||||
auto_scheme_collection.insert(format!("inverse-surface"), self.inverse.clone());
|
||||
auto_scheme_collection.insert(format!("inverse-on-surface"), self.on_inverse.clone());
|
||||
|
||||
auto_scheme_collection
|
||||
}
|
||||
|
||||
pub fn to_scss_variables(&self, prefix: &str) -> Vec<String> {
|
||||
let mut scss_variables = Vec::new();
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ pub mod swatch_style;
|
|||
|
||||
pub trait SchemeExport {
|
||||
fn output_css_variables(&self) -> String;
|
||||
fn output_css_auto_scheme_variables(&self) -> String;
|
||||
fn output_scss_variables(&self) -> String;
|
||||
fn output_javascript_object(&self) -> String;
|
||||
}
|
||||
|
@ -36,6 +37,7 @@ pub fn generate_material_design_3_scheme(
|
|||
Ok(serde_wasm_bindgen::to_value(&(
|
||||
scheme.clone(),
|
||||
scheme.output_css_variables(),
|
||||
scheme.output_css_auto_scheme_variables(),
|
||||
scheme.output_scss_variables(),
|
||||
scheme.output_javascript_object(),
|
||||
))
|
||||
|
@ -58,6 +60,7 @@ pub fn generate_material_design_2_scheme(
|
|||
Ok(serde_wasm_bindgen::to_value(&(
|
||||
scheme.clone(),
|
||||
scheme.output_css_variables(),
|
||||
scheme.output_css_auto_scheme_variables(),
|
||||
scheme.output_scss_variables(),
|
||||
scheme.output_javascript_object(),
|
||||
))
|
||||
|
@ -88,6 +91,7 @@ pub fn generate_q_scheme_automatically(
|
|||
Ok(serde_wasm_bindgen::to_value(&(
|
||||
scheme.clone(),
|
||||
scheme.output_css_variables(),
|
||||
scheme.output_css_auto_scheme_variables(),
|
||||
scheme.output_scss_variables(),
|
||||
scheme.output_javascript_object(),
|
||||
))
|
||||
|
@ -124,6 +128,7 @@ pub fn generate_q_scheme_manually(
|
|||
Ok(serde_wasm_bindgen::to_value(&(
|
||||
scheme.clone(),
|
||||
scheme.output_css_variables(),
|
||||
scheme.output_css_auto_scheme_variables(),
|
||||
scheme.output_scss_variables(),
|
||||
scheme.output_javascript_object(),
|
||||
))
|
||||
|
@ -139,6 +144,7 @@ pub fn generate_swatch_scheme(
|
|||
Ok(serde_wasm_bindgen::to_value(&(
|
||||
scheme.swatches(),
|
||||
scheme.output_css_variables(),
|
||||
scheme.output_css_auto_scheme_variables(),
|
||||
scheme.output_scss_variables(),
|
||||
scheme.output_javascript_object(),
|
||||
))
|
||||
|
@ -186,6 +192,7 @@ pub fn generate_material_design_3_dynamic_scheme(
|
|||
Ok(serde_wasm_bindgen::to_value(&(
|
||||
scheme.clone(),
|
||||
scheme.output_css_variables(),
|
||||
scheme.output_css_auto_scheme_variables(),
|
||||
scheme.output_scss_variables(),
|
||||
scheme.output_javascript_object(),
|
||||
))
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use palette::{
|
||||
color_theory::{Analogous, Complementary, SplitComplementary, Tetradic, Triadic},
|
||||
Oklch, ShiftHue,
|
||||
|
@ -158,6 +160,37 @@ impl Baseline {
|
|||
variables
|
||||
}
|
||||
|
||||
pub fn to_css_auto_scheme_collection(&self) -> HashMap<String, String> {
|
||||
let mut collection = HashMap::new();
|
||||
|
||||
collection.extend(self.primary.to_css_auto_scheme_collection("primary"));
|
||||
if let Some(secondary) = &self.secondary {
|
||||
collection.extend(secondary.to_css_auto_scheme_collection("secondary"));
|
||||
}
|
||||
if let Some(tertiary) = &self.tertiary {
|
||||
collection.extend(tertiary.to_css_auto_scheme_collection("tertiary"));
|
||||
}
|
||||
if let Some(accent) = &self.accent {
|
||||
collection.extend(accent.to_css_auto_scheme_collection("accent"));
|
||||
}
|
||||
collection.extend(self.neutral.to_css_auto_scheme_collection("neutral"));
|
||||
collection.extend(self.danger.to_css_auto_scheme_collection("danger"));
|
||||
collection.extend(self.success.to_css_auto_scheme_collection("success"));
|
||||
collection.extend(self.warning.to_css_auto_scheme_collection("warning"));
|
||||
collection.extend(self.info.to_css_auto_scheme_collection("info"));
|
||||
collection.extend(self.outline.to_css_auto_scheme_collection("outline"));
|
||||
collection.insert(
|
||||
"foreground".to_string(),
|
||||
map_oklch_to_srgb_hex(&self.foreground),
|
||||
);
|
||||
collection.insert(
|
||||
"background".to_string(),
|
||||
map_oklch_to_srgb_hex(&self.background),
|
||||
);
|
||||
|
||||
collection
|
||||
}
|
||||
|
||||
pub fn to_scss_variables(&self, prefix: &str) -> Vec<String> {
|
||||
let mut variables = Vec::new();
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use palette::{color_difference::Wcag21RelativeContrast, luma::Luma, Oklch};
|
||||
use serde::{ser::SerializeStruct, Serialize};
|
||||
|
||||
|
@ -179,6 +181,47 @@ impl ColorSet {
|
|||
variables
|
||||
}
|
||||
|
||||
pub fn to_css_auto_scheme_collection(&self, name: &str) -> HashMap<String, String> {
|
||||
let mut collection = HashMap::new();
|
||||
|
||||
collection.insert(format!("{}", name), map_oklch_to_srgb_hex(&self.root));
|
||||
collection.insert(
|
||||
format!("{}-hover", name),
|
||||
map_oklch_to_srgb_hex(&self.hover),
|
||||
);
|
||||
collection.insert(
|
||||
format!("{}-active", name),
|
||||
map_oklch_to_srgb_hex(&self.active),
|
||||
);
|
||||
collection.insert(
|
||||
format!("{}-focus", name),
|
||||
map_oklch_to_srgb_hex(&self.focus),
|
||||
);
|
||||
collection.insert(
|
||||
format!("{}-disabled", name),
|
||||
map_oklch_to_srgb_hex(&self.disabled),
|
||||
);
|
||||
collection.insert(format!("on-{}", name), map_oklch_to_srgb_hex(&self.on_root));
|
||||
collection.insert(
|
||||
format!("on-{}-hover", name),
|
||||
map_oklch_to_srgb_hex(&self.on_hover),
|
||||
);
|
||||
collection.insert(
|
||||
format!("on-{}-active", name),
|
||||
map_oklch_to_srgb_hex(&self.on_active),
|
||||
);
|
||||
collection.insert(
|
||||
format!("on-{}-focus", name),
|
||||
map_oklch_to_srgb_hex(&self.on_focus),
|
||||
);
|
||||
collection.insert(
|
||||
format!("on-{}-disabled", name),
|
||||
map_oklch_to_srgb_hex(&self.on_disabled),
|
||||
);
|
||||
|
||||
collection
|
||||
}
|
||||
|
||||
pub fn to_scss_variables(&self, prefix: &str, name: &str) -> Vec<String> {
|
||||
let mut variables = Vec::new();
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use std::str::FromStr;
|
||||
use std::{collections::HashSet, str::FromStr};
|
||||
|
||||
use baseline::Baseline;
|
||||
use palette::FromColor;
|
||||
|
@ -130,6 +130,32 @@ impl SchemeExport for QScheme {
|
|||
variables.join("\n")
|
||||
}
|
||||
|
||||
fn output_css_auto_scheme_variables(&self) -> String {
|
||||
let mut collection = Vec::new();
|
||||
let mut keys = HashSet::new();
|
||||
let light_collection = self.light.to_css_auto_scheme_collection();
|
||||
let dark_collection = self.dark.to_css_auto_scheme_collection();
|
||||
|
||||
keys.extend(light_collection.keys());
|
||||
keys.extend(dark_collection.keys());
|
||||
for key in keys {
|
||||
match (light_collection.get(key), dark_collection.get(key)) {
|
||||
(Some(light), Some(dark)) => {
|
||||
collection.push(format!(
|
||||
"--color-{}: light-dark(#{}, #{});",
|
||||
key, light, dark
|
||||
));
|
||||
}
|
||||
(Some(color), None) | (None, Some(color)) => {
|
||||
collection.push(format!("--color-{}: #{}", key, color));
|
||||
}
|
||||
(None, None) => {}
|
||||
}
|
||||
}
|
||||
|
||||
collection.join("\n")
|
||||
}
|
||||
|
||||
fn output_scss_variables(&self) -> String {
|
||||
let mut variables = Vec::new();
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use palette::FromColor;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::collections::HashMap;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::str::FromStr;
|
||||
|
||||
pub use setting::SwatchSchemeSetting;
|
||||
|
@ -93,6 +93,49 @@ impl SchemeExport for SwatchScheme {
|
|||
variables.join("\n")
|
||||
}
|
||||
|
||||
fn output_css_auto_scheme_variables(&self) -> String {
|
||||
let mut variables = Vec::new();
|
||||
let mut keys = HashSet::new();
|
||||
let mut names = HashSet::new();
|
||||
let mut light_collections = HashMap::new();
|
||||
let mut dark_collections = HashMap::new();
|
||||
|
||||
names.extend(self.light.keys());
|
||||
names.extend(self.dark.keys());
|
||||
|
||||
for (name, swatch) in &self.light {
|
||||
let collection = swatch.to_css_auto_scheme_collection(&name);
|
||||
keys.extend(collection.keys().cloned());
|
||||
light_collections.insert(name.clone(), collection.clone());
|
||||
}
|
||||
for (name, swatch) in &self.dark {
|
||||
let collection = swatch.to_css_auto_scheme_collection(&name);
|
||||
keys.extend(collection.keys().cloned());
|
||||
dark_collections.insert(name.clone(), collection.clone());
|
||||
}
|
||||
|
||||
for name in names {
|
||||
for key in keys.iter() {
|
||||
match (
|
||||
light_collections.get(name).and_then(|lc| lc.get(key)),
|
||||
dark_collections.get(name).and_then(|dc| dc.get(key)),
|
||||
) {
|
||||
(Some(light), Some(dark)) => {
|
||||
variables.push(format!(
|
||||
"--color-{}-{}: light-dark(#{}, #{});",
|
||||
name, key, light, dark
|
||||
));
|
||||
}
|
||||
(Some(color), None) | (None, Some(color)) => {
|
||||
variables.push(format!("--color-{}-{}: #{};", name, key, color));
|
||||
}
|
||||
(None, None) => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
variables.join("\n")
|
||||
}
|
||||
|
||||
fn output_scss_variables(&self) -> String {
|
||||
let mut variables = Vec::new();
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use palette::Oklch;
|
||||
|
||||
use crate::convert::map_oklch_to_srgb_hex;
|
||||
|
@ -94,6 +96,17 @@ impl Swatch {
|
|||
variables
|
||||
}
|
||||
|
||||
pub fn to_css_auto_scheme_collection(&self, name: &str) -> HashMap<String, String> {
|
||||
let mut collection = HashMap::new();
|
||||
for (i, color) in self.swatch().iter().enumerate() {
|
||||
collection.insert(
|
||||
format!("{}-{}", name, i * 100),
|
||||
map_oklch_to_srgb_hex(color),
|
||||
);
|
||||
}
|
||||
collection
|
||||
}
|
||||
|
||||
pub fn to_scss_variables(&self, prefix: &str, name: &str) -> Vec<String> {
|
||||
let mut variables = Vec::new();
|
||||
for (i, color) in self.swatch().iter().enumerate() {
|
||||
|
|
Loading…
Reference in New Issue
Block a user